Y

DHT11 Sensörünü okuyamıyorum.

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

ete

#15
Döngülerde yer alan
AL>2 ifadesi yerine AL[I]>2 

yazılması gerekiyor.
Aslında Kod tag kullanılmadığı için böyle çıkıyor.
Yukarıdaki yazılanları düzeltiyorum. Oradan okuyup yeniden dene lütfen.
Ete

Reytabu

Hocam

Dediğiniz gibi döngüleri değiştirip tekrar denedim.
çıkan sonuç:

ısı=127,5 
nem=255,5

acaba sıcaklık artışına tepki verir mi diye sensöre nefesimle sıcak hava üfleyince ısı da 255,5
oluyor. Acaba SHT örneğinizdeki gibi bu datalar belirli işlemden mi geçecek?

Saygılarımla

ete

Programa açılış gecikmesi olarak Pause 1000 değerini ver. İlk açılışta 1000 ms içinde sensöre komut vermeyin diyorlar.
Bunun için 1000 ms lik bir açılış gecikmesi vermek yeterlidir.

Okunan değerleri ayrıca bir işlemden geçirmek gerekmiyor. Okunan değerler direk ekrana verilecek değerler olmalıdır.
Epeyce yaklaşmışız ama sorunu anlamak bu aşamadan sonra benim için zor gerçekten.
Normalde bu komutların çalışması gerekir idi.

Aşağıda bir link vereceğim orada verilmiş bir şema ve C dilinde yazılmış bir program var. Şemayı deney boardına kurup linkte verilen hex i bir denemeni isterim. En azından sensör sağlammı değilmi anlmaış oluruz.

http://www.sunrom.com/files/3732.zip

Ete

Reytabu

Çok teşekkür ederim hocam.

Verdiğiniz linkteki programı bir deneyeyim sonucu bildiririm.

Saygılarımla

Reytabu

#19
Ete hocam

Sayenizde işi epey kavradım. Ama tabii işi yapacak kadar değil.
Programı aşağıdaki gibi düzenleyerek AL değişkenindeki sensörden okunan
değerleri ekrana yazdırttım. 40 bitin değerleri 110 ile 255 arasında değişiyor.
Çoğunluk 255 . Bizim aradığımız rakam 7 (1 için) idi. Bu durumda sanırım
sensör hatalı sinyal gönderiyor. Ne dersiniz?



SURE var byte
I VAR BYTE
AL VAR BYTE[40]
TAMRUT VAR BYTE
X VAR BYTE

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

BASLA:
OUTPUT DTA   'Data pinini Çıkış yap

DTA=0            'data pinini LOW a çek
Pause 18       '18 ms bekle
DTA=1           'Data pinini High yap
Pauseus 40   '40 us bekle
Input DTA      ' data pinini giriş yap
Pulsin DTA,1,Sure 'high süresini yaz
PAUSEUS 80
IF SURE <> 8 THEN hata

FOR I=0 to 39
PULSIN DTA,1,AL
Next

FOR I=0 to 39
LCDOUT,#I ". BIT= ", DEC AL[I]

PAUSE 2000

Next

goto basla
HATA:
LCDOUT $FE,$80,"SENSOR HATASI"
end

ete

#20
Burada yazıldığı şekilde 40 adet biti okuyamazsın vede ekrana veremezsin. Okunan değerler mutlaka dizi değişenine sırası ile atılmalıdır. Aksi taktirde bir şey göremezsin. Hem değişken tanımlamanda hemde programda hatalar var.
Birincisi tamrutnisimli dizi değişkeni tanımlamışsın dizi olmayacak bu. Tanımlamada yanında yer alan [8] kısmını kaldır.
Okunan 40 adet değer al değişkenine verilmiş. Halbuki AL[I] değişkenine atılacak okunan değerler.
Ekrana yazdırırken doğru ifade kullanmışsın.
Ete

Reytabu

