Gönderen Konu: Pic16F628A ile DHT22 Sensör Kullanımı Hk.  (Okunma sayısı 1029 defa)

Çevrimdışı ete

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 7584
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #15 : 13 Ocak 2017, 13:51:11 »
Enteresan. Başlangıçta bende aynı yere koymuştum ama isis de çalıştırınca sensör hatası meydana geliyor bu şekilde. Gerçek devrede gelmiyorsa sorun yok.

Ete

Çevrimdışı has_artvin_li

  • Yeni Üye
  • *
  • İleti: 30
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #16 : 06 Mayıs 2017, 01:47:44 »
Herkese selamun aleyküm hayırlı geceler diliyorum.

Sayın ETE hocam ve  anlhlc hocam özellikle bu yükü size yüklemek istiyorum :)

Şimdi bir projemde Pic ile kullanılmak üzere DHT11 ile çalışma yapmam gerekiyor lakin bu dht11 in çalışma mantığını anlayamadım.

Datasheetine bakıyorum 1-wire iletişim ile çalıştığını söylüyor.

Reset sinyali yolluyor ardından da dht11 i okumaya geçiyor mantığında bir yazı var datasheetinde, Ama bu reset sinyalini aslında birazcık farklı tasarlamış gibi yani haberleşme pinini bir müddet lojik 1 de saklıyor sonra lojik 0 e çekiyor 40mikro saniye bilmem ne yapıyor falan...

Hadi bunlar o kadar sorunlu şeyler değil de asıl mesele ve anlamadığım kısım şurası:

4 byte alanda olmak üzere 1 byte nem tam - 1 byte nem ondalık değeri 1 byte ısı tam - 1 byte ısı ondalık değerini desimal olarak okur getirir registere yazar diyor.

Ardından da bir tane byte ile de doğru haberleşip haberleşemediğini kontrol etmeye çalışıyor bu da mantıklı yani şöyle :
nem tam + nem ondalık + ısı tam + ısı ondalık = kontrol şeklinde bir mantığa dayatmış yani sensörün yolladığı en son byte nem ve ısı tam ve ondalık değerlerinin komplesinin toplamı gibi bişiy olmuş oluyor...

Lakin owreset ve read komutları ile okuma yapıyorum hiç bir değer almıyor ? dahası var madem bu sensör 4 byte ile ısı ve nem bilgilerini veriyor yani 1 byte nem tam 1 byte nem onda ve 1 byte ısı tam 1 byte ısı onda biz bunu neden olduğu gibi şu şekilde :

PRINT AT 1,1,"NEM : ",#NEM_TAM," . ",#NEM_ONDA
PRINT AT 2,1,"ISI : ",#ISI_TAM," . ",#ISI_ONDA      yazdıramıyoruz ?

Proton basic ile yahutta mikro C ile yazılım yapabilmeye çalışıyorum bununla uğraşan kimse var ise bir el atabilir mi ?

Şöyle tepeden tırnağa bir anlatım ile anlamak istiyorum olayın mantığını Yani programın içine birilerinin yazdığı kütüphaneleri katmadan işin mantığını anlayarak özüne inerek anlamak istiyorum mümkünatı var ise ?



