SHT11 3-4 derece yüksek ölçüyor

Başlatan tekosis, 19 Ocak 2012, 02:14:34

tekosis

Selamün aleyküm arkadaşlar. sht11 ile devre yapıyorum yazdığım program simülasyonda tam doğru olarak okuma yaparken gerçek hayatta devrem sıcaklığı yaklaşık 3-5 volt aralığında yüksek gösteriyor(oda sıcaklığını iki farklı termometre ile ölçüyorum). elimde iki tane sensör var birisi 3-4 derece diğer 5-6 derece yüksek ölçüyor. data uçları 10k ile pullup. sensör direk devreye lehimli kablolama yok, sensörün besleme uçlarına 100nf bağladım. acaba hata neden kaynaklanıyor olabilir. Yardımınızı bekliyorum arkadaşlar.

(forumca uzunca araştırma yaptım :) )
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Maxim

sensorun konumu nerede?
yani ana devreden biraz uzaktamı yoksa ısınan bir elemana yakınmı? etrafı açıkmı ?
birde yazılım hatası olabilir tabi

Okan AKÇA

iki sensörüde aynı kutunun icerisinde deneyin

Kabil ATICI

Veri kağıtlarında bu modül için +/-0.4 derecelik bir tolerans gösterilmiş.

Tabii bu sadece kalibre edildiği sıcaklık için geçerli.(25C) Sıcaklık bu değerin altına indikçe veya üstüne çıktıkça bu tolarans değeri artıyor. (veri kağıtları belirtiyor)

Galiba algılayıcıların içinde nem algılama bölümü ile ilgili bir ısıtıcı var. Bu elemanın ısı ölçümüne ne derece etkisi olur bilemem.
ambar7

fahri-

hatırladığım kadarıyla sht11 lerde 200ms nin altındaki ölçme tekrarlarında chip ısınıyor ve yanlış ölçüme sebep oluyor. 200 msn den tam emin değilim. datashette yazıyor bakılabilir.

tekosis

Alıntı yapılan: Maxim - 19 Ocak 2012, 07:31:00
sensorun konumu nerede?
yani ana devreden biraz uzaktamı yoksa ısınan bir elemana yakınmı? etrafı açıkmı ?
birde yazılım hatası olabilir tabi

evet problem buymuş sayın maxim. devrem bir numune kartı olduğu için derli toplu olsun dedim sensörü karta, kablosuz monte ettim. bundan dolayı işlemcinin sıcaklığından etkikeniyormuş. ama bu kadar fark olacağını tahmin edemediğimden sensörden şüphelenmişim. hepinizin ilgisine teşekkür ederim. Çalışmalarınızda başarılar diliyorum.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

Arkadaşlar yeni sorunum  ;D

Bu arada soruyu şu an öğrencilerimle birlikte yazıyorum  bana bakıyorlar :)

Devremizde -1 derece için yine 0 bilgisi üretiliyor. Bu simülasyonda da aynı şekilde. diğer dereceler doğru hesaplanırken -1 derecede sıkıntı var. acaba böyle bir şey başına gelen oldumu?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

skara1214

kodlarını  yazarsan yorum yapabiliriz diye düşünüyorum...
Herkes ölür ama herkes gerçekten yaşamaz

tekosis

sayın skara1214 yazdığınız hususta haklısınız tabi de yanımda öğrenciler vardı o arada kodları vermeyi unuttum :) kodlarım aşağıdaki gibidir. yorumlarınızı bekliyorum. 



devrenin programı;

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<lcd.c>
#include<sht75_3.c>

unsigned int16 sicaklik=0


void main()
{

int16 okunan_deger=0;

float restemp, truehumid  ;
lcd_init();
sht_init();
while(1)
{   
   sht_rd (restemp, truehumid);
   sicaklik=(unsigned int16)restemp;
   
   
   lcd_send_byte(0,0x01);
   lcd_gotoxy(1,1);
   printf(lcd_putc, "oknn:%lx",sicaklik);
   delay_ms(500);       
}
}


kullandığım SHT75_3.c dosyası içeriği


///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_d5
#define sht_clk_pin    PIN_d4

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

void comstart (void)
{
output_float(sht_data_pin);  //data high
output_low(sht_clk_pin);  //clk low
delay_us(2);
output_high(sht_clk_pin);  //clk high
delay_us(2);
output_low(sht_data_pin); //data low
delay_us(2);
output_low(sht_clk_pin);  //clk low
delay_us(5);
output_high(sht_clk_pin);  //clk high
delay_us(2);
output_float(sht_data_pin);  //data high
delay_us(2);
output_low(sht_clk_pin);  //clk low
}

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

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

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

//Shift in ack
output_low(sht_clk_pin);  //clk low
delay_us(2);
ack = input(sht_data_pin);   //get ack bit
output_high(sht_clk_pin);  //clk high
delay_us(2);
output_low(sht_clk_pin);  //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_high(sht_clk_pin);                //clk high
   delay_us(2);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_low(sht_clk_pin);                //clk low
   delay_us(2);
  }

//send ack 0 bit
output_low(sht_data_pin); //data low
delay_us(2);
output_high(sht_clk_pin);  //clk high
delay_us(5);
output_low(sht_clk_pin);  //clk low
delay_us(2);
output_float(sht_data_pin);  //data high

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

//send ack 1 bit
output_float(sht_data_pin);  //data high
delay_us(2);
output_high(sht_clk_pin);  //clk high
delay_us(5);
output_low(sht_clk_pin);  //clk low
return(iobyte);
}

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

void comwait (void)
{
int16 sht_delay;

output_float(sht_data_pin);                     //data high
output_low(sht_clk_pin);                     //clk low
delay_us(2);
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_low(sht_clk_pin);    //clk low
delay_us(5);
for(i=0; i<9; i++)
  {
   output_high(sht_clk_pin);  //toggle clk 9 times
   delay_us(5);
   output_low(sht_clk_pin);
   delay_us(5);
}
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 ***** // sıcaklık bilgisi okuyor

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 *****   // nem bilgisi okuyor

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 ***** // sıcaklık ve nem hesaplanıyor

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.1;//-1 için 3910 0 için 4010
                                   //-1  için 1111 0100 0110
//calculate Real RH reading       // 0  için 1111 1010 1010
rh = (float) humid;

rhlin = (rh * 0.0367) - (rh * rh * 0.00000159) -2.0468;

//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
}


İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

skara1214

proteusta kullandığınız pic 877a siz 877.h diye belirtmissiniz  ikisi birbirinden farklı picler .Kodda ayrıca 4 MHZ kristal kullanımsınız ama fuseslarda hs yazmıssınız o xt olacak.Bunlar ilk gördüğüm yanlışlar.
Herkes ölür ama herkes gerçekten yaşamaz