Picproje Elektronik Sitesi

DERLEYİCİLER => Proton+ => Konuyu başlatan: yilber92 - 12 Ocak 2013, 03:11:27

Başlık: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: yilber92 - 12 Ocak 2013, 03:11:27
İ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 (http://myo.karatekin.edu.tr/mkt2012/calistay-cd/ekler/bildiriler/16.pdf)
Datasheet: http://www.micro4you.com/files/sensor/DHT11.pdf (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...
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: Okan AKÇA - 12 Ocak 2013, 15:09:04
bu sensör ile ugraşmayınız olcümleri iç acıcı degil
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: yilber92 - 12 Ocak 2013, 17:44:20
Ş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.
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: Maxim - 12 Ocak 2013, 19:03:53
şuradaki kodları kurcalayın
http://digital-diy.com/forum/proton-basic/dht11-anyone-t1716-20.html (http://digital-diy.com/forum/proton-basic/dht11-anyone-t1716-20.html)
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: yilber92 - 12 Ocak 2013, 22:05:11
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.
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: ipek - 13 Ocak 2013, 03:45:11
Sensor çıkışlarına PullUp dirençleri bağlımı?  , DHT'yi bilmemde SHT11 illada isterim diyor..
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: mustafa_cmbz - 13 Ocak 2013, 09:40:14
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...
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: pisayisi - 13 Ocak 2013, 12:27:18
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 ...");
             }
         }
     }
}
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: tarum31 - 24 Kasım 2014, 21:39:32
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
(http://s28.postimg.cc/v0b4rv9ux/ads_z.jpg) (http://postimg.cc/image/v0b4rv9ux/)
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: Gökhan BEKEN - 24 Kasım 2014, 23:10:16
Sayın @tarum31 kodlarınızı [ CODE] [ /CODE] (boşluklar olmadan) tagları alın lütfen.
Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: yuppi - 21 Aralık 2014, 16:46:05
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



Başlık: Ynt: DHT11'i okuyamıyorum. Lütfen YARDIM!!!
Gönderen: mustafa_cmbz - 31 Aralık 2014, 22:07:13
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 ?