Elektrotekno.com Ana Sayfa || Programlanabilir Cihaz ve Elemanlar || Microchip Pic Serisi


SHT11' den PIC' e veri okuma

Açıklama:
Elektrik, Elektronik, Haberleşme ve Otomasyon konularının ağırlıklı olarak konuşulduğu, tartışıldığı ve bilgi paylaşımı yapıldığı forumumuza hoşgeldiniz.
Şu an Kod Paylaşım ve Soru Cevap Alanı kategorisi içerisindeki Microchip Pic Serisi forumunda bulunuyorsunuz.
Bu sayfada üyelerimizin "SHT11' den PIC' e veri okuma" konusundaki problem, görüş ve önerileri okuyabilir ayrıca konu hakkındaki doküman, resim, proje, devre ve programlara ücretsiz olarak ulaşabilirsiniz. Üye olduktan sonra sizler de konu hakkında sorular sorabilir ya da yorum ve paylaşım yaparak birikimlerinizi aktarabilirsiniz.
Forumdan tam olarak yararlanabilmek için üye olmayı unutmayınız!
Kayıt: 30 Hzr 2006
Mesajlar: 33
Konum: Türkiye
Offline
Nihat
Tarih: 16 10 2006 18:44

Arkadaşlar, SHT11' den PIC'e sıcaklık ve nem değerlerini okutmak istiyorum. PIC 16F877 kullandık, programı C dilinde yazdık, SHT11' den sıcaklık ve nem değerlerini PIC'e okutan C dilinde program konusunda başarılı olamadık, yardımcı olursanız çok memnun olurum, şimdiden teşekkür eder, çalışmalarınızda başarı ve kolaylıklar dilerim.
Kayıt: 22 Nis 2006
Mesajlar: 409

Offline
ete
Tarih: 16 10 2006 19:33

sht-11 okuma bölümünü basic de yazmıştım. ilk yazdığım bölüm basit komutlardan oluşuyor idi. sanırım bu kodları kolayca c diline çevirebilirsiniz.
********************************************************************************************
kontrol=%00000011 ' ısı ölçüm için, kontrol=%00000101 olursa rutubet ölçer
gosub komver
gosub olcumal
h1=c0
gosub cık
h0=c0
gosub cık
gosub ısıhesap
gosub ekran1
..
..
..


komver:
gosub t_start
w=128
trısa.0=0
trısa.1=0
bır:
ıf (kontrol & w)=w then '........if (kontrol and w)=w
bılgı=1
else
bılgı=0
endıf
clk=1:pauseus 5
clk=0:ıf w=1 then ıkı
w=w>>1:goto bır '............w=w>>1 w değerini 1 bit sağa kaydır
ıkı: bılgı=1:clk=1:trısa.0=1
tekrar: ıf bılgı=1 then tekrar
clk=0
return

t_start:
trısa.0=0:trısa.1=0
bılgı=1:clk=0:pauseus 2
clk=1:bılgı=0:pauseus 2
clk=0:clk=1:pauseus 2
bılgı=1:clk=0
return

olcumal:
for w=0 to 65535
ıf bılgı=0 then cık
next w:ıf bılgı=1 then
hata=1:endıf
'------------------------------byte oku ----------------------------------------
cık: c0=0
w=128 ' ilk byte okuma
trısa.0=1
uc: clk=1
ıf bılgı=1 then
c0=c0 | w '................c0=c0 or w demektir
endıf
clk=0:ıf w=1 then dort
w=w>>1:goto uc
dort: trısa.0=0
bılgı=0:clk=1
clk=0:bılgı=1
return
*************************************************************************************************

kolay gelsin
ete
Başa dön
Kayıt: 30 Hzr 2006
Mesajlar: 33
Konum: Türkiye
Offline
Nihat
Tarih: 18 10 2006 13:14

Teşekkürler verdiğiniz bilgi ve ilginiz için Ete ustam, saygılarımla.
Başa dön
Kayıt: 22 Nis 2006
Mesajlar: 409

Offline
ete
Tarih: 18 10 2006 13:17

Birşey değil. Hesap kısmını vermemiştim. Çünki ben 8 bit hesap ve zorlamalı 16 bit integer hesap yolu ile yapmıştım. C de float kullanabiliyorsunuz hatta double integer de var. Direkt data sheet deki formulü uygulayabilirsiniz sanırım.

Ete
Başa dön



Offline
zafzaf82
Misafir
Tarih: 13 02 2007 16:21

Kod


//////////////////////////SHT75.H///////////////////////////////////////////////
//                                                                           //
// Driver file for SHT75 Temperature & Humidity Sensor                       //
//                                                                           //
// ***** To initialise SHT75 sensor upon power up *****                      //
//                                                                           //
// Function : sht_init()                                                     //
// Return   : none                                                           //
//                                                                           //
//                                                                           //
// ***** To measure and caluculate SHT75 temp & real RH *****                //
//                                                                           //
// Function : sht_rd (temp, truehumid)                                       //
// Return   : temperature & true humidity in float values                    //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#define sht_data_pin   PIN_D3
#define sht_clk_pin    PIN_C4


//***** Function to alert SHT75 *****

void comstart (void)
{
 output_float(sht_data_pin);  //data high
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(2);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
}


//***** Function to write data to SHT75 *****

int1 comwrite (int8 iobyte)
{
 int8 i, mask = 0x80;
 int1 ack;

 //Shift out command
 delay_us(4);
 for(i=0; i<8; i++)
  {
   output_bit(sht_clk_pin, 0);                          //clk low
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high
   else output_bit(sht_data_pin, 0);                    //data low if MSB low
   delay_us(1);
   output_bit(sht_clk_pin, 1);                          //clk high
   delay_us(1);
   mask = mask >> 1;                                    //shift to next bit
  }

 //Shift in ack
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 ack = input(sht_data_pin);   //get ack bit
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 return(ack);
}


