Y

DHT11 Sensörünü okuyamıyorum.

Başlatan yilber92, 12 Ocak 2013, 21:58:01

veliusta

Alıntı yapılan: ete - 08 Haziran 2013, 18:11:50
Söz konuus kod yalnızca 1 adet pic pini kullanarak DHT11 sensöründen okuma yapıyor.
18 pinli herhangi bir işlemci kullanılabilir.
Bir işlemci ve bir LCD ile birlikte bir şema oluşturmak çok zor olmasa gerek.
İlişikteki PDF dosyasında ilgili şemayı çizmeye çalıştım.

Ete

Hocam eline sağlık. Ama çalışmadı.


yukarıdaki devre şeması gibi yaptım MCLR ve Osilatör kullanmadım.Sensör bağlantısı şemadaki gibi yaptım.LCD olarak 16x2 kullandım.

'****************************************************************
'*  Name    : DHT11 SENSOR                                      *
'*  Author  : [VELI USTA]                                       *
'*  Notice  : Copyright (c) 2013 [USTA ELEKTRONİK]              *
'*          : All Rights Reserved                               *
'*  Date    : 07.06.2013                                        *
'*  Version : 1.1                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A                     'İşlemci 16F628A
@ DEVICE pic16F628A, WDT_ON             'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON            'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF        'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF           'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak.
'------------------------------------------------------------------------------
DEFINE OSC 4

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

SURE    VAR BYTE
I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control VAR BYTE

symbol dta=portA.0 'sensor dATA PİNİ PORTA.0 A BAĞLI

BASLA:

output dta
LOW DTA
Pause 18       '18 ms bekle
HIGH DTA           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
WHILE DTA=0:WEND
PAUSEUS 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 
   Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  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
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  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 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=1:wend
 
Next

LCDOUT $FE,1 
LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI
PAUSE 800

GOTO BASLA

hata:
LCDOUT $FE,1 
LCDOUT $FE,$80,"SENSOR HATASI"

GOTO BASLA
END


Devre çalışmadı. İsistede sensörü bağlamadan çalışdırdım ama orada da çalışmadı. Neden çalışmamış olabilir?

ete

Lcd kullanan devrelerde açılıştan önce lcd nin açılış işlemi yapılmalıdır. Bu işlem lcdout $FE,1. Komutu ile yapılır. Bu komut verildikten sonra en az 150 ms bir gecikme verilmeliki bu süre esnasında lcd kendi iç registerlerini yerlerine yerleştirebilsin. Programın diğer register yerleşimi içinde biraz gecikme vermek gerektiğinden açılış komutundan sonra bir pause 500 verilmesi uygun olur. Bunları yapmazsanız lcd ya hiç açılmaz yada abuk subuk açılır.
Açılışta lcd nin doğru açıldığından emin olmak için başla satırından önce ekrana bir şeyler yazdırıp yine bir gecikme vermek ve onu gördükten sonra ekranı sildirmek doğru olur. Böylece sorun senin lcd de mi yoksa programdamı yoksa bağlantılardamı kolaylıkla anlayabilirsin.
Bu dediklerimi bir araya toplarsak senin programda yer alan symbol...... Komut satırından sonra aşağıdakileri programına ekle bakalım ne olacak.
LCDOUT $FE,1
PAUSE 300
LCDOUT $FE,$80," EKRAN ACILIYOR "
PAUSE 500
LCDOUT $FE,1
Basla:

En son satırda yer alan basla etiketi senin programda yer alan etiket oluyor
Ete

veliusta

'****************************************************************
'*  Name    : DHT11 SENSOR                                      *
'*  Author  : [VELI USTA]                                       *
'*  Notice  : Copyright (c) 2013 [USTA ELEKTRONİK]              *
'*          : All Rights Reserved                               *
'*  Date    : 07.06.2013                                        *
'*  Version : 1.1                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A                     'İşlemci 16F628A
@ DEVICE pic16F628A, WDT_ON             'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON            'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF        'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF           'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak.
'------------------------------------------------------------------------------
DEFINE OSC 4

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

