İ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...
bu sensör ile ugraşmayınız olcümleri iç acıcı degil
Ş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.
ş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)
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.
Sensor çıkışlarına PullUp dirençleri bağlımı? , DHT'yi bilmemde SHT11 illada isterim diyor..
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...
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 ...");
}
}
}
}
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/)
Sayın @tarum31 kodlarınızı [ CODE] [ /CODE] (boşluklar olmadan) tagları alın lütfen.
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
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 ?