Alıntı yapılan: ete - 24 Şubat 2013, 09:24:23
Burada yazıldığı şekilde 40 adet biti okuyamazsın vede ekrana veremezsin. Okunan değerler mutlaka dizi değişenine sırası ile atılmalıdır. Aksi taktirde bir şey göremezsin. Hem değişken tanımlamanda hemde programda hatalar var.
Birincisi tamrutnisimli dizi değişkeni tanımlamışsın dizi olmayacak bu. Tanımlamada yanında yer alan [8] kısmını kaldır.
Okunan 40 adet değer al değişkenine verilmiş. Halbuki AL[I] değişkenine atılacak okunan değerler. Ekrana yazdırırken doğru ifade kullanmışsın.
Ete

Hocam

tamrut isimli değişkendeki diziyi iptal ettim.
Sitenizin yanıt sisteminde bir hata var sanırım.
Bahsettiğiniz AL değişkenini (AL [40]  ] olarak yazmama rağmen kaydettiğim zaman ekranda sadece AL olarak
çıkıyor. Sizin yanıtınızda olduğu gibi.

ete

Hata yok bunyüzden kod verilecek  ise normal ekrana vermeyin kod ekranına verin diyoruz.
Üstelik senin mesajlarını edit edebiliyorum. Edit ekranında onlar doğru gözüküyor. Maalesef söylediklerim doğru idi. Sen yinede düzeltilmiş şeklini dene.
Ete

Reytabu

#23
ETE hocam

Sensör arızalı olabir diye yeni bir sensör aldım.
Bu sensörde de sıcaklık ve nem olarak 255 rakamlarını görünce
(haddimi hoşgörün) programda bir hata olabileceğini düşünerek
programı parça parça test etmeye başladım.
AL[40] değişkenine programdan belirli değerler girince ( "1" için bite 7, "0" için bite 2)
program  girdiğim sıcaklık ve nem değerlerini veriyordu. Yani
Bu durumda sensörden okunan değerlerin AL değişkenine hatalı kaydedilmiş olabileceğine yorum yaptım.
. Pulsin DTA,1,AL

komutunu

.  Pulsin DTA,1,AL [I] 

değiştirerek denediğimde program anlamlı sayılabilecek sonuçlar vermeye başladı. Şöyle ki:

rutubet %64 stabil şekilde gözüküyor
sıcaklık 26 C, 13 C, 10 C , 56 C gibi değişiyor.

programa son haliyle bir göz atabilir misiniz? Doğru yoldamıyız?
Doğru yolda isek sıcaklık niye anormal değişiyor.

Saygılarımla
TRISA=0  'A portu çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0
CMCON=7
DEFINE OSC 4

SURE var byte
I VAR BYTE
AL VAR BYTE [40]
TAMRUT VAR BYTE
ONDARUT VAR BYTE
TAMISI VAR BYTE
ONDAISI VAR BYTE
X VAR BYTE
control var byte
symbol dta=portA.1 'sensor dATA PİNİ PORTA.1 A BAĞLI


BASLA:
PAUSE 1000
OUTPUT DTA   'Data pinini Çıkış yap

DTA=0            'data pinini LOW a çek
Pause 18       '18 ms bekle
DTA=1           'Data pinini High yap
Pauseus 40   '40 us bekle
Input DTA      ' data pinini giriş yap
pauseus 160
FOR I=0 to 39
PULSIN DTA,1,AL[I]
Next

TAMRUT=0:X=7
FOR I=0 to 7
IF AL[I]>5 THEN TAMRUT.0[X]=1
IF AL[I]<4 THEN TAMRUT.0[X]=0
X=X-1
Next

ONDARUT=0:X=7
FOR I=8 to 15
IF AL[I]>5 THEN ONDARUT.0[X]=1
IF AL[I]<4 THEN ONDARUT.0[X]=0
X=X-1
Next

TAMISI=0:X=7
FOR I=16 to 23
IF AL[I]>5  Then TAMISI.0[X]=1
IF AL[I]<4  Then TAMISI.0[X]=0
X=X-1
Next

ONDAISI=0:X=7
FOR I=24 to 31
IF AL[I]>5 Then ONDAISI.0[X]=1
IF AL[I]<4 Then ONDAISI.0[X]=0
X=X-1
Next

