DHT11'i okuyamıyorum. Lütfen YARDIM!!!

Başlatan yilber92, 12 Ocak 2013, 03:11:27

yilber92

İyi günler arkadaşlar, ben yeni yeni proton ile pic programlamaya başlıyorum. Elimde bir adet DHT11 sensörüm var ve ben bu sensörü çalıştıramadım. Kaç gündür uğraşmama rağmen bir türlü yapamadım. Ve kısa zamanda sensörü çalıştırmam gerekiyor. Lütfen bana DHT11'in proton kodunu yazabilir misiniz?

Kapsamlı kaynak: http://myo.karatekin.edu.tr/mkt2012/calistay-cd/ekler/bildiriler/16.pdf
Datasheet: http://www.micro4you.com/files/sensor/DHT11.pdf

Elimde şuanda 16f877a mikrodenetleyicili ve 20 mhz kristalli deney seti var bunda çalıştırma istiyorum. Şimdiden teşekkür ederim...

Okan AKÇA

bu sensör ile ugraşmayınız olcümleri iç acıcı degil

yilber92

Şuan elimde bu var ve okul projesinde kullanmam gerekiyor. Nem ve sıcaklık ölçen sensorler 40-50 tl olmasından dolayı yeni almak istemiyorum.

Maxim


yilber92

Sayın Maxim verdiğiniz linkdeki kodu deniyorum fakat yine sensörü okuyamıyor.

Şuanda dünyada proton ile yazılan od yok sanırım. Eğer bana 16f877a(20mhz) için kodu yazabilecek varsa gerçekten bir ilk olacaktır.

ipek

Sensor çıkışlarına PullUp dirençleri bağlımı?  , DHT'yi bilmemde SHT11 illada isterim diyor..

mustafa_cmbz

Alıntı yapılan: cyclone - 12 Ocak 2013, 15:09:04
bu sensör ile ugraşmayınız olcümleri iç acıcı değil

kullanmadım ama katılıyorum...Zaten sensörün görünüşü bir kere hiç iç açıcı değil...sanki merdiven altı mum ışığında üretilmiş...

sht11 öylemi :P değil....fakat tek sıkıntısı ekstradan bir pcb istemesi...Ayakları çok minik namussuzun...

pisayisi

16f887 için yazılmış aşağıdaki kod işne yarayabilir, google dan bak yabancı kaynaklarda pekçok örnek var...

//Program        :DHT11
 //Author        :Somlak Mangnimit
 //Date                :04/09/2012
 //Mcu                :PIC16F887
 //Xtal                :internal osc 4Mhz
 //Compiler  :Hitech - C v9.83
 //--------------------------------------------------
 #include        <htc.h>
 #define     _XTAL_FREQ 4000000
 __CONFIG    (FOSC_INTRC_NOCLKOUT&WDTE_OFF&MCLRE_OFF&LVP_OFF&CP_OFF&CPD_OFF);
 
#include    "clcd.c"
 
#define     lcd_putcmd(x)       lcd_write_command(x);
 #define     lcd_putc(x)         lcd_write_data(x);
 #define     lcd_puts(x)         lcd_print_string(x);
 
#define     sht11_pin           RB4
 #define     sht11_dir           TRISB4
 
#define     sht11_pin_high()    sht11_dir = 0; sht11_pin = 1;
 #define     sht11_pin_low()     sht11_dir = 0; sht11_pin = 0;
 #define     sht11_pin_float()   sht11_dir = 1; sht11_pin = 0;
 
unsigned char TOUT,CheckSum,i;
 unsigned char T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
 char message1[] = "  Temp = 00  C  ";
 char message2[] = "  Humi = 00  %  ";
 
//Initial at Start Up
 void Setup(void){
 PORTA = 0x00;
 PORTB = 0x00;
 PORTC = 0x00;
 PORTD = 0x00;
 PORTE = 0x00;
 
TRISA = 0x00;
 TRISB = 0x00;
 TRISC = 0x00;
 TRISD = 0x00;
 TRISE = 0x00;
 
ANSEL = 0x00;
 ANSELH = 0x00;
 
OSCCON = 0b01100000;    //Internal Clock 4Mhz
 while(!HTS);            //Wait High Freq Stable
 
//Configure Timer2 module
 TMR2IE = 1;             // Enable Timer2 interrupt
 T2CON = 0;              // Prescaler 1:1, and Timer2 is off initially
 TMR2IF = 0;             // Clear TMR INT Flag bit
 TMR2 = 0;
 
GIE = 1;                //Enable global interrupt
 PEIE = 1;               //Enable peripheral interrupt
 
}
 