Çevrimdışı ete

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 7584
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #17 : 06 Mayıs 2017, 07:48:46 »
Tamamen yüzeysel bir data sheet incelemesi yaptığını ve ne anlatıldığına çok dikkat etmediğini anlıyorum yazdıklarından.
Sensör üreten her firma farklı bir haberleşme formatı uyarlamak zorunda aksi halde diğerleri ile karışıklık yaratır. Bu firmada kendi sensörü için farklı bir yapı oluşturmuş. Her şey start sinyali ile başlıyor. Bu sanki bir hareketi referans noktasına almak gibi bir şey. Bu start sinyalini verdiğin zaman sensör okunacak duruma geiyor. Bu konuda en iyi ref bilgisi aşağıdaki linkte verilen data sheet ;
https://akizukidenshi.com/download/ds/aosong/DHT11.pdf
Start sinyali için HOST yani işlemci kartı data hattını 18 ms süre ile LOW da tutacak ve ardından Data hattını giriş yapıp bırakacak. Bu SLAVE olan sensöre okuma yapacağım bilgisini veriyor ve bu sefer hattı sensör alıyor.
BU sefer sensör aynı Data hattını 80us LOW ve 80us HIGH da tutuyor. Buda HOST'a emri aldım data ları veriyorum bilgisi oluyor.
İşte bu noktadan sonra HOST bilgileri almak zorunda. Şimdi de asıl önemli konu olan bu bilgiler nasıl alınacak ona bakalım.
LOW bilgisi , 50us LOW + 26-28us HIGH sinyalinden oluşuyor.
HIGH bilgisi, 50us LOW + 70us HIGH sinyalinden oluşuyor.
Dikkat edilirse başlangıç sinyali ikisinde de 50us lik bir LOW o halde bu bize bir sinyali belirlemede yardımcı olamayacağına göre biz bundan sonraki HIGH kısmına bakmamız gerekecek. Bir HIGH sinyali bekleyeceğiz ve süresine bakacağız Süre 70 den küçük ise bu bir LOW dur değilse HIGH dır. Bu işi kolay yapmanın bir yolu da 50us lik LOW sinyalinden sonra 40us bekleyip Data hattına bakmak olurdu. Data hattı hala 1 ise sinyal HIGH dır. Daha hattı LOW olmuş ise sinyal LOW dur demek gerekir.
İşin püf noktası burası işte.
Yapılabilecek en büyük hata bu sinyalleri OWin OWout ile okumaya çalışmak. Bu her gördüğün adamı baban sanmakla eş değer bir şey. Zira söz konusu komutlar özellikle Maxim firmasının DS serisi sensörlerini okumak için yaratılmış komutlar ve her türlü one-wire haberleşmeye uyacak diye bir kanunu yok. Onun formatı başka bunun formatı daha başka. O halde yapılması gereken şey data sheet ne diyor sa ona uymak.
Devam edelim. DHT-11 data sheet diyorki bu şekilde 40 bitlik bir data okuyacaksın.
Bunu 5 adet 8 bitlik data şeklinde okumak gerekiyor. Bu şekilde okunmuş bir data paketinde;
ilk 8 bitlik kısım sana Rutubet High.Byte kısmını veriyor. Yada tamsayı kısmını veriyor desek daha doğru olur.
İkinci 8 bitlik değer ise Rutubet in ondalık kısmı oluyor.
Üçüncü 8 bitlik değer Sıcaklık tam sayı kısmı ve dördüncü 8 bitlik değerde sıcaklık ondalık kısmını vermiş oluyor.
Son okunan bilgi ise parity byte yada doğrulama byte'ı oluyor. İlk 4 bilgiyi toplarsan toplanan bilgi sürekli olarak 8 biti aşıp aşılan kısım otomatik atılacak ve sonunda elinde 8 bitlik bir sayı kalacaktır. Bu sayı da en sondaki parity byte ile aynı olmalıdır. Değilse okuma yanlıştır deyip yeniden okuma yapılmalıdır.
Yukarıda açıklanan data formatı ile okuma örneği gerekiyor ise işe yine start sinyalinden başlayalım;
Kod: [Seç]
OUTPUT DTA  'data hattı çıkış yapıldı
LOW DTA       'data=low yapıldı
Pause 18       '18 ms bekle
HIGH DTA      'Data pinini High yap
Pauseus 40   '40 us bekle
INPUT DTA    'Data hattını giriş yap
WHILE DTA=0:WEND  'data=0 olduğunca bekle
PAUSEUS 85  'Data hattı High oldu 85 us daha bekle bu 80us lik LOW ve 80us HIGH sinyalini aşmak için kullanılmış oldu
Bu şekilde start sinyalini vermiş ve ardından sensörün cevabı olan 80uslik LOW ve 80us lik HIGH peryodunuda aşmış olduk.
Bu aşamadan sonra data bitleri başlayacak. Bunlarıda sırası ile almak için;
Kod: [Seç]
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
şeklinde bir kod kullandık. Burada temel fikir şu lojik bitlerin ilk 50uslik kısmı LOW dan oluşuyor. Bu süreyi HILE DTA=0:WEND ile aşıyoruz. Ardından Data hattı Lojik1 oluyor ve biz 40us bekliyoruz. Şayet lojik bit1 ise peşinden 70us lik HIGH gelecek idi ve biz 40us sonra hala 1 görmemiz lazım o data hattında . Şayet 0 görüyor isek sinyal lojik 0 demektir. İşte bunuda ,
IF DTA=1 THEN TAMRUT.0=1 ile ayarlayıp 1 sinyalinin devamını bitirmesi için altına WHILE wend komutunu ekliyoruz.
Başlangıçta TAMRUT=0 verdiğimz için 1 değilse sıfır yap diye bir şart kullanmıyoruz. Sadece 1 leri ayarlıyoruz. Böylece ksıa komut ile çokca iş yapılmış oluyor.
Diğer data bitlerinin alınması da tamamen aynı mantığa dayanıyor ve sadece değişkenleri değişiyor o kadar.
Bu kadar açıklamadan sonra kendin yapabilmelisin bunu.
Ete
 

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #18 : 23 Ekim 2017, 10:49:30 »
Hocam merhaba,
DHT22 sensöründen - (eksi) sıcaklık bilgisini nasıl alabiliriz.
Teşekkürler.

