avatar_POWER

dht11 ile ısı ve nem bilgisini led display'de gösteme problemi

Başlatan POWER, 29 Ocak 2017, 23:25:16

POWER


dht11 ile nem ve ısı bilgisini lcd ekranda gösteren ete hocamın proğrmını değiştirerek led dısplay ile yapmaya çalıştı ama bir türlü başarılı olamadım. işte proğram hata nerde acaba?
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : E.T.E]                                            *
'*  Notice  : Copyright (c) 2013 [İzinsiz Kullanılamaz]         *
'*          : All Rights Reserved                               *
'*  Date    : 25.06.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :DHT-11 sensör okuma programıdır.                   *
'****************************************************************
define OSC 4
Include "MODEDEFS.BAS"

@ DEVICE pic16F628A
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

TRISA=%00000000
TRISB=%00010000
PORTA=0
PORTB=0

CMCON=7       'komparatörler iptal

I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control var byte
SAYI    VAR BYTE
symbol dta=portB.4 'sensor dATA PİNİ PORTA.0 A BAĞLI

PAUSE 1500
GOSUB EKRAN
GOSUB SENSOROKU

BASLA:
      GOSUB EKRAN
      GOSUB SENSOROKU
     
      goto BASLA

SENSOROKU:
    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 GOSUB HATA