//Generate Start pulse signal
 void StartSignal(void){
 sht11_pin_low();        //Data port is output
 __delay_ms(25);
 sht11_pin_float();      //Data port is input
 }
 
//interrupt
 void interrupt ISR(void){
     if(TMR2IF){
         TOUT = 1;
         TMR2ON = 0;     // stop timer
         TMR2IF = 0;     // Clear TMR0 interrupt flag
     }
 }
 
//Check DHT11 Response
 unsigned char CheckResponse(void){
 TOUT = 0;
 TMR2 = 0;
 TMR2ON = 1;             // start timer
 while(!sht11_pin&&!TOUT);
     if(TOUT){
         return 0;
     }else{
         TMR2 = 0;
         while(sht11_pin&&!TOUT);
         if(TOUT){
             return 0;
         }else{
             TMR2ON = 0;
             return 1;
         }
     }
 }
 
//Read byte from DHT11
 unsigned char ReadByte(void){
 unsigned char num = 0;
 sht11_pin_float();      //Data port is input
     for(i=0;i<8;i++){
         while(!sht11_pin);
         TMR2 = 0;
         TMR2ON = 1;
         while(sht11_pin);
         TMR2ON = 0;
         if(TMR2>40){
             num |= 1<<(7-i);  // If time > 40us, Data is 1
         }
     }
 return num;
 }
 
//Main Program
 int main(void){
 unsigned char check;
 Setup();
 lcd_init();
 
        for(;;){
         __delay_ms(1000);
         StartSignal();
         check = CheckResponse();
 
        if(!check){
             lcd_putcmd(0x80);
             lcd_puts("No response     ");
             lcd_putcmd(0xc0);
             lcd_puts("from the sensor ");
         }else{
             RH_Byte1 = ReadByte();
             RH_Byte2 = ReadByte();
             T_Byte1 = ReadByte();
             T_Byte2 = ReadByte();
             CheckSum = ReadByte();
 
            //Check for error in Data reception
             if(CheckSum==((RH_Byte1+RH_Byte2+T_Byte1+T_Byte2)&0xFF)){
                 message1[9]  = T_Byte1/10 + 48;
                 message1[10]  = T_Byte1%10 + 48;
                 message2[9]  = RH_Byte1/10 + 48;
                 message2[10]  = RH_Byte1%10 + 48;
                 message1[12] = 223;     //Degree symbol
                 lcd_putcmd(0x80);
                 lcd_puts(message1);
                 lcd_putcmd(0xc0);
                 lcd_puts(message2);
             }else{
                 lcd_putcmd(0x80);
                 lcd_puts("Checksum Error! ");
                 lcd_putcmd(0xc0);
                 lcd_puts("Trying Again ...");
             }
         }
     }
 }
Murat

tarum31

mrb mustafa arkadaşım bende proton yazılı bir program...
ben devreyi isis kurdum ama çalıştıramadım bi bak incelede
çalıştırırsan bana bilgi ver
Include "modedefs.bas"         
Device 16F628A
XTAL 8

   
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4

TRISA=0  'A portu çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0


Dim SURE    As Byte
Dim I       As Byte
Dim TAMRUT  As Byte
Dim ONDARUT As Byte
Dim TAMISI  As Byte
Dim ONDAISI As Byte
Dim control As Byte
Symbol DERECE=223     ' ° işareti

Symbol Dta=PORTA.0  'sensor dATA PİNİ PORTA.0 A BAĞLI

DelayMS 5000
BASLA:


Output  Dta
Low     Dta
    DelayMS   18      '18 ms bekle
High    Dta         'Data pinini High yap
    DelayUS 40      '40 us bekle
Low     Dta
Input   Dta
While   Dta=0:Wend
DelayMS 85

If Dta=1 Then hata

TAMRUT=0
For I=7 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  While Dta=0:Wend 
  DelayUS 40
  If Dta=1 Then
'  TAMRUT.(I)=1
    SetBit TAMRUT,I
  EndIf
  While Dta=1:Wend
Next

ONDARUT=0
For I=7 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  While Dta=0:Wend
   DelayUS 40
  If Dta=1 Then SetBit ONDARUT,I
  While Dta=1:Wend
Next

TAMISI=0
For I=7 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  While Dta=0:Wend
    DelayUS 40
  If Dta=1 Then SetBit TAMISI,I
    While Dta=1:Wend 
Next

ONDAISI=0
For I=7 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  While Dta=0:Wend 
   DelayUS 40
  If Dta=1 Then SetBit ONDAISI,I
   While Dta=1:Wend
 
Next

control=0
For I=7 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  While Dta=0:Wend
   DelayUS 40
  If Dta=1 Then SetBit control,I
  While Dta=1:Wend
 
