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

Konusu 'Pic Programlama' forumundadır ve hesap19 tarafından 11 Mart 2018 başlatılmıştır.


  1. hesap19

    hesap19 Üye

    Katılım:
    13 Ocak 2015
    Mesajlar:
    94
    Beğenilen Mesajları:
    11
    Ödül Puanları:
    3
    Cinsiyet:
    Bay
    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.
    Sıcaklık ve nem değerleri değiştirilmesi gerekirse bunu programda değiştiricem ayriyeten butonla filan ayar yapmıcam.

    Yardım eden, etmeye çalışan herkese şimdiden çok teşekkür ederim.

    [​IMG]

    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
     }
    }
     
  2. ibrahim1996

    ibrahim1996 Üye

    Katılım:
    18 Nisan 2014
    Mesajlar:
    875
    Beğenilen Mesajları:
    161
    Ödül Puanları:
    33
    Cinsiyet:
    Bay
    Meslek:
    ELEKTRİK TEKNİKERİ
    Degeri bir butonla artırıp bunu lcd ye aktar ve bir de set butonu olsun deger ayarlandında sensörü okuyup işlemlere başlasın röleyi
    Örnek
    İf(nemsensör>=20 && nemayar>=20)
    { Output_high(pin_e0);}
    Else
    Output_low(pin_e0);
     
  3. muratmert4

    muratmert4 Paylaşımcı üye

    Katılım:
    26 Eylül 2007
    Mesajlar:
    861
    Beğenilen Mesajları:
    184
    Ödül Puanları:
    133
    Cinsiyet:
    Bay
    Bulunduğu Yer:
    ANTALYA
    S.A.
    Şimdi ayar için çeşitli yollar var set değerini geçince, set değerinden aşağıya düşünce???

    ısı için:
    eğer set değerini geçince ısıtma ve nemlendirme için
    float isi=0.0, nem=0.0;

    if(isi>=25.0) {ısıtıcı kapat; diğer işlemlervb..} // ısı 25 dereceyi geçince ısıtmayı kapat
    else if(isi<=23.0) {ısıtıcı aç; diğer işlemlervb..} // ısı 23 dereceden az ise ısıtmaya başla
    //yukarıda ısıyı 23-25 arasında tutar
    if(nem>=75.0) {nemlendirici kapat; diğer işlemlervb..}// nem %75 geçerse nemlendirme durur
    else if(nem<=65.0) {nemlendirici aç; diğer işlemlervb..}//nem %65 altına düşerse nemlendirme çalışır
    // nem içinde %65-%75 arasın da tutar

    eğer set değerinin altına inince soğutma ve nem alma için
    float isi=0.0, nem=0.0;

    if(isi>=25.0) {soğutucu aç; diğer işlemlervb..}//ortam 25 üzerinde ise soğutmayı aç
    else if(isi<=23.0) {soğutucu kapat; diğer işlemlervb..}//ortam 23 altına indiğinde soğutmayı kapat

    if(nem>=75.0) {nem kurutucu aç; diğer işlemlervb..}// ortam nemi %75 den fazla ise nem kurutucuyu aç
    else if(nem<=65.0) {nem kurutcu kapat; diğer işlemlervb..}//ortam nemi %65 düşünce kurutucuyu kapat

    seneryolar kullanıma ve ihtiyaca göre arttırılabilir önmeli olan ne amaçta kullanılacaksa karar vermek.
     
    kaptan_ bunu beğendi.
  4. hesap19

    hesap19 Üye

    Katılım:
    13 Ocak 2015
    Mesajlar:
    94
    Beğenilen Mesajları:
    11
    Ödül Puanları:
    3
    Cinsiyet:
    Bay

    Akeykum selam;
    Tam aradığım cevap yapmak istedğim işi anlatamadığım için cavap gecikti.( kitap okumamanın zararları)

    if(isi>=25.0) {ısıtıcı kapat; diğer işlemlervb..} // Burada ısı yerine yukarıdaki sht75 in kodlarında
    restemp değişkenini yazsak yani;

    ısı ayarı;

    if(restemp>=36.5);
    output_low(pin_a1); // ısı 36.6 dereceye çıkınca pin a1'i kapat 36 ya düşünce a1'i aç
    else if(restemp<=36.0);
    output_high(pin_a1);


    nem ayarı;
    if(truehumid>=56.0); // ısdaki olayı burada uygulayarak truehumid değişkenini kullansak output_low(pin_a2);
    else if(truehumid<=53.0);
    output_high(pin_a2);

    Bu düşünceyide nasıl bulduğumu aşağıda açıklıcam.

    farklı bir form sitesinde bir üye bir cevap verdi.Sizin cevaba yakın o cevap;

    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.

    diğer bir üye ise ona yanıt olarak if değişkenini kullanmam gerektiğini söyledi ve o cevap;

    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

    Benim seviyem ifi destekliyo ama bu yorum kafamı karıştırdı.Ne demek istediğinide anlayamadım.

    ısı ayarı;

    if(restemp>=36.5);
    output_low(pin_a1); // ısı 36.6 dereceye çıkınca pin a1'i kapat 36 ya düşünce a1'i aç
    else if(restemp<=36.0);
    output_high(pin_a1);


    nem ayarı;
    if(truehumid>=56.0); // ısdaki olayı burada uygulayarak truehumid değişkenini kullansak output_low(pin_a2);
    else if(truehumid<=53.0);
    output_high(pin_a2);

    Malesef bu kod çalışmadı.

    delay_ms(500); // yazan yerin öncesine ekledim ve çalışmadı.
     
    Yönetici tarafından son düzenleme: 12 Mart 2018
  5. kaptan_

    kaptan_ Üye

    Katılım:
    1 Şubat 2014
    Mesajlar:
    458
    Beğenilen Mesajları:
    243
    Ödül Puanları:
    33
    Cinsiyet:
    Bay
    Meslek:
    Elektrik Teknisyeni
    Bulunduğu Yer:
    Giresun
    if(restemp>=36.5); Bu gibi if sorgusu satırı sonunda noktalı virgül kullanamazsın.

    Bi ara kodları yazacağım, şu an meşgulum
     
  6. hesap19

    hesap19 Üye

    Katılım:
    13 Ocak 2015
    Mesajlar:
    94
    Beğenilen Mesajları:
    11
    Ödül Puanları:
    3
    Cinsiyet:
    Bay
    Evet bu şekilde çalıştı ama doğruluğu yüzünden sizi beklicem.

    //ısı ayarı;

    if(restemp>=36.5)
    output_low(pin_a1);
    else if(restemp<=36.0)
    output_high(pin_a1);


    //nem ayarı;
    if(truehumid>=56.0)
    output_low(pin_a2);
    else if(truehumid<=53.0)
    output_high(pin_a2);
     
  7. kaptan_

    kaptan_ Üye

    Katılım:
    1 Şubat 2014
    Mesajlar:
    458
    Beğenilen Mesajları:
    243
    Ödül Puanları:
    33
    Cinsiyet:
    Bay
    Meslek:
    Elektrik Teknisyeni
    Bulunduğu Yer:
    Giresun
    main fonksiyonu örnek olarak şöyle olacak;

    Kod:
    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
    if(restemp >= 35.0)
    output_high(pin_a1);
    else if( restemp < 34.0)
    output_low(pin_a1);
    
    if(truehumit >= 75.0)
    output_high(pin_a2);
    else if( truehumit < 74.0)
    output_low(pin_a2);
     }
    }
    
    
    evet doğru olmuş şimdi
     
    Yönetici tarafından son düzenleme: 13 Mart 2018
    muratmert4 bunu beğendi.
  8. hesap19

    hesap19 Üye

    Katılım:
    13 Ocak 2015
    Mesajlar:
    94
    Beğenilen Mesajları:
    11
    Ödül Puanları:
    3
    Cinsiyet:
    Bay
    Hocam bir problem daha var aslında problem olup olmadığındanda emin değilim.

    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ı bana bir sorun teşkil eder mi? Herhangi bir çözümü olur mu?
     
  9. kaptan_

    kaptan_ Üye

    Katılım:
    1 Şubat 2014
    Mesajlar:
    458
    Beğenilen Mesajları:
    243
    Ödül Puanları:
    33
    Cinsiyet:
    Bay
    Meslek:
    Elektrik Teknisyeni
    Bulunduğu Yer:
    Giresun
    sensör senkron dijital haberleşme yaptığından dolayı uygulamada yanlış ölçüm yapacağını zannetmiyorum.
     
  10. hesap19

    hesap19 Üye

    Katılım:
    13 Ocak 2015
    Mesajlar:
    94
    Beğenilen Mesajları:
    11
    Ödül Puanları:
    3
    Cinsiyet:
    Bay
    Baya bi zaman öce bu sorun hakkında bir sürü yerde konu açtım bini geçkin konuyu okuyan olmuş ama bir tane cevap alamadım.İşin kötüsü bu durumu kodlarda düzetmem çok zor.
    Kodlarda bir hesaplama yapıldığından haberim varda nedir ne değildir bilmiyorum.

    Farklı farklı devreler ve kodlar buldum ama durum aynı.Yalnız aynı kodlar ile sht11 de bu fark çok az olabiliyo.

    Sadece bir kişiden parsic kullanarak proteusta bu değer farkını baya bi azlttım demişti.

    Ama CCS C de buna bi çözüm bulamadım.

    Biriside proteus hatalı dedi realde bu devre gayet düzgün çalışır dedi.Bende proteusa baya güveniyorum.
     
    kaptan_ bunu beğendi.

Sayfayı Paylaş