control=0:x=7
for I=32 to 40
IF AL[I]>5 THEN CONTROL.0[X]=1
IF AL[I]<4 THEN CONTROL.0[X]=0
X=X-1
NEXT



LCDOUT $FE,1 
LCDOUT $FE,$80,"RUTUBET =",DEC TAMRUT,",",DEC1 ONDARUT
LCDOUT $FE,$C0,"SICAKLIK=",DEC TAMISI,",",DEC1 ONDAISI
PAUSE 100

GOTO BASLA

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

ete

#24
Sensörden 40 adet bilgi okunuyor. Bu bilgileri sonradan kullanacağımız için her birini ayrı bir hafıza gözüne yerleştirmemiz gerekir. Bununda yolu bir index yada başka bir deyişle dizi değişkeni kullanmaktan geçer. Örneklerimde verdiğim kod dizi değişkeni kullanıyor idi. Ancak kod tag kullanmadan mesaj yazdığımız için ekrana bu index değeri olmadan yalnız AL olarak çıktı. Halbuki doğrusu AL(I) şeklinde olmalı idi. Nedir bu index değişkeni. Okunan her bir bilgi index değeri ile belirlenen adrese yerleştirilir. Örneğimize bakacak olursak I değişkenine 0 ile 39 arasında değer veriyoruz. İlk okunan süre bilgisi I=0 olunca sıfır nolu hafızaya, bir sonrakinde I=1 olduğu için ikinci hafızaya ve böyle devam ederek son okunan da 39 nolu hafızaya yerleşir. Halbuki AL değişkenini parantez içinde I olmadan kullanırsanız okunan her değer sıfır nolu hafızaya yazılır. Bu ise yalnızca tek hafızalık bilgi depoladığınızı gösterir.

Programda high bitlerinin tespitinde 2 yerine 5 kullanmışsın. Bunu ben vermemiştim. Bu yanlış. Data sheet derki low biti 54us low ve 24us high, high biti için 54us low ve 70 us high sinyali verilir. Her iki bitin başlangıç sinyalleri aynı hep 54 us low ile başlıyor. Bize farklı sinyal lazım. O halde high kısımlarına bakalım. High kısım 24 us ise bit= low dur. High kısım 70 us ise bit=high dır.
Pulsin komutu süreyi okurken her 10 us de bir artar. Yani 70 us okunurken okunan değer 7 olarak verilir. 24 us için ise 2 değeri okunur. O halde biz değerlendirme yaparken ,
AL(I)>2 ise bit=1 dir demek lazım. Sen burada 2 yerine 5 kullanmışsın. Sonucu fazla etkilemez zira okunan değerler ya 2 yada 7 olacaktır. Bu nedenle okunan değerleri kontrol etmek lazım. Şayet bundan farklı değerler çıkıyor ise donanım kısmında bir sorun var demektir.

Programın baş kısmında 160 us lik bir gecikme var. Buda yanlış. Nedeni şu;
Sensör okuma emrini alınca aldım diyebilmek için 54us low ve 80us high sinyali çıkartıyor. Bu aşamadan sonra 40 adet data bitini peş peşe veriyor.
O halde 54+80=134 us eder. O halde bu kadar süre bekledikten sonra data bitleri alınmaya başlanmalıdır.
Aslında bir kaç nokta daha var bana göre lüzumsuz.
Bitleri ayıklarken, TAMRUT=0 komutunu verdinmi TANRUT değişkeninin bütün bitlerini sıfır yapmış olursun.
Ayrıca altınba bir kerede
IF AL[I]<4 THEN TAMRUT.0[X]=0 şeklinde bir komut vermen anlamsız. Bitler zaten sıfır sen sadece bitleri HIGH yapan komut satırını koyman yeterli olacaktır.
Birde en sonda döngüyü 32 to 40 arasında kurmuşsun ki buda yanlış. 32 to 39 olması gerekir. 32 to 40 dedinmi 9 defa döngü çalışacak demektir. Halbuki işlediğin bilgi 8 bit. Zaten dizi değişkenini 40 parametreli (0-39) olarak tanımladık.
Programın benim mantığımna göre olması gereken şeklini aşağıda veriyorum. Dene istersen.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : E.T.E]                                            *
'*  Notice  : Copyright (c) 2013 [İzinsiz Kullanılamaz]         *
'*          : All Rights Reserved                               *
'*  Date    : 01.03.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
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
AL      VAR BYTE [40]
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control var byte
symbol dta=portA.1 'sensor dATA PİNİ PORTA.1 A BAĞLI

