Proteus'ta Sht75 Sensörünü Kullanan varmı?

hesap19

Üye
Katılım
13 Ocak 2015
Mesajlar
94
Puanları
1
Yaş
27
Hocalarım merhaba. Bir sorunum var yardım edermisiniz?

SHT75 nem sıcaklık sensörünü kullanarak sıcaklık ve nem kontrol devresi yapmaya çalışıyorum.Simülasyon programı olarak proteus, pıc programlamak içinde CCS C dilini kullanıyorum.

Proteus'da devreyi çalıştırdığımda SHT75 sensörü nemi yüzde 81 gösterirken lcd ye bu değer yüzde 84.2 olarak yansıyor.Aynı şekilde ısıda da sensör 28 derece gösterirken bu değer lcd ye 27.7 derece olarak yansıyor.

Bu 0.3' lük değer farkı neden kaynaklanıyor bilmiyorum ama bana bir sorun teşkil eder mi? Herhangi bir çözümü olur mu?

Proteus'ta bu sensörü kullanıp dediğim hata ile karşılaşmayan varmı?Yardımcı olan herkese şimdiden teşekkür ederim.

jnqbyJ.jpg


Kod:
#include <16F877.h>
#device adc=8
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
 
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
 
#include <lcd.c>
 
#define sht_data_pin   PIN_b1//(Data pin veya input)
#define sht_clk_pin    PIN_b0
 
//***** SHT75 Başlatma *****
 
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
}
 
//***** SHT75 yazma fonksiyonu*****
 
int1 comwrite (int8 iobyte)
{
 int8 i, mask = 0x80;
 int1 ack;
 
 //Komut gönderilir
 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
}
void main()
{
 float restemp, truehumid;
 lcd_init();
sht_init();
 
 while(1)
 {
  sht_rd (restemp, truehumid);
  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
 }
}
 
Kod:
fprintf(lcd_putc,"\n\rSHT11SICAKLIK (C):    %.2g\r\n",restemp); //veya
printf(lcd_putc,"\n\rSHT11SICAKLIK (C):    %.2g\r\n",restemp);

fprintf(lcd_putc,"\n\rSHT11NEM (RH):        %.2g\r\n", truehumid);//veya
printf(lcd_putc,"\n\rSHT11NEM (RH):        %.2g\r\n", truehumid);

print çıktılarını .2g olarak deneyebilirsiniz.
birde bu driver sht11, 15 ve 75 için aynı yazılmış ve ayrıtedici registry ler illaki vardır.
sht75 datasheet inden register bit degerlerini kontrol etmenizde fayda var.
iyi çalışmalar
 
Kod:
fprintf(lcd_putc,"\n\rSHT11SICAKLIK (C):    %.2g\r\n",restemp); //veya
printf(lcd_putc,"\n\rSHT11SICAKLIK (C):    %.2g\r\n",restemp);

fprintf(lcd_putc,"\n\rSHT11NEM (RH):        %.2g\r\n", truehumid);//veya
printf(lcd_putc,"\n\rSHT11NEM (RH):        %.2g\r\n", truehumid);

print çıktılarını .2g olarak deneyebilirsiniz.
birde bu driver sht11, 15 ve 75 için aynı yazılmış ve ayrıtedici registry ler illaki vardır.
sht75 datasheet inden register bit degerlerini kontrol etmenizde fayda var.
iyi çalışmalar

Hocam öncelikle cevabınız için çok teşekkür ederim.
Öncelikle şunu belirteyim kodlama hakkında bilgim çok az.Asıl amacım bi nem vıcaklık kontrölü yapmaktı.Sht75 için bilgi ararken bu kodları buldum.Bu tarz devreler yapanlar hep aynı kodu kullanmış.Bir sürü devre şeması indirdim bu bahsettiğim hata hepsindede var.Sade bağzı devrelerde sht11 düzgün çalışabiliyor ama yerine sht75 getirince %4' nemde %1 veya %0.5 derecede hata yapıyor.
Bayadır araştırıyorum çözüm bulamadım.Genelde proteus hatalıdır diyolar.Bana pek öyle gelmedi.Sht11 hata yapmayıp sht75 de hata yapınca bi terslik var gibi.
Datasheet dosyasından bir şey anlayamadım.Sizin tavsiyenizi denedim;
Bu hatayı verdi.
IuWOlL.png



Kod:
printf(lcd_putc,"\n\r (C):    %.2g\r\n",restemp);  //veya
printf(lcd_putc,"\n\r (C):    %.2g\r\n",restemp);

printf(lcd_putc,"\n\r (RH):        %.2g\r\n", truehumid); //veya
printf(lcd_putc,"\n\r (RH):        %.2g\r\n", truehumid);

Hocam bu şekilde yaptım sonuç çok farklı oldu.Degeri lcd ye yazmadı.
Sonuç bu;

jH8lWL.png
 
Kod:
printf(lcd_putc,"SICAKLIK(C):%.2g",restemp);
printf(lcd_putc,"NEM(RH):%.2g", truehumid);

//veya <--- contenti eklemiştim yani 2sinden1 i olacak . sanıyorum birde aradaki boşlukları silmemişsiniz .
üstte yazan kodu yazabilirsiniz .2g yerine noktadan sonra kaç basamak isteniliyorsa 3 veya 4 koyabilirsiniz.
Bu şekilde de olmaz ise (%2.3f) g yerine f gelecek şekilde denemelerinizi yapabilirsiniz. Ben serial uart da yaptığımda düzgün çalışmıştı. Siz lcd de deniyorsunuz.

Datasheet konusuna gelince bu tür devre elamanlarının bir datasheet i olur spi,i2c gibi haberleşme bitleri voltaj değerleri karakestler devre üzerinde besleme ve uygulama bilgileri yer alır. detaylı incelerseniz ilgili driverin nasıl yazıldığını az çok tahmin ederek kodların üzrrinden geçebilirsiniz.

Birde simülasyon yazılımında da hatalar mevcut olabiliyor. Simulasyon düzgün çalışıp gerçekte çalışmayabiliyor yada tam tersi. %100 bel bağlamamak lazım .
İyi çalışmalar.
 
Son düzenleme:
Kod:
printf(lcd_putc,"SICAKLIK(C):%.2g",restemp);
printf(lcd_putc,"NEM(RH):%.2g", truehumid);

Hocam bi denemeden öce ;
Birde baya bi örnek devreye baktım herkes aynı kodları kullanmış.Sade bir sitede devreyi proteusta yapmışlar ve değerleri sapma yapmadan okumuş.Mail attım dönüş yapan olmadı.Site adresi;

https://www.mikroingenieria.com/pro...r&utm_medium=referral&utm_source=DonanimHaber

Bu şekilde deneyince yani 2g li kodu sadece lcd yazım şekli değişti.O nokta yanına 3 veya 4 yazınca derlerken hata veriyo.
 
Moderatör tarafında düzenlendi:
Bahsettiğiniz sitede %3.1f olacak şekilde gösterilmiş.

Driver da ise nem sıcaklık hesaplarken
Kod:
void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
 {
  float  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;
 }

alanında bazı değişiklikler yapmış olabilirler. Çünkü burdaki driver da gerçek nem değerini sıcaklık ile de formulize ederek hesaplamaya dahil edilmiş.
 

Forum istatistikleri

Konular
128,154
Mesajlar
915,498
Kullanıcılar
449,897
Son üye
alcaponee

Yeni konular

Geri
Üst