DHT11 "A numeric expression must appear here"

Başlatan ismail kaya, 02 Şubat 2015, 11:31:13

ismail kaya

16F876 ve DHT11 okuyorum fakat  if (!read_dht()) hata alıyorum kodda bir yanlışlık mı var?

#include <16F876A.h>
#device ADC=16

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

#use delay(crystal=4000000)

#define use_portb_lcd TRUE         //B portu lcd için ayrılıyor
#define dht11 PIN_C3
#include <flexy_lcd.c>  
#include "DHT11.c"


void main()
{

lcd_init();  // LCD başlangıç ayarları yapılıyor
dht_init();

   while(TRUE)
   {
   
      if (!read_dht())
      {
        byte dht11_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
        if(dht_dat[4]!= dht11_check_sum)
        {
         lcd_gotoxy(1,1);        
         printf(lcd_putc, "\fDHT11 checksum err");
        }
        else
        {
         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);
        }
      }
      else
      {
        lcd_gotoxy(1,1);      
        printf(lcd_putc,"\fSensor Yok");
      }
   }

}

JKramer

dht11_check_sum'ı yukarıda tanımlayın, byte dht11_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; 'daki byte'ı silin.

ismail kaya

yaptım hocam bir şey değişmedi. Aynı kodlar 18f46k22 de çalışıyor.

Kabil ATICI

programda read_dht() incele. (Kütüphanede) Ne olarak geri dönüyor, yada geri dönüşü var mı?
ambar7

ismail kaya

#4
dht11 kütüphanesi
#ifndef dht11
   #define dht11 PIN_C3
#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);
}


mesaj birleştirme:: 02 Şubat 2015, 13:20:34

1,2 yada sonuç byte olarak dönüyor.

mufitsozen

read_dht()  void tanimlanmis. ingilizce void = turkce gecersiz, issiz tamamen bos demek. Yani bu fonksiyon geri bir deger dondurmuyor. dolayisi ile !read_dht() anlamsiz. Derleyicide onu size anlatmaya calisiyor.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Kabil ATICI

İllede örnek derseniz;
Kütüphaneye bakacak olursak
byte leer_dht_dat()
...
return result;

fonksiyonu bir değer döndürmekte.
ambar7

ismail kaya

peki aynı kodlar 18f46k22 de nasıl çalışıyor.

Kabil ATICI

2x2=5 eder mi? Senin söylediğine göre evet. Ama bunun nasılını bilemem. Bunu derleyiciyi yazanlara sorman gerekir.

bilgilerimiz ışığında  "if (!read_dht())" olamayacağını söylüyoruz. Aldığın uyarı ile programda öyle olmayacağını söylüyor.
ambar7

ismail kaya

peki sensör olup olmadığını nasıl anlayabilirim? sensör yoksa sensör yok yazdırmak istiyorum. teşekkür ederim.

Kabil ATICI

http://www.micropik.com/PDF/dht11.pdf
5.2 MCU Sends out Start Signal to DHT (Figure 3, below) (sayfa6)
başlığı altında, işlemci başlangıç sinyali oluşturduğunda, 20-40µs sonra DHT11 bir yanıt veriyor. işte senin sorunun cevabı bu. Bunu incelemenin yolunu bul.
ambar7