SURE    VAR BYTE
I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control VAR BYTE

symbol dta=portA.0 'sensor dATA PİNİ PORTA.0 A BAĞLI

LCDOUT $FE,1
PAUSE 300
LCDOUT $FE,$80," EKRAN ACILIYOR "
PAUSE 500
LCDOUT $FE,1

BASLA:

output dta
LOW DTA
Pause 18       '18 ms bekle
HIGH DTA           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
WHILE DTA=0:WEND
PAUSEUS 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 
   Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  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
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  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 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=1:wend
 
Next

LCDOUT $FE,1 
LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI
PAUSE 800

GOTO BASLA

hata:
LCDOUT $FE,1 
LCDOUT $FE,$80,"SENSOR HATASI"

GOTO BASLA
END


Bu sefer de ISIS LCD hatası veriyor.
[HD44780] Controller received data whilst busy.

ete

LCD tanımlamalarını göremedim programında?

DEFINE LCD_DREG	PORTB	    'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB     'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000     ' LCD komutlari arasinda bekleme suresi
DEFINE LCD_DATAUS 50


Ete

veliusta

Alıntı yapılan: ete - 09 Haziran 2013, 18:19:14
LCD tanımlamalarını göremedim programında?

DEFINE LCD_DREG	PORTB	    'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB     'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000     ' LCD komutlari arasinda bekleme suresi
DEFINE LCD_DATAUS 50


Ete

Teşekkürler çalıştı. Devre için Isı tanımı yanlış olmuş. Birde Şu Virgülden sonraki basamak neden çalışmıyor? Gerçi bu sensör için olmasa olur da merak ettim.

veliusta

'****************************************************************
'*  Name    : DHT11 SENSOR                                      *
'*  Author  : [VELI USTA]                                       *
'*  Notice  : Copyright (c) 2013 [USTA ELEKTRONİK]              *
'*          : All Rights Reserved                               *
'*  Date    : 07.06.2013                                        *
'*  Version : 1.1                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A                     'İşlemci 16F628A
@ DEVICE pic16F628A, WDT_ON             'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON            'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF        'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF           'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak.
'------------------------------------------------------------------------------
DEFINE OSC 4

DEFINE LCD_DREG PORTB     'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB     'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000     ' LCD komutlari arasinda bekleme suresi
DEFINE LCD_DATAUS 50

TRISA=%00000001      'A portu A.0 giriş diğerleri çıkış yapıldı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0
CMCON=7

SURE    VAR BYTE
I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control VAR BYTE

symbol dta=portA.0 'sensor dATA PİNİ PORTA.0 A BAĞLI

LCDOUT $FE,1
PAUSE 500
LCDOUT $FE,$80," EKRAN ACILIYOR "
LCDOUT $FE,$C0,"   VELi USTA    "
PAUSE 2000
LCDOUT $FE,1

BASLA:

output dta
LOW DTA
Pause 18       '18 ms bekle
HIGH DTA           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
WHILE DTA=0:WEND
PAUSEUS 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 
   Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  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
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  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 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=1:wend
 
Next

LCDOUT $FE,1 
LCDOUT $FE,$C0,"  NEM = ",DEC TAMRUT,".",DEC ONDARUT," %"
LCDOUT $FE,$80,"SICAKLIK = ",DEC TAMISI,"°C"
PAUSE 500

GOTO BASLA

hata:
LCDOUT $FE,1 
LCDOUT $FE,$80," SENSOR HATASI! "

GOTO BASLA
END


° sembol dışında hata yok! Teşekkürler.

ete

#51
Programa bakınca Ondalık ISI değeri LCD ye verilmemiş. Sıcaklığın ondalık kısmı çalışmıyorsa sebebi budur.
Rutubet verilmiş ama sıcaklık ondalık kısmı verilmemiş.

