dht22 (AM2302) sensör okuma.

Başlatan sinasos, 13 Nisan 2018, 21:41:01

sinasos

Hocam, Arkadaşlar, öncelikle hayırlı kandiller dilerim.
Size bir sorum olacak. Kuluçka sisteminde kullanılmak üzere DHT22 sensör kullanmak istiyorum ancak sistemde kilitlenmeler oluyor. Aylardır bunu araştırıyorum bir türlü içinden çıkamadım. En son yazılım konusunda iyi bir arkadaş sensör okumada bir hata olabilir dedi ve bunun üzerine yoğunlaşmamı istedi. Bende sizlere sormak istiyorum ! bu sensörü okumanın başka bir yolu varmı ? aşağıdaki ETE hocamın hazırladığı kodu kullandım ve arkadaşın söylediği acaba bu while wend döngüsü içinde mi takılıp kalıyor diye sesli düşündü, benimde aklım karıştı. sizler ne dersiniz ? sensörün bu şekilde kilitlenme yaptırması mümkün mü ? yoksa benim program da mı hata var. sensör okuma aşağıda ! Programın tamamı da ekte !
Selam ve saygılarımla.

SENSOROKU:

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





           TAMRUT=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE DTA=0:WEND 
               Pauseus 30
              IF DTA=1 then TAMRUT.0[I]=1
              while dta=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 DTA=0:WEND
               Pauseus 30
              IF DTA=1 then TAMISI.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 30
              IF DTA=1 then control.0[I]=1
              while dta=1:wend 
            Next
            output dta
            dta=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

 

fatih88

hayırlı kandiller
basic i kullanmayalı epey oldu ama sensör okuma kısmında pek sorun yok gibi muhtemel sorunun senin stack overflow yazılınıda fonksiyon dönüşlerinde sorun olabilir bu taşmaların sonucunda mcu sapıtıyordur dht22 kütüphanesini atmel için oluşturdum ve hobi için kuluçka yapan arkadaşıma yazılımı yapıp verdim gayet stabil çalışıyor ben sorun yaşamadım
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Sensör okuma kısmı tamamen sensör data sheeti üzerinden hazırlanmış ve sensör sağlam ise sorunsuz çalışması gereken bir kod parçası. Burada takılma oluyor is elinizdeki sensör arızalı yada besleme devrenizde parazit var yada pullup direnci yeterli değil. Programınızın diğer kısımlarından kaynaklanan bir stack taşması da olabilir. Bunları kontrol et bana kalırsa.
Ete

sinasos

Hocam merhaba,
dediklerinizi tek tek gözden geçirdim. Herhangi bir problem bulamadım, cihaz boşta (oda ortamında) çok stabil çalışıyor. Ancak birşey farkettim ! Küçük ortamlarda (kuluçka gibi) nem oranı arttığı zaman cihaz zamanlı-zamansız kilitlenme yapıyor. (Örneğin nem oranı %50-55 in üzerinde olduğunda !) Bu şekilde neden kilitlenme oluyor anlamadım ? Bu konuda fikriniz nedir ?
Saygılarımla.

fatih88

Dediğim gibi çok fazla basıc bilmiyorum ama sensör okuma kısmına time out yapılmalı başta while sensör=0 wend denmiş o bölümde sıfır gelmesse program orda donacaktır benim kanaatim
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Sensör sağlam olduğu müddetçe while wend döngüsünden çıkacak bilgiyi yollar. Sonuçta  tek telden haberleşen bir sensör bu. Bazen veri alır bazende veri verir. While - wend döngüleri sensörün cevap verme bölümlerine aittir ve cevap vermiyor yada veremiyor ise o sensör bozuktur yada cevap vermesini engelleyen bir sorun vardır. Bu sorunların ne olabileceğini önceden belirtmiştim sorun yok dedin. O halde yüksek nem oranlarında sensör sorun çıkartıyordur. Başka bir sebep göremiyorum.
Tabiiki sorun illaki while - wend döngüsü değildir. Başka sebeplerede bakmak lazım. Her şeyden önce sensörü değiştirip bakmak en doğrusu.

Ete

sinasos

hocam cevabınız için teşekkürler,
11 farklı sensör denedim, sonuç hepsinde aynı. Pull-Up direncini 10 k ila 1 k arasında değiştirerek denedim aynı. stack overflow  taşmasına baktım hata göremedim. Besleme kaynağını switch mode, trafo, akü şeklinde  değiştirdim aynı. o yüzden takılıp kaldım.

fatih88

Valla dostum daha önceden benim 18f452 ile yaptığım çok fonksiyonlu kuluçka vardı sht11 ve ds18b20 kullanmıştım çıkım alabilmek için sörekli kontrol ediyordum ara sıra donma bendede olmuştu dediğim gibi atmelde fonksiyon özelliği düşük yaptım dht22 ile sorunsuz çalışıyor bence biz pic mcu ları kullanamıyoruz galiba bir yerde sorun çıkıyor endüstriyel 3 fazlı motor çalışan sistemlerde de reset atıyordu ne yaptıysam olmadı aynı projeyi atmeldede bir deneyecem
https://youtu.be/3QwvdeWA3Ng
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