//***** Function to read data from SHT75 *****

int16 comread (void)
{
 int8 i;
 int16 iobyte = 0;
 const int16 mask0 = 0x0000;
 const int16 mask1 = 0x0001;

 //shift in MSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 0 bit
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_float(sht_data_pin);  //data high

 //shift in LSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 1 bit
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low

 return(iobyte);
}


//***** Function to wait for SHT75 reading *****

void comwait (void)
{
 int16 sht_delay;

 output_float(sht_data_pin);                     //data high
 output_bit(sht_clk_pin, 0);                     //clk low
 delay_us(1);
 for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms
  {
   if (!input(sht_data_pin)) break;              //if sht_data_pin low, SHT75 ready
   delay_us(10);
  }
}


//***** Function to reset SHT75 communication *****

void comreset (void)
{
 int8 i;

 output_float(sht_data_pin);    //data high
 output_bit(sht_clk_pin, 0);    //clk low
 delay_us(2);
 for(i=0; i<9; i++)
  {
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times
   delay_us(2);
   output_bit(sht_clk_pin, 0);
   delay_us(2);
 }
 comstart();
}


//***** Function to soft reset SHT75 *****

void sht_soft_reset (void)
{
 comreset();           //SHT75 communication reset
 comwrite(0x1e);       //send SHT75 reset command
 delay_ms(15);         //pause 15 ms
}


//***** Function to measure SHT75 temperature *****

int16 measuretemp (void)
{
 int1 ack;
 int16 iobyte;

 comstart();             //alert SHT75
 ack = comwrite(0x03);   //send measure temp command and read ack status
 if(ack == 1) return;
 comwait();              //wait for SHT75 measurement to complete
 iobyte = comread();     //read SHT75 temp data
 return(iobyte);
}


//***** Function to measure SHT75 RH *****

int16 measurehumid (void)
{
 int1 ack;
 int16 iobyte;

 comstart();            //alert SHT75
 ack = comwrite(0x05);  //send measure RH command and read ack status
 if(ack == 1) return;
 comwait();             //wait for SHT75 measurement to complete
 iobyte = comread();    //read SHT75 temp data
 return(iobyte);
}


//***** Function to calculate SHT75 temp & RH *****

void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
 float truehumid1, rh;

 //calculate temperature reading
 tc = ((float) temp * 0.01) - 40.0;

 //calculate Real RH reading
 rh = (float) humid;

 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;

 //calculate True RH reading
 rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}


//***** Function to measure & calculate SHT75 temp & RH *****

void sht_rd (float & temp, float & truehumid)
{
 int16 restemp, reshumid;
 float realhumid;
 restemp = 0; truehumid = 0;

 restemp = measuretemp();    //measure temp
 reshumid = measurehumid();  //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH
}


//***** Function to initialise SHT75 on power-up *****

void sht_init (void)
{
 comreset();    //reset SHT75
 delay_ms(20);  //delay for power-up
}


Test code
Kod


#include <16F877A.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include<lcd.c>
#include<sht75.c>

void main()
{
 float restemp, truehumid;
 lcd_init();
 sht_init();

 while(1)
 {
  sht_rd (restemp, truehumid);
  lcd_gotoxy(1,1);
  printf(lcd_putc, "Temp : %3.1f %cC   ", restemp, 223);
  printf(lcd_putc, "\nRH   : %3.1f %%   ", truehumid);
  delay_ms(500);        //delay 500 ms between reading to prevent self heating of sensor
 }
}

Başa dön
Kayıt: 05 Ekm 2005
Mesajlar: 27

Offline
cenkara
Tarih: 13 02 2007 22:38

Arkadaşlar bu ısı nem sensörünü İstabulda sürekli bulabilceğim
adres varmı .

Teşkkürler
Başa dön



SHT11' den PIC' e veri okuma


Benzer Konular

- PC den sht11 ile sıcaklık ve nem ölçme

- Sakarya Üniversitesi-Teknik Eğitim Fakültesi-Veri yapıları ve Alg.Final 2009
- sht11 ile sıcaklık-nem-dew poınt, full
- pic16f84A ile encoder okuma projesi (pic basic pro)
- vb6 ile rs232 den voltaj okuma
- eeprom'a yazma ve okuma c rutinleri
- GPRS modem ve veri yollama yardım
- PBP veri tanımlaması.
- rf ile veri göndereimi

- Otomatik sayaç okuma hakkında bilmeniz gereken herşey (ingilizce)

- Pic ile MMC Kart Okuma Yazma Kontrol Etme

Sitemize üyelik ve içeriğin indirilmesi tamamen ücretsizdir. Sitemizde paylaşılan tüm dokümanlar (Tezler, makaleler, ders notları, sınav soru cevaplar, projeler) paylaşımcıların bireysel çalışmaları olup telif hakları kendilerine aittir ya da açık bir şekilde kamusal alana yerleştirilmiş dokümanların birer kopyalarıdır. Kişilerin bireysel çalışmalarını sitemizde yüklemesinde, sitemizde paylaşıma teşvik eden puanlama sisteminin de etkisi büyüktür. Bunlara rağmen hala size ait olan ve burada bulunmasına izin vermediğiniz dokümanlar varsa iletişim bölümünden yöneticilere bildirmeniz durumunda derhal silineceklerdir.
Powered by phpBB | Translated by phpBB Türkiye | Ads by Google Adsense | Design by Crazy Bat based
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72