Çevrimdışı ete

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 7584
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #19 : 23 Ekim 2017, 13:22:21 »
DHT 22 sensörü *40 ile +80 derece arasında çalışıyor. Sıcaklık sıfırın üzerinde ise 15. biti daima sıfır olıuyor.
Sıcaklık eksiye düşünce 15.bit 1 oluyor . Bu senin ip ucun oluyor.
Sıcaklığı okuyacak ve Bit.15 e bakacaksın şayet 1 ise demekki sıcaklık eksi tarafta diye karar verip ona göre ekrana vereceksin.
Örnek vereyim, +17,5 derecede sensörden okunan bilgi 175 olacaktır.
Okunan bilgi binary olarak  %00000000 10101111 şeklinde olur.
-17,5 derece için sensörden okuyacağın bilgi ise %10000000 10101111  şeklinde olacaktır. Buna göre kendini ayarlarsın.

Ete

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #20 : 23 Ekim 2017, 13:30:52 »
Cevabınız için teşekkürler hocam datasheet inden buldum 15. bit olduğunu fakat picbasic te 15. biti hangi komut ile okuyacağımı bilmiyorum. Daha önce hiç böyle bir deneme yapmamıştım. kod konusunda yardımcı olursanız sevinirim.

Çevrimdışı ete

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 7584
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #21 : 23 Ekim 2017, 13:41:12 »
Sıcaklık okumasında kullandığın değişken ISI diyelim. IF ISI.15 (veya daha iyisi ISI.Bit15)=1 then EKSI_SICAKLIK
şeklinde yapılabilir. Yada 15 bit 1 ise işaret eksi yapılabilir.
Kod: [Seç]
IF ISI.Bit15=1 then 
  Isaret="-"
else
  ISaret="+"
Endif
şeklinde de yapılır.

Ete

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #22 : 23 Ekim 2017, 14:17:54 »
Hocam kodlar şöyle
Kod: [Seç]
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'***********Seri İletişim Dosyası***********
Include "MODEDEFS.BAS"

CMCON=7
DEFINE OSC 4

'***********LCD Tanımlamaları***********

  TRISA=%00000000
  TRISB=%00000000
    OPTION_REG.7=0
'****************************************************************
    PORTA=0
    PORTB=0





symbol DHT22=PORTA.1
I        VAR BYTE
TAMRUT   VAR WORD
ONDARUT VAR BYTE
TAMISI     VAR WORD
ONDAISI   VAR BYTE
CONTROL var byte
ISARET VAR BYTE
SAY VAR BYTE
SYMBOL VERI_BILGI=PORTB.6
SAY=0
VERI_BILGI=0

Basla:
 IF SAY=20 THEN
  GOSUB DHT22OKU
  SAY=0
  HIGH VERI_BILGI
  PAUSE 500
 ELSE
 SAY=SAY+1
  GOSUB GONDER
  PAUSE 250
  LOW VERI_BILGI
 ENDIF
   
     
   

Goto Basla

DHT22OKU:
           output DHT22
           DHT22=1:PAUSEUS 5
           DHT22=0
           pause 5      '1-10 ms bekle
           DHT22=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           INPUT DHT22
           PAUSEUS 5
           WHILE DHT22=0:WEND
           PAUSEUS 80

        '  IF DHT22=1 then GOTO DHT22_HATA
           
           
          TAMRUT=0
          FOR I=15 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND 
             PAUSEUS 30
             IF DHT22=1 THEN TAMRUT.0[I]=1
             WHILE DHT22=1:WEND
           NEXT

          TAMISI=0
          FOR I=15 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN TAMISI.0[I]=1
             WHILE DHT22=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 DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN CONTROL.0[I]=1
             WHILE DHT22=1:WEND
           NEXT
          OUTPUT DHT22
          DHT22=0
         
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10
         
          IF TAMISI.BIT15=1 THEN
           ISARET=0
           ELSE
           ISARET=1
           ENDIF
         
          RETURN
 GONDER:
 