PAUSE 500

BASLA:
LOW DTA
Pause 18       '18 ms bekle
DTA=1           'Data pinini High yap
Pauseus 40   '40 us bekle
PULSIN Dta,1,SURE  '80 us lik hig süresini aldıktan hemen sonra data bitlerini alacak

FOR I=0 to 39
PULSIN DTA,1,AL[I]  'dat pini otomatikman giriş yapıldı
Next

TAMRUT=0:X=7
FOR I=0 to 7
IF AL[I]>2 THEN TAMRUT.0[X]=1
X=X-1
Next

ONDARUT=0:X=7
FOR I=8 to 15
IF AL[I]>2 THEN ONDARUT.0[X]=1
X=X-1
Next

TAMISI=0:X=7
FOR I=16 to 23
IF AL[I]>2  Then TAMISI.0[X]=1
X=X-1
Next

ONDAISI=0:X=7
FOR I=24 to 31
IF AL[I]>2 Then ONDAISI.0[X]=1
X=X-1
Next

control=0:x=7
for I=32 to 39
IF AL[I]>2 THEN CONTROL.0[X]=1
X=X-1
NEXT


LCDOUT $FE,1 
LCDOUT $FE,$80,"RUTUBET =",DEC TAMRUT,",",DEC1 ONDARUT
LCDOUT $FE,$C0,"SICAKLIK=",DEC TAMISI,",",DEC1 ONDAISI
PAUSE 800

GOTO BASLA

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

Ete

Reytabu

Hocam

Düzenlediğiniz kodları aynen pic e yükleyerek denedim. Yine Hatalı ve değişken sonuçlar veriyor.
Sıcaklık ve nem 0 ile 110 arası değişiyor. Sıcaklık =10 nem=25, sıcaklık=28 nem=60 gibi.

Sensörden alınan dataları ekrana getirmek için aşağıdaki kodları yükledim.
Ekrana çıkan sonuç süre=8      0 -23 bitler arası çıkan değerler 1 ve 2 olarak değişiyor.24-39 arası bitler  0 olarak gözüküyor.
Hiç 7 (high biti) rakamı göremedim. AL değişkeni değerlerini yazdığım bu programla okuyamadım galiba.
DEFINE OSC 4

TRISA=0  'A portu çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0
CMCON=7
A VAR BYTE
SURE    var byte
I       VAR BYTE
AL      VAR BYTE [40]
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control var byte
symbol dta=portA.1 'sensor dATA PİNİ PORTA.1 A BAĞLI

PAUSE 500

BASLA:
LOW DTA
Pause 18       '18 ms bekle
DTA=1           'Data pinini High yap
Pauseus 40   '40 us bekle
PULSIN Dta,1,SURE  '80 us lik hig süresini aldıktan hemen sonra data bitlerini alacak

FOR I=0 to 39
PULSIN DTA,1,AL[I]  'dat pini otomatikman giriş yapıldı
Next I
LCDOUT $FE,1 
LCDOUT $FE,$80,"SURE =",DEC SURE
PAUSE 1000

FOR I=0 to 39
LCDOUT $FE,1 
LCDOUT $FE,$80,DEC I,".BIT =",DEC AL[I]
PAUSE 1000
NEXT


End

ete

#26
Hic high olmada okuduğun bütün değerler sıfır olması gerekir öyle değilmi. Sıfırdan farklı sonuçlar elde ettiğine göre high olabiliyor. Bana kalırsa devrende sorun var gözüküyor. Birde okuma sıklığını iyice düşür bakalım.
Ete

Reytabu

#27
Hocam,

Devreyi  aşağıda linkini verdiğiniz c dilindeki programa göre tekrar kurdum.
http://www.sunrom.com/files/3732.zip