'''-----------------------------------------------------------------------------
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
'''-----------------------------------------------------------------------------
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
'''-----------------------------------------------------------------------------
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
'''-----------------------------------------------------------------------------
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
RETURN
'''-----------------------------------------------------------------------------
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

IF (TAMRUT+ONDARUT+TAMISI+ONDAISI=CONTROL) THEN RETURN

EKRAN:
       X=TAMISI DIG 1 'Dig 0  'ISI2'nin birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.2=1
       PAUSE 3
       PORTB.2=0
                   
       X=TAMISI DIG 0 'Dig 0 'ISI1'in birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.3=1
       PAUSE 3
       PORTB.3=0
                             
       Return

AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,64,121,80],SAYI
       Return
       
Cevir:
PORTA.0=SAYI.0
PORTA.1=SAYI.1
PORTA.2=SAYI.2
PORTA.3=SAYI.3
PORTA.4=SAYI.4
PORTA.6=SAYI.5
PORTA.7=SAYI.6
    RETURN
     
HATA:
       X=11
       GOSUB AL
       GOSUB Cevir
       PORTB.2=1
       PAUSE 3
       PORTB.2=0
           
       X=12
       GOSUB AL
       GOSUB Cevir
       PORTB.3=1
       PAUSE 3
       PORTB.3=0
       RETURN

END

ete

Hata display sürmende gözüküyor. Taramalı sistemde display bilgisi diplaye port üzerinden yüklenir ve o displayi süren ortak uç aktif edilerek rakamın displayda gözükmesi sağlanır. 1-3 ms beklenir ve ortak uç kapatılarak bir sonraki displaye aynı işlem uygulanır. Senin programın sürme kısmına bakalım;
EKRAN:
       X=TAMISI DIG 1 'Dig 0  'ISI2'nin birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.2=1 'burada önceki ortak ucu pasif ettin Şimdi sıra displaye sayı değerini yüklemekte
       'işte burada sayı değeri yüklenmesi lazım nerede? koymamışsın sorun bu işte.
       PAUSE 3  '3 ms bekledin bu da yanlış ortak uç aktif edildikten sonra 3 ms beklemen gerekiyor.
       PORTB.2=0 ' burada ortak ucu aktif etmişsin ama bundan sonra 3 ms bekletmen gerekiyor idi. 

İşin doğrusu şöyle olmalı;
EKRAN:
       X=TAMISI DIG 1 'Dig 0  'ISI2'nin birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.2=1
       PORTA=SAYI & %00011111  'Sayı nın 0-4 arası bitlerini alıp PortA ya verdik
       PORTA=PORTA+(SAYI & %01100000) '5 ve 6 cı bitleri portA ya ekledik
       PORTB.2=0
       PAUSE 3

Bu yalnızca birinci displayin sürülmesini gösteriyor benzer işlemi diğerinede uygulayacaksın onuda sen yap artık.
Birde eksiklik gördüm,
IF (TAMRUT+ONDARUT+TAMISI+ONDAISI=CONTROL) THEN RETURN satırından sonra ne olacak?
Yani o toplam sonucu Control'a eşit değil ise ne olacak? Program Ekran kısmına geçecek ki buda pek doru olmuyor. Doğrusu o satırdan sonra okuma doğru yapılmamış deyip GOTO SENSOROKU şeklinde yeniden sensör okumaya yollaman gerek bana kalırsa.

Bir şey daha ekleyeyim. Kullandığın display Ortak Anot mudur Ortak katodmudur belli değil. Ortak uçları port dan sürmüşsün arada da NOT elemanı kullanarak verilen bilgiyi ters çevirmişsin. O displayler sanki Ortak Katod gibi duruyor bu durumda ortak ucu aktif etmek için Portdan HIGH çıkarman , pasif etmek için LOW çıkarman gerekir.
Displayler Ortak Anot ise Aktif etmek için Portdan LOW çıkarman , pasif etmek için ise HIGH çıkarman gerekir.
Display sürme kısmında neyi neye göre yaptığın çok belli olmuyor . Bu nedenle kontrol etmeni öneririm.

Ete

POWER

İşin doğrusu şöyle olmalı;
EKRAN:
       X=TAMISI DIG 0 'Dig 0  'ISI2'nin birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.2=1
       PORTA=SAYI & %00011111  'Sayı nın 0-4 arası bitlerini alıp PortA ya verdik
       PORTA=PORTA+(SAYI & %01100000) '5 ve 6 cı bitleri portA ya ekledik
       PORTB.2=0
       PAUSE 3

Hocam,
kullandığım dısplay ortak katot.Dalayısıyla dısplayı çalıştırabilmem için önce ortak ucu aktif ediyorum 3 sn bekleyip ortak ucu pasif yapıtığım zaman dısplay yanıyor.

EKRAN:       
       X=TAMISI DIG 0 'Dig 0  'ISI2'nin birler basamağı
       GoSub AL
       GOSUB Cevir
       PORTB.2=1
       PORTA=SAYI &  %00011111
       PORTA=PORTA+(SAYI & %01100000)
       PAUSE 3
       PORTB.2=0 
RETURN

satırlarını eklediğim zanan  dısplay resimdeki gibi yanıyor.
[IMG]http://fs5.directupload.net/images/170130/o76k9iv9.gif[/img]

portb.2=0
pause 3

şeklinde yaparsam dısplay hiç yanmıyor.tahminice ortak anot için geçerli.
İşin içinden çıkamadım malesef.

ete

Bu sistemin doğru çalışmaması için elinden geleni yapmışsın aslında.
Öncelikle display anlamsız şekilde A portundan sürülüyor. Çok gerekli ise bir 595 ekle oraya onunla süre segmentleri.
Diğer taraftan 7 segment zaman paylaşımlı sürülmeli ve sürülme esnasında gecikme yaşanmamalı.
Malum gözü aldatmaya çalışıyoruz. Program bir yerde biraz beklerse göz hemen onu yakalar.
Bu programda yaklaşık 3-5 ms lik sürelerle her bir segmenti aktif ediyoruz. Peki DHT okuma kısmındaki;
PAUSE 18 gecikmesi ne olacak? onun bu dispaly sistemini engelleyeceğini düşünmen gerekirdi. Program o gecikmeye gelince 18 ms bekleyecek ve otomatikman displaylarden birisi göz kırpaya başlayacaktır.
Sonuçta böyle bir sistemin kusursuz çalışması için displaylerin 2 ms lik peryotlar halinde TMR0 kesmesi ile sürülmesi gerekir.
18ms lik sensördeki gecikme döngüsel gecikmeye yada TMR1 gecikmesine çevrilmesi gerekir.
Ben yinede elimden geldiği kadar sürülmesi için gerekenleri yaptım ilişiktedir.

Ete


POWER

gerçek devresinde denedim olmadı hocam.sebeblerini anlatmıssınız teşekkür ederim.Tavsileriniz doğrultusunda yeniden düzenlemeye çalışacağım.Yanlız displayın a portundan sürülmesindeki sakıncayı anlayamadım?

ete

PORTA nın iki sakıncası var. Birincisi bütün bitlerini dispalyi sürmek için kullanamıyorsun arada MCLR pini olan PORTB.5 var ve bu pin yalnızca giriş olabiliyor. Mecburen onu atlıyorsun. İkincisi Open collector olan PORTA.4 var onuda pullup direnci ile hallediyorsun ama isis bile o pine itiraz ediyor ve zaman zaman o pine ait segmenti sönük gösteriyor.
Display işinde zamanlama çok önemlidir ve işlemlerin en çabuk şekilde yapılması esasdır. Heleki taramalı sistemde bu çabukluk dahada önem kazanır. Bu neden PortA nın kullanımı imkansız değil ama bana göre sakıncalıdır.
Ete

POWER

Taramalı sistem ile başarılı olamayınca dısplayleri 595 ile sürmeye karar verdim.En azından bu sistemde zamanlamalar sorun olmayacak diye düşündüm.Ete hocamda bu yöntemi tavsiye etmişti zaten.Hazır elimde de 595 ile yapılmış pcb de vardı.fakat yine başarılı olamadım.anladığım kadarıyla dht11 okuyamıyorum.çünkü ekranda hep sıfır görüyorum.ne yaptım ise sonuç değişmedi hocam.

ete

Senin makinanda (PC) yada kullandığın Proteus da bir sorun olduğunu düşünüyorum.
Senin simulasyon şemanı kullanırsam devre çalışmıyor. Ama programın çalışıyor. Nasıl test ediyorum söyleyeyim.
Boş isis ekranına 1 ad. 628 bir adet dht11 koyuyorum. Senin programı gösteriyorum. Ekran falan yok ama TAMRUT ve TAMISI değişkenlerine adres verip Watch Window dan bakıyorum doğru okuyor.
Sonra üşenmedim senin 595 leri kopyalayıp bu devreye yapıştırdım oda çalıştı.
Tek bir hata varmış ekran gösteriminde TAMRUT yerine ONDARUT yazmışsın onu düzeltince her şey yerli yerine oturdu.
İlişiktedir.
Ete

onurinci

hocam grid'leri kaldırılmış bir ekran görüntüsü koyabilirmisiniz,malum isis'imiz eski..

ete


POWER

iyi geceler,
bu saate kadar çalıştım ama tam anlamıyla çalıştıramadım.öncelikle proteus 8.5 sp1 kurdum.eski versiyonlarda çizdiklerimde problemler oluyor dediğiniz gibi hocam.yeni versiyonda yeniden çizdim çalıştırdım. nispeten çalışıyor fakat çoğu zaman bir yerde takılıp kalıyor.yani sensöeden ısıyı değiştirsemde ekranda değişmiyor ve herhangi bir hatada vermiyor isis.
sensor okunun başlangıcındaki
for I=0 to 7
   gosub ekran
next 
satırını eklemisiniz hocam burayı aktif edersem simülasyonda %99 hatasız çalışıyor.bir sefer takıldığını gördüm çünkü.gerçek devrede ise ısı yada nem değişimi ekrandan hiç izlenmiyor.densör 20 dereceyi gösterirken ne kadar ısıtırsan ısıt ekrandaki değer hiç değişmiyor,enerjiyi kesip tekrar verirsem ısı 20 den 30 çıkmış oluyor ve 30 dan ne aşağı ne yukarı yönde değişmiyor.birde elime daha kaliteli başka pcb geçti 3 digit denemeleri onda yaptım, o yüzden yeni dosya olarak ekliyorum.en azından simülasyon da çalışıyor şimdilik inşallah gerçek devredede çalıştırmayı başarırız.

ete

Her zaman söylerim simulasyonda çalışan şey gerçek devrede de çalışmalı. Sadece simulasyonun varsayımlarına dikkat etmek ve onları kendi devrende uygulamak yeterlidir.
Gerçek devrelerde karşılaşılan sorunların başında parazit oluşumu gelir. Bunu gidermenin tek yolu kondansatör kullanmaktır.
Bu durumda ,
- Pic besleme bacaklarına 100nf seramik kondansatör atılmalıdır
- Sensör besleme bacaklarına en azında 10 Mf elektrolitik kondansatör ve ayrıca 100 nf kondasatör atılmalıdır. 100 nf gerekli ise atılabilir. Değilse çıkartılabilir
- Besleme devresinde regülatör 5V çıkışında ayrıca 100 mf olmalı ve yine orada da 100nf olmalıdır. Çoğu kimse 100nf regülatör çıkışına bağlayıp pic e ayrıca bağlamıyor aynı devre olmasına rağmen pic besleme bacaklarına en yakın yere mutlaka 100nf bağlayın.
denemelerde sensör için çok uzun kablo bağlantısı kullanmayın kullanmak zorundaysanız da ya bükümlü network kablosu yada blendajlı kablo kullanın blandaj daima GND ye bağlı olmalıdır.

Devrene baktım sorunsuz gözüküyor simulasyonda tabiiki takılmıyor. Çok uğraştım ama takılma olmuyor. Sebebi basit her türlü ortam koşulu mükemmel olarak uygulanıyor. Demekki senin devrende besleme ve parazit sorunu olması kuvvetle ihtimal. DHT sensörün pullup direncini 1K olarak kullan. KUvvetli pullup sorunları kısmen gidermede yardımcı olur.
Başkada diyecek bir şey yok maalesef.
Bu arada sensör okumadaki döngü sensör startup konumuna girdikten hemen sonra biraz gecikme vermek içindir. Döngüyü kaldırıp oraya biraz gecikme koyarak da aynı sonucu alabilirsin. Sorunlarının kaynağı muhtemelen elindeki sensör. Onu stabil hale getirmelisin. Yukarıda açıkladıklarımı uygula mutlaka.

Ete

ete

DHT11 data sheet'ine yeniden baktım. Her sensörün bir yaptığı işle ilgili okuma zamanı vardır. Bu sensörde 1 Hz aralıklarla okuma yapın deniliyor. Yani her 1 sn de bir okuma yapılması gerekiyor. Arada yapılan okumalarda sensörün bir önceki okuma değeri okunurmuş. Ancak iki okuma arasına hiç gecikme koymazsanız sensör bir noktada çıkmaza giriyor. Bu nedenle iki okuma arasında bana göre en az 500 ms data sheete görede 1000 ms lik gecikme olması gerekiyor.
Şöyle düşünmek lazım. Sensör içinde okunan nem ve sıcaklık bilgilerinin kayıt edildiği 4 register var. (ondalık değerleri ile birlikte ). Bu registerlere her okuma tamamlandığında oradaki bilgiyi yeniliyor. Pic okuma emri verdiğinde okumayı yapıyor ve registerlere yazdırıyor. Bu işlem mutlaka 1 sn den az bir zaman alıyor. Pic okuma emrini verdikten sonra oradan okunan değer registerlerdeki değer oluyor. Daima bir önceki okumaya ait oluyor bu değerler.  Sık sık okuma yapılırsa sürekli olarak aynı bilgiyi bu regsiterlerden alıyorsunuz. Bununda bir anlamı yok aslında. Gecikmesiz sık sık okuma yaparsanız registerlerdeki bilgi yenilenirken bir yandan da okuma yapmaya zorlanan sensörde çakışma oluyor sanırım. Bu nedenle kilitlenme meydana geliyor.
Bu nedenle işin doğrusu sensörü her 1000 ms de bir okumak. Yada en azından her 500 ms de bir okumak.

Diğer bir konu da ilk çalıştırmada sensörün kullanılabilir hale gelme süresi. Bu süre yine data sheet de 1000 ms olarak verilmiş. Bu durumda programa ilk açılışta ilk sensör okumasından önce en azından 1000 ms lik bir açılış gecikmesi verilmesi gerekir.  Bu gecikmeden önce bir sensör okuması yaptırılır.  Sonra program Başla satırına gelir ve normal çalışma temposuna girer. İlk sensör okumasından sonra da hemen sensör okutulmamalı. Bu nednele Basla satırından sonraki kodlar şöyle olmalıdır.
BASLA:
GOSUB EKRAN
PAUSE 500
GOSUB SENSOROKU
PAUSE 500
GOTO BASLA

Böylece hem iki okuma arasına 1000 ms süre koymuş oluyoruz hemde ilk okumadan sonra önce bir 500 ms lik gecikme gelmiş oluyor. Bence doğru sistem budur.

Ete


POWER

hocam eşsiz ve değerli bilgileriniz teşekkür ederim.sizden çok şey öğrendik öğrenmeyede devam ediyoruz.siz ise bıkmadan usanmadan bildiğinizi aktarmaya devam ediyorsunuz.Allah sizden razı olsun.söylediğiniz noktalardan eksik olan kısımları tamamladım ve devre çalıştı sorun görünmüyor.esas sorun başladan sonraki toplamda 1000 ms gecikme imiş.bu gecikmeyi koyduğum an çalışmaya başladı.siz zaten bu gecikmenin neden konulması gerektiğini ayrıntıları ile anlatmışsınız.şimdilik bunun üzerinde biraz çalıştıkdan sonra  bu sensörü taramalı sisteme adapte etmek.

POWER

bu gün, dht11 ile yaptığım devreyi, sht sensörü kullanılarak yapılmış komplike bir cihazın ısı ve  nem bilgileri ile karşılaştırdım.dht11 ısı bilgisi bence kabul edilebilir değerlerde.zaten datasheede artı-eksi 2 derece yazıyor fakat hep 2 derece düşük gösteriyor(bu denemeden daha önce 3-4 kez değişik sensörlerle karşılaştırmıştım)nem bilgisi ise tam bir fiyasko.datasheede artı-eksi 5 birim yazıyor ama en az 10 birim fark çıkıyor ne hikmetse bu değer de düşük değer olarak kendini gösteriyor.sıcaklıkta fena değil fiyatına göre ama, nemde çok kötü.gerçi bu bilgilere, ete hocada değinmişti hatırladığım kadarıyla.bu sensörü kullanacak arkadaşların bilgisine.

Powered by EzPortal