serout2 PORTA.0,396,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
RETURN
 
 
 
 END

Hocam bu haliyle tamisi.bit15 ten sürekli 1 bilgisi geliyor. Ayrıca simulasyonda dht22 nin sıcaklığını - ye çektiğimde örneğin -1 yaptığımda ekranda 5.8 gösteriyo sıcaklığı düşürdükçe mesela -2 yaptığımda 6.8 gösteriyor. Sorun nerden kaynaklanıyor olabilir ?
« Son Düzenleme: 23 Ekim 2017, 14:18:56 Gönderen: anlhlc »

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #23 : 23 Ekim 2017, 14:25:56 »
özür dilerim ham değerden sorgulama yaptırmadığım için sürekli 1 gösterio onu halettim fakat sıcaklık - ye düştüğünde neden 4.8 fazlasını gösterdiğini çözemedim hocam

Çevrimdışı ete

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 7584
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #24 : 23 Ekim 2017, 14:45:04 »
Onu bende çözemem. Neden olduğunu anlamak zor. Gerçek devredemi oluyor bu ? yoksa simulasyondamı.
Simulasyon model dosyası hatası olabilir. Bu nedenle gerçeğinde denemek gerekir
Ete

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #25 : 23 Ekim 2017, 14:52:56 »
sıcaklık - ise ham ısı değerinden 48 çıkarttırdım şuan tüm değerlerde doğru gösteriyor. yani simulasyonda doğru gözüküyor.Programın son hali şu şekilde oldu.
Kod: [Seç]
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'***********Seri İletişim Dosyası***********
Include "MODEDEFS.BAS"

CMCON=7
DEFINE OSC 4

'***********LCD Tanımlamaları***********

  TRISA=%00000000
  TRISB=%00000000
    OPTION_REG.7=0
'****************************************************************
    PORTA=0
    PORTB=0





symbol DHT22=PORTA.1
I        VAR BYTE
TAMRUT   VAR WORD
ONDARUT VAR BYTE
TAMISI     VAR WORD
ONDAISI   VAR BYTE
CONTROL var byte
ISARET VAR BYTE
SAY VAR BYTE
SYMBOL VERI_BILGI=PORTB.6
SAY=0
VERI_BILGI=0

Basla:
 IF SAY=20 THEN
  GOSUB DHT22OKU
  SAY=0
  HIGH VERI_BILGI
  PAUSE 500
 ELSE
 SAY=SAY+1
  GOSUB GONDER
  PAUSE 250
  LOW VERI_BILGI
 ENDIF
   
     
   

Goto Basla

DHT22OKU:
           output DHT22
           DHT22=1:PAUSEUS 5
           DHT22=0
           pause 5      '1-10 ms bekle
           DHT22=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           INPUT DHT22
           PAUSEUS 5
           WHILE DHT22=0:WEND
           PAUSEUS 80

        '  IF DHT22=1 then GOTO DHT22_HATA
           
           
          TAMRUT=0
          FOR I=15 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND 
             PAUSEUS 30
             IF DHT22=1 THEN TAMRUT.0[I]=1
             WHILE DHT22=1:WEND
           NEXT

          TAMISI=0
          FOR I=15 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN TAMISI.0[I]=1
             WHILE DHT22=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 DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN CONTROL.0[I]=1
             WHILE DHT22=1:WEND
           NEXT
          OUTPUT DHT22
          DHT22=0
          IF TAMISI.BIT15=1 THEN
          TAMISI=TAMISI-48
          ISARET="-"
          ONDARUT=TAMRUT//10
          TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10
          TAMISI=TAMISI/10
           ELSE
           ISARET="+"
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10
          ENDIF
         
         
          RETURN
 GONDER:
 
serout2 PORTA.0,396,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
SEROUT2 PORTA.0,396,["G","M","F",tamisi,Ondaisi,tamrut,ONDARUT,SAY,ISARET]
RETURN
 
 
 
 END

Çevrimdışı anlhlc

  • Acemi Üye
  • **
  • İleti: 73
  • Hepsi Olur Zamanla
Ynt: Pic16F628A ile DHT22 Sensör Kullanımı Hk.
« Yanıtla #26 : 23 Ekim 2017, 14:54:14 »
Yardımınız için teşekkürler.
İyi çalışmalar.