Dijital Termometre
Merhaba
Sizlerle DS1621 ile yapılmış Dijital Termometre projemi paylaşmaya karar verdim.
Daha önce bir çok dijital termometre devreleri gördüğünüzü veya uğraştığınızı tahmin ediyorum. Ben de bu konuyla ilgili bir çok uygulama geliştirdim. En son DS1621 sıcaklık entegresinde karar kıldım. Bunu da sizlerle paylaşıyorum.
Devremiz, Pic16F877 ile DS1621’den sıcaklık değerini okuyor ve LCD’de görüntülüyor. Devrede 16F84 kullanmadım. Çünkü bu entegrenin sınırlılıklarına takılmak istemedim. Bu tür uygulamalar için Assembly dilinde yazılmış program örnekleri pek bulunmuyor. Bu yüzden programı Assembly dilinde yazdım. Programın açık ve anlaşılır olması için 8 bit paralel Lcd kullandım. Programın assembly kodunu mail ile isteyebilirsiniz.
Şekil 1. DS1621 entegresi.
Bu uygulamada DS1621’den sıcaklık bilgisinin PIC tarafından okunması en önemli noktadır. DS1621’i biraz tanımakta fayda olduğunu düşünüyorum. DS1621’in ölçüm aralığı -55ºC ile +125ºC arasındadır. Bu entegre 0.5’lik bir hassasiyetle ölçüm yapmaktadır. Ölçülen değerler iki baytlık değer olarak PIC’e gönderiliyor.
Üst bayt | Alt bayt | Sıcaklık |
01111101 | 00000000 | +125°C |
00011001 | 00000000 | +25°C |
00000000 | 10000000 | +½°C |
00000000 | 00000000 | +0°C |
11111111 | 10000000 | -½°C |
11100111 | 00000000 | -25°C |
11001001 | 00000000 | -55°C |
Tablo 1. Okunan alt ve üst baytların desimal karşılıkları.
Ölçüm değerleri Tablo 1’de görülmektedir. Alt baytın 7. bitinin 1 olması, 0,5’lik ondalığı ifade etmektedir. Üst baytın 7. biti 0 ise, sıcaklığın 0’dan büyük veya eşit olduğu, 7. bit 1 ise sıcaklığın 0’ın altında olduğu anlamına gelir. Bu durumda üst baytın komplementi alınıp 1 eklenerek sonuç hesaplanmaktadır.
Şekil 2. DS1621 entegresi pin görünüşü.
PIC ile DS1621 entegresi I2C seri iletişim yöntemiyle haberleşmektedir. Şekil 3’deki devre şemasında görüldüğü gibi entegre, SData ve SClock olmak üzere pull up yapılmış iki kablo ile PIC’e bağlanmıştır. Ayrıca bu entegrenin 3 bitlik adres pinleri bulunmaktadır. A0, A1 ve A2 pinleri adres belirlemede kullanılır. Bu adresleme sayesinde birden fazla sıcaklık entegresini (DS1621’de en fazla 8) aynı hat üzerinden bağlamak mümkündür.
Şekil 3. Devrenin açık şeması.
Biraz da I2C hakkında kısa bilgi vermek gerektiğini düşünüyorum. Bu yöntemde her bir clock ile karşı tarafa 1 bit bilgi gönderilir veya alınır. Bu bitler 1 baytlık paketler halinde adres veya komut olarak gönderilir, datalar alınır. Şekil 4’deki görüntü, simülasyon programıyla elde edilmiştir. Bu konuda daha detaylı bilgiyi DS1621.PDF dosyasında bulmak mümkündür.
Şekil 4. I2C adres, komut ve dataların akışı.
Program kodumuz genel olarak alt programlardan oluşmaktadır. Böylece daha basit ve anlaşılır olması sağlanmıştır. 16F877’nin portlarının kurulumu, LCD’nin kurulumu ve DS1621’in kurulumunun ardından belirli aralıklarla sıcaklık değeri okunuyor ve LCD’de gösteriliyor (Şekil 5). Okunan değerlerin desimal olarak LCD’de görülmesi için çevrim tablosu kullanılmıştır.
Şekil 5. Programın blok akış şeması.
Şekil 4’de de görüldüğü gibi ilk olarak gönderilen ‘10010001’ adres bilgisidir. Böylece birden fazla DS1621 bağlı sistemde adresi 000 olarak ayarlanan entegrenin dikkati çekilmiş olacaktır. Bizim devremizde sıcaklık entegremizin A0-A2 uçları toprağa bağlı olduğundan, gönderilen komut ile bu entegre ilgilenecektir. Eğer devremizde 3 tane sıcaklık entegresi bulunuyor olsaydı, 3. entegreye komut göndereceğimiz durumda adres bilgimiz ‘10010101′ şeklinde olacaktı.
Şekil 6. Komut gönderme
Adresin hemen ardından komut baytı gönderilmektedir. Bu bayt, okunacak bilginin alt bayt mı, üst bayt mı olduğunu belirliyor. Hemen ardından tekrar adres baytı, bu sefer bilgiyi oku emrini veriyor. Ardından ölçülen değer okunarak bir kaydedicide tutuluyor. Aşağıda alt ve üst baytların okunması için gerekli adres, komut ve data akışları görülmektedir.
10010001 → 000 olarak adreslenmiş olan entegreye yaz
10101010 → komut yaz (son ölçülen değeri oku)
10010000 → 000 olarak adreslenmiş olan entegreden oku
00010010 → Üst bayt olarak gelen bilgi (18)
10001000 → Alt bayt olarak gelen bilgi (.5)
Bu uygulamayı iki adet DS1621 kullanarak gerçek devre üzerinde denedim. Entegrelerden birini 7 metre kablo ile uzatarak bağladım. Dolayısıyla dış ve iç sıcaklığı ölçecek şekilde çalıştırdım. Mesafeyi daha fazla uzatmayı tavsiye etmiyorum. Veri kaybı başlıyor ve hatalı bilgi alınıyor. Devrenin hatasız çalıştığını söylemeliyim.
Şekil 3’deki devre şemasında görülmeye PIC’in gerilimini, osilatör devresini ve mclr ucunu bağlamayı unutmayınız.
DS1621.HEXdosyası ds1621-hex
Kaynak kodu için mail gönderiniz.
İhsan KAR
ihsankar@gmail.com