C dilindeki program kararlı bir şekilde çalışıyor.Şu an için  %24 sıcaklık , %36 nem.

Bizim program ise okuma sıklığını iyice düşürmeme rağmen aynı şekilde kararsız ve hatalı sonuçlar veriyor.
Linkteki C dilindeki programı Basic'e çevirebilsek iş hallolacak. Hem C hem Basic bilen arkadaşlardan yardım lütfen

ete

#28
Verdiğin linkteki program mantığını inceledim ve aşağıdaki kodu yazdım.
Dene bakalım çalışacakmıdır.

Ete
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
DEFINE OSC 4

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

CHECK   VAR BYTE
SAYI    VAR BYTE
KESTI    var byte
I       VAR BYTE
'AL      VAR BYTE [40]
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
CHECKSUM var byte
symbol DTA=PORTA.1 'sensor dATA PİNİ PORTA.1 A BAĞLI
SYMBOL TMR2ON=T2CON.2
SYMBOL BAYRAK=PIR1.1

PAUSE 500
PR2=0
T2CON=0
INTCON=%11000000
PIE1.1=1 'TMR2 kesmesi açılmış oldu
on INTERRUPT GOTO KESME

BASLA:
      GOSUB START_VER
      GOSUB CEVAP_AL
      IF CHECK=1 THEN
        GOSUB HATA
        PAUSE 1000
        GOTO BASLA
      ENDIF
      GOSUB BYTE_AL:TAMRUT=SAYI
      GOSUB BYTE_AL:ONDARUT=SAYI
      GOSUB BYTE_AL:TAMISI=SAYI
      GOSUB BYTE_AL:ONDAISI=SAYI
      GOSUB BYTE_AL:CHECKSUM=SAYI

      LCDOUT $FE,1 
      LCDOUT $FE,$80,"RUTUBET =",DEC TAMRUT,",",DEC1 ONDARUT
      LCDOUT $FE,$C0,"SICAKLIK=",DEC TAMISI,",",DEC1 ONDAISI
      PAUSE 500

      GOTO BASLA

START_VER:
          OUTPUT DTA
          DTA=0
          PAUSE 20
          DTA=1
          PAUSEUS 30
          INPUT DTA
          RETURN
         
CEVAP_AL:
'ilk etapta dta=0 olmasını bekleyeceğiz.
'TMR2 yi başlatacağız. DTA=0 olduğu müddetçe TMR2 kesmesi oluşmamış ise cevap geliyor demektir.
'TMR2 kesmesi, oluşmuş ise KESTI=1 olacak ve bu sensörün çalışmadığını gösterecek.
   
      KESTI=0:TMR2=0:TMR2ON=1 ' on yapılacak
      WHILE DTA=0 AND KESTI=0:WEND
      IF KESTI=1 THEN
        CHECK=1:RETURN
      ELSE
        TMR2=0:TMR2ON=1
      ENDIF 
      WHILE DTA=1 AND KESTI=0:WEND
      CHECK=0
      IF KESTI=1 THEN CHECK=1
      TMR2ON=0
      RETURN     
                                       
BYTE_AL:
        SAYI=0
        FOR I=7 TO 0 STEP-1
          WHILE DTA=0:WEND
          TMR2=0:TMR2on=1
          WHILE DTA=1:WEND
          TMR2ON=0
          IF TMR2>40 THEN SAYI.0[I]=1
        NEXT
        RETURN         
         
HATA:
     LCDOUT $FE,1
     LCDOUT $FE,$80,"SENSOR HATASI"
     RETURN

disable
KESME:
      KESTI=1     'aşım var     
      TMR2on=0   'tmr2 kesmesini kapattık
      bayrak=0   'kesme bayrağını sıfırladık
      resume
      enable
End

Reytabu

Ete hocam

Emek verip programı tekrar yazmışsınız. Çok teşekkür ederim.

Programı yükledim ve denedim fakat sensör hatası veriyor.

Gözünüzden bir şey kaçmış olmasın bir bakabilir misiniz lütfen?

Saygılarımla


Powered by EzPortal