SHT75 Devresine İki Adet Röle Eklemem Lazım

Başlatan hesap123, 10 Mart 2018, 22:48:35

hesap123

Hocalarım merhaba;

SHT75 sensörünü kullanarak termostat ve higrostat yapmam lazım.
Sensörden değer okumak için bir kod buldum.Buna ek olarak pic'in 2 tane pininde 2 adet röle kontrol edicem nem için.
Nemin matığı aynı termostat gibi belirlenen bir değere nem oranı geldiğinde röleyi açacak o değeri biraz geçince kapatacak.
2. rölede normal termostat için

( Normalde tüm kodları kendim yazmak istiyodum.Sensörü okumak için kodu buldum.
Fakat sensörden okunun değerin hangi değişkene atandığını bulamadım.
Hani en basit mantıkla o değişkeni bulsan if değimi içerisde bi şartlandırma ile o iki röleyi kontrol ederdim diye planlıyordum.
Tabi ne kadar sağlıklı olur onuda bilmiyorum.Parantez içi biraz matıksız oldu kusura bakmayın.Geçi tamamı öylede.
Kitap okumamanın zararları...) Yardım eden, etmeye çalışan herkese şimdiden çok teşekkür ederim.



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

omereliusuk

restemp ve truehumid verileri sizin için ölçüm sonucu oluşturulan veriler. bunları kullanarak istediğinizi yapabilirsiniz.
delay_ms(500); yazan yerin öncesine karşılaştırma kodlarını ekleyebilirsiniz.
if(restemp>tempSet)sunuYap();
if(truehumid<humidSet)nemiAyarla();
gibi işlemler ile çözüme ulaşabilirsinm.


hesap123

#2
Alıntı yapılan: omereliusuk - 10 Mart 2018, 23:00:57
restemp ve truehumid verileri sizin için ölçüm sonucu oluşturulan veriler. bunları kullanarak istediğinizi yapabilirsiniz.
delay_ms(500); yazan yerin öncesine karşılaştırma kodlarını ekleyebilirsiniz.
if(restemp>tempSet)sunuYap();
if(truehumid<humidSet)nemiAyarla();
gibi işlemler ile çözüme ulaşabilirsinm.



if(truehumid<humidSet)==56);  // nem yüzde 56 da sabitlemek için
output_high(pin_a1);


if(restemp>tempSet)==36);  //  burada buçuklu sayı kullanmam gerekecek 36.5 gibi
output_high(pin_a2);

Acaba bu şekilde olabilir mi?

eowe

if kullanımınız hatalı ayrıca sensor çıkısları sabit bir deger vermez sürekli değişir sensörün kalitesine göre hata payı azalır yazılımda bu hata payını göz önüne almanız gerekir.

#define ACCURACY         0.1f      //%0.1 hata ile calisma
#define DESIREDVALUE  56          // Sensorden okunması istenen deger

if(DESIREDVALUE * (100.0f + ACCURACY) > sensordenokunandeger && DESIREDVALUE * (100.0f - ACCURACY) < sensordenokunandeger)
    role_islemi_yaptir

hesap123

Alıntı yapılan: eowe - 11 Mart 2018, 15:00:10
if kullanımınız hatalı ayrıca sensor çıkısları sabit bir deger vermez sürekli değişir sensörün kalitesine göre hata payı azalır yazılımda bu hata payını göz önüne almanız gerekir.

#define ACCURACY         0.1f      //%0.1 hata ile calisma
#define DESIREDVALUE  56          // Sensorden okunması istenen deger

if(DESIREDVALUE * (100.0f + ACCURACY) > sensordenokunandeger && DESIREDVALUE * (100.0f - ACCURACY) < sensordenokunandeger)
    role_islemi_yaptir

Bu devre ile nem ve sıcaklık oranını sabitlemek için kullanıcam.Yani nem ortalama yüzde 56'ya gelince röle kapanacak biraz altına düşünce röle açılacak.

İkinci röle ise normal termostat gibi haraket edecek.Sıcaklığı 36.5 derecede tutmaya çalışacak.

Bunu neden yazdığıma gelirsek yazdıklarınızın bir kısmını anlayamadım.

Birde bu hata payı ile ilgili olarak, proteusta devreyi çalıştırınca sensör nem değerini yüzde 80 gösterirken pıc bunu yüzde 84 gibi okuyo acaba kodlarda bi hata olabilir mi?Sıcaklıkta bu fark 0.3