Next
    Print  $FE,1
    Print  $FE,$80,"NEM=",Dec TAMRUT,"%"        ',DEC ONDARUT
    Print  $FE,$C0,"ISI=",Dec TAMISI,DERECE,"C" ',DEC ONDAISI
    DelayMS   200

GoTo BASLA

hata:
    Print $FE,1,"SENSOR HATASI"
    DelayMS   200
GoTo BASLA

End


Gökhan BEKEN

Sayın @tarum31 kodlarınızı [ CODE] [ /CODE] (boşluklar olmadan) tagları alın lütfen.
Özel mesaj okumuyorum, lütfen göndermeyin.

yuppi

AM2302 DHT11 ile okuma protokoller yaklaşık aynı her iki sensöründe datasheet ine bakılırsa farklı bi tıklıklık fark olduğu görülür.Dht11 okumak için ufak değişiklik yapmak gerekir.


Device = 18F4520
Declare Xtal= 20 

        Declare LCD_DTPort = PORTD 'GLCD DATA PORTLARI PORTD'YE BAĞLI
        Declare LCD_ENPin = PORTC.3 'GLCD ENABLE PİNİ PORTC.1 BAĞLI
        Declare LCD_RWPin = PORTC.7 'GLCD RW PİNİ PORTC.4 BAĞLI
        Declare LCD_RSPin = PORTC.6 'GLCD RS PİNİ PORTC.5 BAĞLI  
        Declare LCD_CS2Pin = PORTC.4 'GLCD CS1 PİNİ PORTC.2 BAĞLI
        Declare LCD_CS1Pin = PORTC.5 'GLCD CS2 PİNİ PORTC.3 BAĞLI
        Declare LCD_Type = GRAPHIC 'GLCD TİPİ GRAFİK KS0108 
        Declare Internal_Font = On 
        Declare Font_Addr = 0
        Declare GLCD_STROBE_DELAY 20
        Declare GLCD_EXTERNAL_PRINT = PPRINT

 

Dim nem As Float
Dim nem1 As Word
Dim temp As Float
Dim temp1 As Word
Dim kontrol As Byte 
Dim ham[5] As Byte 
Dim ChkSum As Word
Dim Index As Byte
Dim SenData As Dword
Dim Toplam As Word
Dim gec As Byte
Symbol DHT22 = PORTC.2

Nem_Okuma:
Clrwdt
DelayMS 1000
SenData=0:ChkSum=0
Output DHT22
DHT22 = 0
DelayMS 18
DHT22 = 1
DelayUS 20
DHT22=0
Input DHT22
kontrol =PulsIn DHT22,1
If kontrol < 38 Then 
Cls
syc=syc+1
Print At 46,0,"Sensor yok  :",Dec syc
Cls 
EndIf
For Index = 31 To 0 Step -1
kontrol = PulsIn DHT22,1 'Sensorden gelen puls okuma RH+DT
If kontrol > 20 Then SetBit SenData,Index
Next Index

For Index = 7 To 0 Step -1
kontrol = PulsIn DHT22,1   'Sensorden gelen puls okuma ChkSum 
If kontrol > 20 Then SetBit ChkSum,Index  
Next Index

Toplam = (SenData.Byte3)+(SenData.Byte2)+(SenData.Byte1)+(SenData.Byte0)
For gec = 1 To 8
nem1 = SenData.Byte3 << gec
Next
nem1 = nem1+(SenData.Byte2)
nem = nem1/10
gec=0
For gec=1 To 8
temp1 = SenData.Byte1 << gec
Next
temp1 = temp1 + (SenData.Byte0)
temp = temp1 / 10
Print At 0,1,"Check Sum = ",Dec ChkSum
Print At 1,1,"H:",Dec1 nem," %"
Print At 1,10,"T:",Dec1 temp,"C"
Print At 2,1,"Toplam:",Dec Toplam
Print At 3,1,"HAM:",Hex8 SenData
Print At 4,1,"HAM T:",Hex SenData.Byte1,"",Hex SenData.Byte0
Print At 5,1,"HAM N:",Hex  SenData.Byte3,"",Hex SenData.Byte2
Print At 6,1,"nem1:",Hex4 nem1
Print At 7,1,"Temp1:",Hex4 temp1
Wend

mustafa_cmbz

Bu sensörü isiste çalıştrabilen varmı ?

Ben ilk aşamada start sinyallerini vs. gönderiyorum geri dönüş olmuyor sanki sensörden.Yanlışmıyım ?

Elinde isiste çalışan dht11 li şeması olan durumu bizimle paylaşabilirmi ?