PIC dht11 kullanımı

Başlatan Emre MERMİ, 05 Kasım 2014, 14:06:10

Emre MERMİ

merhaba arkadaşlar, 
Nem değerini ölçme ile ilgili bir devre yapmaya çalışıyorum. SHT11 40-50 tl civarında olduğu içi 5 tl lik DHT11 kullanayım dedim. www.expkits.com  da DHT11 in kodlarını PIC e uyarlamışlar. O kodları kullanmaya çalıştım.  Sitedeki kodlar  ;

http://www.expkits.com/pub/EX8/EX8_CCS.rar
buradaki 18f4520 ile yapılan örneği 16f628a ila yapmaya çalıştım. kodları derliyorum fakat lcd nem ve ısı değerini göremiyorum. derlerken sadece bir değişken hiç kullanılmadı diye uyarı alıyorum.  onunla ilgili bir sorun mu var bilmiyorum.  kodlar;
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(int=4000000)
#define use_lcd_porb TRUE
#define ENABLE_PIN B0
#define RS_PIN B1
#define RW_PIN B2
#define Data4 B4
#define Data5 B5
#define Data6 B6
#define Data7 B7
#define dht11 PIN_A0
#include <lcd.c>
#include "DHT11.C"


void main()
{
setup_oscillator(osc_4mhz);
   lcd_init();
   delay_ms(100);

   dht_init();
      delay_ms(100);
   while(TRUE)
   {
      read_dht();
         delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"HUMI RH :%d.%d %%  ",dht_dat[0],dht_dat[1]);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"TEMP :%d.%d %cC  ",dht_dat[2],dht_dat[3],223);
   }

}


ayrıca dht11.c dosyasındaki pin numarasını da değiştirdim ;

#ifndef dht11
   #define dht11 PIN_A0
#endif

char dht_dat[10]; // Output data will be here

void dht_init()

{
    delay_ms (1);
    OUTPUT_HIGH (dht11);
}
byte leer_dht_dat()

{
    byte i = 0;
    byte result = 0;

    for (i = 0; i < 8; i++)
    {
        while (input (dht11) == 0)
            ;

        delay_us (30);

        if (input (dht11) == 1)
        {
            result |= (1 << (7 - i) );
        }

        while (input (dht11) == 1)
            ;
    }

    return result;
}

void read_dht()

{
    byte GlobalErr = 0;
    byte dht_in;
    byte i;
    byte dht_check_sum;
    dht_init();
    OUTPUT_LOW (dht11);
    delay_ms (18);
    OUTPUT_HIGH (dht11);
    delay_us (30);
    dht_in = input (dht11);

    if (dht_in)
    {
        GlobalErr = 1;
        return;
    }

    delay_us (80);
    dht_in = input (dht11);

    if (!dht_in)
    {
        GlobalErr = 2;
        return;
    }

    delay_us (80);

    for (i = 0; i < 4; i++)
    {
        dht_dat[i] = leer_dht_dat();
    }

    OUTPUT_HIGH (dht11);
}


örnekte EXLCD.c diye bir kütüphane kullanmış ben normal lcd.c yi kullandım. bu yüzden bir sıkıntı yaşamam herhalde ?
yanlış hatırlamıyorsam bir pini belirli bi süre datashetteki gibi high/low yaparak sht11 ve dht11 den bilgiyi alıyorsun. bunun için bir haberleşme gerekmediğinden istediğim pini kullanabilir miyim ?
Herhalde lcd ye yazmada bir sıkıntı yaşıyorum gibi ama çözemedim.
devreyi boarda kurmadım sadece simüle ettim. 
yardımcı olursanız çok sevinirim.

derleme çıktısı ;

simülasyon görüntüsü ;


polleme

Ben aynı durumda olsam, yani LCD'nin çalışmadığından şüphelensem ve diğer kısmın doğru olduğunu düşünsem, bu veriyi farklı şekilde görmeyi denerdim. Örneğin sıcaklığı 20 derece ölçtüysem 8 LED ile ikilik düzende bu değeri göstermeye çalışırdım. Veriyi alabildiğimden eminsem LCD tarafında odaklanırdım.


Emre MERMİ

ondan da emin değilim hocam yani orada  varsayımda bulundum onu da haberleşmeyle denemeye çalışacam. aldığım veriyi seri porta yazıp serial monitörden bakacam

Burak B

#3
Gecikme rutinlerindeki zamanlamanın doğruluğundan emin ol. Ayrıca DHT11 data hattına bir pullup eklemeyi unutma.
Alıntı Yap* Uyarı    : CCS v4 ile derlenmiştir.
*            SWDIP7 (SW3) - SCK  ON konumunda olmalıdır.
*            PULL U/D C3 (SW5) ON edilmelidir. Aksi halde sensör devreye girmez.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Emre MERMİ

pull up ekledim,  while döngüsüne 2 saniye gecikme ekledim sonuç aynı

RaMu

RA0 analog pin,
bunu giriş kurulumunda digital yapmalısın.

İsis çizimi ve ccsc proje dosyalarını eklersen deneyip bakabilirim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ

ilginiz için teşekkür ederim RaMu hocam,

RA0 pini için bir ayar yapmadım.
dosyalar ;

http://s3.dosya.tc/server28/bE0XKC/16f628a-dht11.rar.html


RaMu

isis de pici çift tıklatıp
osilatör frekansını 4MHz yapmamışsın.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ

Gülünecek hata :) teşekkürler hocam yardımınız için. bu arada bi sorum olacak tekrar okuma yapma için main içinde ne kadar bekleme bırakmalıyım. buton falan bağlayacağım lcd b portuna bağlı olduğu için kesme de kullanamıyorum. bu konudaki önerileriniz nelerdir ?