LCDOUT $FE,1  
LCDOUT $FE,$C0,"  NEM = ",DEC TAMRUT,",",DEC ONDARUT," %"
LCDOUT $FE,$80,"SICAKLIK = ",DEC TAMISI,",",dec ONDAISI,"°C"
PAUSE 500


Ete

veliusta

#52
Alıntı yapılan: ete - 10 Haziran 2013, 08:26:11
Programa bakınca Ondalık ISI değeri LCD ye verilmemiş. Sıcaklığın ondalık kısmı çalışmıyorsa sebebi budur.
Rutubet verilmiş ama sıcaklık ondalık kısmı verilmemiş.

LCDOUT $FE,1  
LCDOUT $FE,$C0,"  NEM = ",DEC TAMRUT,",",DEC ONDARUT," %"
LCDOUT $FE,$80,"SICAKLIK = ",DEC TAMISI,",",dec ONDAISI,"°C"
PAUSE 500


Ete

Ondalık kısmı çalışmadığından zaten sildim.

NeM ve sıcaklığında ondalık kısmı çalışmıyor du. hep 0 da duruyor.

ete

Bu sensörü hiç kullanmadım. Bu nedenle neden çalışmadığını bilemiyorum.
Ete

veliusta


ete

Aslında düşündümde bu sensörde ondalık kısım aynen tamsayı mantığı ile okunmaktadır. O halde ondalık çıkmıyorsa sensör kesin arızalıdır diye düşünürüm ben. Başka izah tarzı yok.
Ete

yankigsm


     datasheet baktığımda resolution 1 derece ve 8 bit olarak görünüyor
belkide ben yanlış anlamışımdır ama görünen bu.

bilsisco

#57
Denenmiş ve çalışan dosyaları yüklüyorum
Emeği geçen herkese Allah razı olsun

Include "modedefs.bas"         
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16f628A, BOD_OFF
@ DEVICE pic16f628A, LVP_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16f628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

DEFINE OSC 4
'-------------------------- LCD Tanımlama --------------------
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'DEFINE LCD_COMMANDUS 2000   ' Set command delay time in us
'DEFINE LCD_DATAUS 50        ' Set data delay time in us

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

SURE    var byte
I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
control var byte
DERECE  CON 223     ' ° işareti

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


BASLA:


output  dta
LOW     DTA
    Pause   18      '18 ms bekle
HIGH    DTA         'Data pinini High yap
    Pauseus 40      '40 us bekle
input   dta
WHILE   DTA=0:WEND
PAUSEUS 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 
  Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  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
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  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 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  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
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=1:wend
 
Next
    LCDOUT  $FE,1
    LCDOUT  $FE,$80,"NEM=",DEC TAMRUT,"%"        ',DEC ONDARUT
    LCDOUT  $FE,$C0,"ISI=",dec TAMISI,derece,"C" ',DEC ONDAISI
    PAUSE   200

GOTO BASLA

hata:
    LCDOUT  $FE,1,"SENSOR HATASI"
    PAUSE   200
GOTO BASLA

END

bilsisco

Sensör Çin malı olup içinde sıcaklık için ntc ve nem için bakır yollar bulunan plaket kullanılmıştır.
Ayrıca piyasadaki Sensiron firmasına ait SHT11 e alternatif olarak üretilmiş,
farklı iletişim protokolleri kullanan, sht11 e kıyasla çok ucuz bir sıcaklık-nem sensörüdür.
Dht11 in plaketli olanından almanızı tavsiye ederim(daha doğru nem ölçüyor),
plaketsizine oranla 1-2 lira farklı.


karabayram

#59
Devre çalışıyor ama sadece ilk açıldığına okuyor bir daha okumuyor .reset yaptıktan sonra tekrar okuyor bir daha okumuyor. tekrar reset yapman gerekiyor.


Powered by EzPortal