LCD Ekranlı Basit Termometre Devresi
Merhabalar,
Bu yazıda LCD ekranlı basit bir termometre yapımını anlatmaya çalışacağım. Devrenin çalışan halini ve çeşitli ortamlardaki testini yazının devamında bulabileceğiniz videoda görebilirsiniz.
“Nerden çıktı bu termometre?” derseniz de, masamın üstünde duran LCD ve PIC’e ek olarak önceden alıp bir köşeye attığım sıcaklık sensörünü bulmam en büyük neden tabi.
Ayrıca haberlerde gördüğümüz “Yarın sıcaklık -3 derceye kadar düşecek.” benzeri söylemlerden dolayı “Dışarısı gerçekten ne kadar soğuk?” diye düşünmem de bir diğer etken.
Kullanacağımız sensör teorik olarak -55, +125 santigrat derece arası sıcaklıkları ortalama 0.5 santigrat derece hassiyetler ölçebiliyor. Yine teorik olarak devreyi 3V DC ve üzeri bir kaynakla çalıştırabilirsiniz.
Devreye geçmeden önce malzemelerimizi sayalım:
- DS18B20
- PIC 16F628 veya PIC 16F628A
- 10K veya yakın değerde POT
- LED (Herhangi bir renk olabilir.)
- 470 Ohm Direnç
- 4.7 KOhm Direnç
- HD44780 veya benzeri sürücü entegre içeren 16×2 LCD Ekran
Her malzemeden bir adet olması yeterlidir. Devrenin özelliklerine kısaca bakalım.
Sensörden dolayı geniş bir sıcaklık aralığını ölçebiliyoruz. Devrede okuma yapıldığını belirten bir adet LED bulunuyor. Sensör yaklaşık her saniyede bir kez okunmakta ve okunan değer ekrana yazdırılmaktadır. Her okuma işlemi esnasında da LED kısa bir süre yanıp, sönmektedir. Devre şeması aşağıdaki gibidir:

Evet, gördüğünüz gibi devre oldukça basit. Zaten tüm işi sevgili mikrokontrolcümüz PIC yapıyor. LCD’yi 4 bit olarak sürüyoruz. İşimizi kolaylaştıran eleman ise sensörümüz: DS18B20. Devreyi 5V civarı voltaj veren bir DC kaynak ile çalıştırabilirsiniz. Devre, video çekimlerinde 4.5V ile çalışıyordu.
DS18B20, Dallas firması tarafından üretilen bir sıcaklık sensörü. Türkiye’de 2-3 Tl civarında bulabilmeniz mümkün. DS18B20 dijital bir sensör ve sıcaklık değerini iletişim kurarak okuyoruz. Sensör tek hat üzerinden (“one-wire”) iletişim kuruyor. Sensörü veri hattı ve nötr ile besleyebilmeniz (“parasite power”) mümkün. Bu devrede bu özelliği kullanmıyoruz.
Aslında DS18B20′nin alarm özelliği gibi kullanmadığımız başka özellikleri de mevcut. Merak edenler, internetten sensörün kullanım kılavuzuna (“datasheet”) erişerek detaylı bilgiye ulaşabilir. Tek hat üzerinden iletişim kurarken kullanılan protokolün en önemli avantajlarından biri ise tek bir hat üzerinde birden fazla sensörün bağlanabiliyor olması. Mikrokontrolcünüzün tek bir pinini feda ederek birden fazla sensörü ayrı ayrı okuyabilirsiniz. Bu devrede sadece tek bir sensör okuyoruz. Belki başka bir yazıda sensörün diğer özelliklerinin kullanımına ve tek hat üzerinden birden fazla sensörün okunmasına değinilebilir.
Programlama dili olarak Pic Basic Pro dilini kullandım. Bu tür basit projelerde dilin yazım rahatlığı büyük bir zaman kazancı ve kolaylık sağlıyor. PBP’nin yetersiz olduğu noktalar yok değil. Bu devre için ihtiyacımızı çok rahat karşıladığından tercih ettim. İsterseniz programımıza bir göz atalım.
'* Adı : Termometre '* Yazar : http://www.izoelektronik.com - Alper Yazar (90alper90) '* Yazı Adresi : http://www.izoelektronik.com/lcd-ekranli-basit-termometre-devresi.htm '* Notlar : PBP fonksiyonlarının Türkçe açıklamalarına http://www.izoelektronik.com/pic-basic-pro-fonksiyonlarinin-turkce-aciklamalari.htm 'adresinden ulaşabilirsiniz. Sorularınızı iletmek için "Yazı Adresi" ile belirtilen adresteki yazıya yorum yazabilirsiniz. @ DEVICE pic16f628, WDT_OFF @ DEVICE pic16f628, PWRT_OFF @ DEVICE pic16f628, BOD_OFF @ DEVICE pic16f628, LVP_OFF @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16f628, MCLR_OFF @ DEVICE pic16f628, INTRC_OSC_NOCLKOUT Include "modedefs.bas" DEFINE OSC 4 '4 Mhz hızında çalışıyoruz. SENSOR VAR PORTB.7 'Sensör PORTB.7'ye bağlı LED VAR PORTB.6 'LED PORTB.6'ya bağlı MESGUL VAR BYTE 'Çeşitli değişken tanımlamaları BILGI VAR WORD ISARET VAR BYTE ONDA1 VAR WORD ONDA2 VAR WORD ARA VAR WORD DEGER VAR BYTE 'LCD TANIMLAMALARI DEFINE LCD_DREG PORTB 'LCD Veri pinleri PORTB'ye bağlı. DEFINE LCD_DBIT 0 'LCD'nin D0 pini PORTB.0'a bağlı DEFINE LCD_RSREG PORTB 'RS PİNİ PORTB'ye bağlı DEFINE LCD_RSBIT 4 'RS PİNİ = PORTB.4 DEFINE LCD_EREG PORTB 'ENABLE PİNİ PORTB'ye bağlı DEFINE LCD_EBIT 5 'ENABLE PİNİ = PORTB.5 DEFINE LCD_RWREG PORTA 'RW PİNİ KULLANILMIYOR - Kullanılmayan bir pin tanımlandı. DEFINE LCD_RWBIT 1 'RW PİNİ KULLANILMIYOR - Kullanılmayan bir pin tanımlandı. DEFINE LCD_BITS 4 'LCD 4 BİT SÜRÜLÜYOR DEFINE LCD_LINES 2 'LCD 2 SATIRLIK 'LCD TANIMLAMALARI BİTİŞ TRISA=%11111111 'PORT giriş-çıkış tanımalamları TRISB=%10111111 PAUSE 500 'Ekranın hazır olması için biraz bekliyoruz. LCDOUT $FE,$40,6,9,9,6,0,0,0,0 'Derece gösterimi için özel karakteri LCD'ye yüklüyoruz. LCDOUT $FE,$48,4,0,14,4,4,4,14,0 'İ karakterini LCD'ye yüklüyoruz. LCDOUT $FE,$50,0,0,4,4,4,4,4,0 'ı karakterini LCD'ye yüklüyoruz. LCDOUT $FE,1,1,"zoelektronik" 'İlk satıra İzoelektronik yaz. LCDOUT $FE,$C0,"90alper90 - 2010" 'İkinci satıra yaz. PAUSE 3000 'Biraz bekle LCDOUT $FE,1,"S",2,"cakl",2,"k:" 'Ekranı temizleyip, üst satıra Sıcaklık: yaz. BASLA: 'Dongüye gir. ISARET="+" OWOUT SENSOR,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle. BEKLE: 'Sensör hazır olana kadar bekle. OWIN SENSOR,4,[MESGUL] IF MESGUL=0 THEN GOTO BEKLE ENDIF DEVAM: OWOUT SENSOR,1,[$CC,$BE] 'Sensöre okuduğu değeri göndermesini söyle. OWIN SENSOR,0,[BILGI.LOWBYTE,BILGI.HIGHBYTE] 'Gelen 16 bitlik bilgiyi al. 'Programın devamındaki algoritma daha etkili bir şekilde yazılabilir. Bu uygulamada performans çok da etkili olmadığından aklıma gelen ilk algoritmayı kullandım. 'Kodun mantığını anlamanız açısından kod üzerine düşünmeniz daha faydalı olacaktır. Bu yüzden kodların yanına açıklama yazmıyorum. 'Fakat anlamadığınız bir nokta olursa lütfen 'http://www.izoelektronik.com/lcd-ekranli-basit-termometre-devresi.htm adresindeki yazının altına yorum yazarak sorularınızı iletiniz. IF BILGI.BIT13=1 THEN 'Sıcaklık negatif ise ISARET="-" 'İşaret artık + değil - BILGI=~BILGI 'Gelen bilgideki bitleri tersle, 1->0, 0->1 BILGI=BILGI+1 'Bilgiyi 1 arttır. ENDIF ARA=BILGI*625 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor. DEGER=DIV32 10000 ARA=BILGI*625 ONDA1= DIV32 1000 ARA=BILGI*625 ONDA2= DIV32 100 ONDA1=ONDA1-(DEGER*10) ONDA2=ONDA2-((dEGER*100)+(ONDA1*10)) LCDOUT $FE,$C0," " 'LCD ekranın alt satırını temizle LCDOUT $FE,$C0,ISARET,#DEGER,".",#ONDA1,#ONDA2," ",0,"C" HIGH LED 'LEDi yakıp söndürerek döngünün bittiğini belirt. PAUSE 200 LOW LED PAUSE 800 GOTO BASLA 'BASLA etiketine dön END
Kodların içinde de belirttiğim gibi çok daha güzel algoritmalar ile bu iş yapılabilir. Bu devre için performans çok önemli olmadığı için aklıma gelen ilk algoritmayı kullandım. Öğrenmek isteyenler içinse, kod üzerinde düşünmenin var olan açıklamayı okumaktan daha yararlı olduğunu düşündüğümden bazı kısımların açıklamalarını eklemedim. Programın çalışmasını öğrenmek isteyenler için tavsiyem kodu anlamaya çalışmaları ve soruları olursa yazının altına yorum yazarak iletmeleri.
Programın sonlarına doğru ikinci satırı temizlemek için ikinci satıra bir dizi boşluk basıldığını görebilirsiniz. Alt satırı silmezseniz videoda da görebileceğiniz gibi iki adet C harfi basma problemi oluşuyor. Temizleme işlemini sadece alt satırı silen bir komut ile yapmak çok daha güzel olacaktır. Yalnız HD44780 entegresinin kullanım kılavuzunda böyle bir komut bulamadım. Tüm ekranı temizleyip her seferinde üst satıra “Sıcaklık” yazdırmak da daha uzun bir yol olarak gözüktü. Bu yüzden alt satırı temizlemek için ekrana boşluk bastırmayı tercih ettim. Eğer daha etkili bir yol bulur ya da HD44780′in alt satırı temizleme gibi bir özelliği varsa bunu iletirseniz sevinirim.
Devrenin çalışmasını aşağıdaki videolardan görebilirsiniz:
Video İnceleme
İzoelektronikTV YouTube Kanalı Üzerinden:
İzoelektronikTV Metacafe Kanalı Üzerinden:
Programın derlenmiş halini (.hex), kaynak kodu ve devre şemasını Dosyaİndir üzerinden indirebilirsiniz.
Sorularınızı iletmek için hemen sayfanın aşağısına inip, yorum yazabilirsiniz.
Bir başka yazıda görüşmek dileği ile…
Bağlantılı Yazılar
9 Yorum Yapılmış
Yorum Yapın ya da Soru Sorun
Yorum yapabilmeniz ya da soru sorabilmeniz için giriş yapmanız gerekmektedir.
Hoşgeldiniz, Ziyaretçi.Lütfen giriş yapın veya kayıt olun.
E-posta adresinize aktivasyon iletisi gelmediyse lütfen buraya tıklayın.
Çok güzel olmuş
Teşekkürler
paylasımın için çok teşekkürler bu devreyi isis te simule ettiğimde -0.06 şeklinde ekranda sabit ssayı çıkıyor ve hiç değişmiyor problem ne olabilir acaba yardımın için tesekkür…
Merhaba,
-0.06 değeri, sensör takılı olmadığı zaman okunuyor. Videonun 49. saniye civarlarında sensör sökülünce bu değeri verdiğini görebilirsiniz.
Bundan dolayı simülasyonda sensörün PIC’e bağlı olmadığını düşünüyorum. Simülasyonunuzda sensörün bağlantısında sorun olabilir. Tekrar kontrol etmenizde fayda var. Fakat, devreyi gerçek olarak kurduğunuzda sorunsuz çalışacaktır.
Alper çok güzel bir paylaşım olmuş saolasın benim bi kaç sorum olacaktı ben bir lcd ye hem sıcaklığı hem basıncı(ağırlık olarak kg ve newton) hemde sesin frekansını nasıl ölçebilirim devresini yapabilirmisin yardımcı olabilirmisin…
Alper bana bu mail adresi ile ulaşabilirsin ozi198_@hotmail.com
Ağırlık ölçen sensörler (“load cell” olarak geçer.) piyasada bulunabiliyor. Frekans ölçümü için hemen aklıma bir çözüm gelmedi. Bulursam yazarım. Sensörlerle ölçümleri yaptıktan sonra LCD ekranda göstermek zor olmayacaktır.
alper teşekkür ederim bu arada ben ozan memnun oldum ben bu 3 ölçümü aynı lcd ekranda gösterebilimiyim pıc’e yeni başladım ve bu benim proje ödevim nerden başlamalıyım bunuda bilmiyorum ….
Merhaba Ozan Bey,
Ölçümleri aldıktan sonra aynı anda göstermekte bir sıkıntı yok. Önemli olan 3 ölçümü de alabilmek. Bir önceki mesajımda bahsettiğim gibi frekans dışındaki diğer ölçümleri almak çok zor değil. Frekans konusunda hemen aklıma gelen bir yöntem yok. Tam olarak neyin frekansını ölçeceğinizi söylerseniz daha rahat yardımcı olunabilir.
Başlangıç olarak PIC öğrenmeye devam edebilir, bu yazıdaki sensörü kullanacaksanız sensörün kullandığı “one-wire” iletişimin nasıl olduğunu araştırabilir ve ağırlık sensörü olarak “load cell” diye bilinen cihazlarla ilgili bilgi edinmeye çalışabilirsiniz.