Şimdi Ara

Sht75 Sensörünü Kullanan varmı?( CCS C)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
1
Favori
603
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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.

    Sht75 Sensörünü Kullanan varmı?( CCS C)



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







  • Simülasyon olması itibariyle çok birşey ifade etmiyor. Devreyi kurup bi deneyin. Simülasyon sadece isinizi kolaylaştırmak içindir. Ayrıca simülasyonda çalışıyor olması devreyi kurduğunuzda da çalışacağı anlamına gelmez. Hani demem o ki emin olmak istiyorsanız gerçekte kurup öyle bir ölçümleri test edin. Ayni sorun devam ederse o zaman kalibre edersiniz.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: PIC-ARDUINO-AVR

    Simülasyon olması itibariyle çok birşey ifade etmiyor. Devreyi kurup bi deneyin. Simülasyon sadece isinizi kolaylaştırmak içindir. Ayrıca simülasyonda çalışıyor olması devreyi kurduğunuzda da çalışacağı anlamına gelmez. Hani demem o ki emin olmak istiyorsanız gerçekte kurup öyle bir ölçümleri test edin. Ayni sorun devam ederse o zaman kalibre edersiniz.

    Öncelikle cevabınız için teşekkür ederim.
    Simulasyon ama bazen baya işe yarıyor.Kulandığım sensör biraz pahalı bir malzeme o yüzden önce iyi bir araştırma yapıyorum.
    Biri bu kullandığım kodların sht75 sensörüne tam uygun olmayabileceğini söyledi.Banada mantıklı geldı.Neden derseniz sht11 sensörü aynı kodlarla proteusta sıfır hata ile çalışabiliyor.Kodlama konusunda bilgim az dataseet önerdiler ama birşey anlayamadım.




  • hesap19 H kullanıcısına yanıt
    Kodda sıkıntı yok gibi. İ2c yi kütüphane kullanmadan yazmış direk main koda. Sensör 140-150 TL civarında

    . Biraz pahalı hani. Dht22 gibi bir sensör işinizi görmez mi?

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: PIC-ARDUINO-AVR

    Kodda sıkıntı yok gibi. İ2c yi kütüphane kullanmadan yazmış direk main koda. Sensör 140-150 TL civarında

    . Biraz pahalı hani. Dht22 gibi bir sensör işinizi görmez mi?

    Aynen pahalı ama doğruluk yönünden shtxx serileri daha iyi diye biliyorum.Şimdilik biraz bu sorunu çözmek için uğraşıcam.
    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/producto/pic18-sht11-dht22-sht75-medidores-de-humedad-y-temperatura/



    < Bu mesaj bu kişi tarafından değiştirildi hesap19 -- 16 Mart 2018; 9:52:47 >




  • hesap19 H kullanıcısına yanıt
    Onlar da zaten satışını yapıyorlarmış.
  • quote:

    Orijinalden alıntı: PIC-ARDUINO-AVR

    Onlar da zaten satışını yapıyorlarmış.

    Bana o devre o şekilde yaramazki.Yani devreyi bu şekilde kullanmıcam.Bir kaç şartlandırma eklicem.Aklıma devreyi almak geliyo.Kod koruması yoksa bi ihtimal.Ama bu seferde ancak hex dosyasına ulaşırım buda işime yararmı o riski var.Birde tabi bunlar prof insanlardır kesin kod koruma koymuşlardır.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • hesap19 H kullanıcısına yanıt
    Kodlar elinizde zaten.size tavsiyem proteustaki bu farkı öyle dert etmemeniz. Devreyi kurduğunuzda birebir çalıştığını da görme ihtimaliniz var. Bu denli bir ayrıntıda simülasyona bel bağlamanız ve onu baz almanız yanlış olur.Devrenizi kurun, çalıştırın. Belki de hiç bir bilgi vermeyecek. hani deneyin önce
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.