rexo

Alıntı yapılan: sinasos - 17 Nisan 2018, 18:47:33
hocam cevabınız için teşekkürler,
11 farklı sensör denedim, sonuç hepsinde aynı. Pull-Up direncini 10 k ila 1 k arasında değiştirerek denedim aynı. stack overflow  taşmasına baktım hata göremedim. Besleme kaynağını switch mode, trafo, akü şeklinde  değiştirdim aynı. o yüzden takılıp kaldım.
Sensör kablosu uzunluğu ne kadar ? kullandığınız kablo nasıl bir kablo acaba?

sinasos

Alıntı yapılan: rexo - 17 Nisan 2018, 22:19:44
Sensör kablosu uzunluğu ne kadar ? kullandığınız kablo nasıl bir kablo acaba?
20 cm ile 3 mt arasında birçok uzunluğu denedim. sensörün +5 - gnd arasına 100nf , pull-up direncini (1k-10k arası) yine sensör ayaklarına atarak da denedim. oda ortamında kilitlenme yok. Buhar verince ve belli bir yoğunluğa ulaşınca başlıyor kilitlenme.

ete

Bu sensörler kapasitif çalışır. Üzerine buhar verirseniz anında doyuma ulaşır ve devre dışı kalır. Sebebi ise buharın sıya dönüşüp sensörün algılama hücrelerini doldurmasıdır. Denemelerde ortama buhar verilmeli be en azından sensörden 1 m den uzağa yükseklere buhar verilmelidir.
Ete

sinasos

Hocam bir kuluçka makinasının içi zaten küçük. sensör ortalarda yer alıyor. buhar genellikle fanın önünde. bu durumdayken nem %55 civarı kilitlenme olayı başlıyor. bunun için yazılıma ekleyebileceğimiz birşeyler olabilirmi; ? örneğin sizin dediğiniz gibi doyuma ulaştığında o kısmını devre dışı bıraksa, en azından ayarlanan değere ulaşıncaya kadar. bu nasıl olabilir sizce ?

ete

#12
Elbette olabilir. En azından kilitlenme while-wend döngüsündemi oluyor bakmak gerek. Döngü içine bir sayaç koyup belli bir sayıdan sonra çıkması sağlanabilir.
Diğer bir çözüm de wdt altif etmek olur. Hele wdt süresi ayarlanabiliyor ise dahada iyi olur.
Şu anda seyehatteyim. Akşama yapmaya çalışırım.
Yada akşamı bekleme;
W var word tanımla.
Sensör okuma döngülerini şöyle yap.
While dta=0:wend yerine;
W=0
While dta=0
W=W+1:pauseus 5
If W=1000 then Return
Wend
Aslında return ile birlikte radan dönüyor ise sensör okunmamış olacak tekrar okumaya göndermek lazım bunun için bir bit değişkeni set edilip çıkılmalı.
Ete

sinasos

#13
Alıntı yapılan: ete - 18 Nisan 2018, 10:04:59
Elbette olabilir. En azından kilitlenme while-wend döngüsündemi oluyor bakmak gerek. Döngü içine bir sayaç koyup belli bir sayıdan sonra çıkması sağlanabilir.
Diğer bir çözüm de wdt altif etmek olur. Hele wdt süresi ayarlanabiliyor ise dahada iyi olur.
Şu anda seyehatteyim. Akşama yapmaya çalışırım.
Yada akşamı bekleme;
W var word tanımla.
Sensör okuma döngülerini şöyle yap.
While dta=0:wend yerine;
W=0
While dta=0
W=W+1:pauseus 5
If W=1000 then Return
Wend
Aslında return ile birlikte radan dönüyor ise sensör okunmamış olacak tekrar okumaya göndermek lazım bunun için bir bit değişkeni set edilip çıkılmalı.
Ete
Bu şekilde de sonuca ulaşamadım hocam ! Yine kilitlenme oluyor. Eğer röle çekili ise o şekilde değilse yine aynı şekilde kalıyor. Bir türlü kesemedim şu kilitlenme olayını !
Birde aklıma geldi ! wdt_on şeklinde yazdığımızda kilitlenme esnasında resetlemesi gerekmiyormu işlemcinin ? wdt nin başka bir kullanım şekli varmı hocam örneğin 1 dakika boyunca takılıp kalırsa reset atsa. (1 dakika, 2 dakika veya 3 dakika gibi... "bunu nasıl ayarlayabiliriz ki?")
yabancı bir sitede ;
DEFINE NO_CLRWDT 1
DEFINE CLRWDT 1
şeklinde komut gördüm bu şekilde ne yapmışlar anlamadım ? ben bu kodu eklediğimde ekran açar açmaz resetliyor aynı döngüde kalıyor.

fatih88

Wdt dakika bazında olmaz en yüksek değeri bildiğim kadarıyla 18ms olması lazim
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Powered by EzPortal