- Gerekli Bileşenler: -
- DS18B20 Sıcaklık Sensörü:
- Devre şeması:-
- Adımlar veya kod akışı: -
- Kod Açıklaması:
- DS18B20 Sıcaklık Sensöründen Veri Alma:
Genellikle, LM35 sıcaklık sensörü, ucuz ve kolay ulaşılabilir olduğu için sıcaklığı ölçmek için mikro denetleyicilerle birlikte kullanılır. Ancak LM35 analog değerler verir ve bunları ADC (Analogdan Dijitale Dönüştürücü) kullanarak dijitale dönüştürmemiz gerekir. Ancak bugün, sıcaklığı elde etmek için bir ADC dönüşümüne ihtiyacımız olmayan DS18B20 sıcaklık sensörünü kullanıyoruz. Burada Sıcaklığı ölçmek için DS18B20 ile PIC Mikrodenetleyiciyi kullanacağız.
İşte burada mikroçipten PIC16F877A mikro denetleyici birimi kullanarak aşağıdaki özelliklere sahip bir Termometre inşa ediyoruz.
- -55 dereceden +125 dereceye kadar tüm sıcaklık aralığını gösterecektir.
- Yalnızca sıcaklık + / -.2 derece değişirse sıcaklığı gösterecektir.
Gerekli Bileşenler: -
- Pic16F877A - PDIP40 paketi
- Ekmek Tahtası
- Pickit-3
- 5V adaptör
- LCD JHD162A
- DS18b20 sıcaklık sensörü
- Çevre birimlerini bağlamak için teller.
- 4.7k Direnç - 2 adet
- 10k pot
- 20mHz Kristal
- 2 adet 33pF seramik kondansatör
DS18B20 Sıcaklık Sensörü:
DS18B20, sıcaklığı doğru bir şekilde algılamak için mükemmel bir sensördür. Bu sensör, sıcaklık algılamada 9bit ila 12bit çözünürlük sağlar. Bu sensör, yalnızca bir kablo ile iletişim kurar ve analog sıcaklıkları elde etmek ve bunları dijital olarak dönüştürmek için herhangi bir ADC'ye ihtiyaç duymaz.
Sensörün özellikleri: -
- -55 ° C ila + 125 ° C (-67 ° F ila + 257 ° F) arasındaki sıcaklıkları ölçer
- ± 0,5 ° C -10 ° C ile + 85 ° C arası doğruluk
- 9 Bit'ten 12 Bit'e Programlanabilir Çözünürlük
- Harici Bileşen Gerekmez
- Sensör 1-Wire® Arayüzü kullanır
Veri sayfasından yukarıdaki pinout görüntüsüne bakarsak, sensörün BC547 veya BC557 paketi TO-92 ile tamamen aynı göründüğünü görebiliriz. İlk pin Ground, İkinci pin DQ veya data ve Üçüncü pin VCC'dir.
Aşağıda, tasarımımız için ihtiyaç duyulacak Veri Sayfasından elektriksel özellikler verilmiştir. Sensör için nominal besleme voltajı + 3.0V ile + 5.5V arasındadır. Ayrıca yukarıda belirtilen besleme voltajıyla aynı olan besleme voltajına ihtiyaç duyar.
Ayrıca, -10 Derece C ila +85 Derece Santigrat aralığı için + -0,5 derece Celsius olan bir doğruluk marjı ve -55 Derece için + -2 Derece olan tam aralık marjı için doğruluk değişiklikleri vardır. 125 Derece aralığı.
Veri sayfasına tekrar bakarsak sensörün bağlantı özelliğini göreceğiz. Sensörü, DATA ve GND olmak üzere iki kabloya ihtiyaç duyulan parazitik güç modunda bağlayabiliriz veya sensörü üç ayrı kabloya ihtiyaç duyulan harici güç kaynağı kullanarak bağlayabiliriz. İkinci yapılandırmayı kullanacağız.
Artık sensörün güç derecelendirmelerine ve bağlantıyla ilgili alanlara aşina olduğumuzdan, şimdi şematik yapmaya konsantre olabiliriz.
Devre şeması:-
Devre şemasını görürsek şunu göreceğiz: -
16x2 karakter LCD, RB0, RB1, RB2'nin LCD pin RS, R / W ve E'ye bağlandığı PIC16F877A mikrodenetleyiciye bağlanır ve RB4, RB5, RB6 ve RB7, LCD'nin 4 pimli D4, D5, D6'ya bağlanır, D7. LCD, 4 bit modunda veya yarım bayt modunda bağlanmıştır.
OSC1 ve OSC2 pinine 33pF'lik iki seramik kapasitörlü 20MHz'lik bir kristal Osilatör bağlanır. Mikrodenetleyiciye sabit 20Mhz saat frekansı sağlayacaktır.
DS18B20 ayrıca pin konfigürasyonuna göre ve daha önce tartışıldığı gibi 4.7k yukarı çekme direnci ile bağlanır. Bütün bunları breadboard'a bağladım.
PIC Mikrodenetleyicide yeniyseniz, PIC Mikrodenetleyiciye Başlarken ile ilgili PIC Mikrodenetleyici Öğreticilerimizi takip edin.
Adımlar veya kod akışı: -
- Osilatör konfigürasyonunu içeren mikrodenetleyicinin konfigürasyonlarını ayarlayın.
- TRIS kaydı dahil LCD için İstenen bağlantı noktasını ayarlayın.
- Ds18b20 sensörlü her döngü sıfırlama ile başlar, bu nedenle ds18b20'yi sıfırlayıp varlık darbesini bekleyeceğiz.
- Karalama panelini yazın ve sensörün çözünürlüğünü 12bit olarak ayarlayın.
- ROM okumasını ve ardından bir sıfırlama darbesini atlayın.
- Sıcaklık dönüştür komutunu gönderin.
- Çalışma panelinden sıcaklığı okuyun.
- Negatif veya pozitif olsun, sıcaklık değerini kontrol edin.
- Sıcaklığı 16x2 LCD'ye yazdırın.
- +/-. 20 santigrat derece sıcaklık değişimlerini bekleyin.
Kod Açıklaması:
Bu Dijital Termometre için tam kod, bu eğitimin sonunda bir Gösteri Videosu ile verilmiştir. Buradan indirilebilen bu programı çalıştırmak için bazı başlık dosyalarına ihtiyacınız olacak.
İlk olarak, pic mikro denetleyicideki yapılandırma bitlerini ayarlamalı ve ardından void main işleviyle başlamalıyız.
Ardından aşağıdaki dört satır için kullanılan kütüphane başlık dosyası dahil, lcd.h ve ds18b20.h . Ve xc.h , mikrodenetleyici başlık dosyası içindir.
#Dahil etmek
Bu tanımlar , sıcaklık sensörüne komut göndermek için kullanılır. Komutlar, sensörün veri sayfasında listelenmiştir.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Sensörün veri sayfasındaki bu Tablo 3, makroların ilgili komutları göndermek için kullanıldığı tüm komutları göstermektedir.
Sıcaklık, yalnızca sıcaklık +/- .20 derece değişirse ekranda görüntülenecektir. Bu sıcaklık aralığını bu temp_gap makrosundan değiştirebiliriz. Bu makrodaki değeri değiştirerek, özellik değiştirilecektir.
Görüntülenen sıcaklık verilerini depolamak ve bunları sıcaklık aralığı ile ayırt etmek için kullanılan diğer iki float değişkeni
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Gelen void ana () işlevi, lcd_init () ; LCD'yi başlatmak için bir işlevdir. Bu lcd_init () işlev denir lcd.h kitaplığı.
TRIS kayıtları, giriş veya çıkış olarak I / O pinlerini seçmek için kullanılır. Sıcaklık sensöründen gelen 12 bit çözünürlük verilerini saklamak için iki işaretsiz kısa değişken TempL ve TempH kullanılır.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; işaretsiz kısa TempL, TempH; işaretsiz int t, t2; float farkı1 = 0, fark2 = 0; lcd_init ();
While döngüsünü görelim, burada while (1) döngüsünü küçük parçalara ayırıyoruz.
Bu çizgiler, sıcaklık sensörünün bağlı olup olmadığını algılamak için kullanılır.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Lütfen Bağlanın"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probu"); }
Bu kod segmentini kullanarak sensörü başlatırız ve sıcaklığı dönüştürmek için komut göndeririz.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); bayt_yazı (0); bayt_yazı (0); write_byte (çözünürlük_12bit); // 12bit çözünürlük ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Bu kod, 12 bit sıcaklık verilerini iki işaretsiz kısa değişkenle depolamak içindir.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = okuma_bayt (); TempH = okuma_bayt ();
Ardından aşağıdaki kodu eksiksiz kontrol ederseniz, sıcaklık işaretinin pozitif mi yoksa negatif mi olduğunu bulmak için if-else koşulunu oluşturduk.
If ifade kodunu kullanarak verileri işler ve sıcaklığın negatif olup olmadığını görebilir ve sıcaklık değişikliklerinin +/-.20 derece aralığında olup olmadığını belirleriz. Ve diğer kısımda sıcaklığın pozitif olup olmadığını ve sıcaklık değişikliklerini tespit edip etmediğini kontrol ettik.
kodu
DS18B20 Sıcaklık Sensöründen Veri Alma:
1-Wire® Arayüzünün zaman boşluğunu görelim. 20Mhz Crystal kullanıyoruz. Ds18b20.c dosyasının içine bakarsak göreceğiz
#define _XTAL_FREQ 20000000
Bu tanım, XC8 derleyici gecikme rutini için kullanılır. 20Mhz, kristal frekansı olarak ayarlanır.
Beş fonksiyon yaptık
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
1-Wire ® protokolü, iletişim için sıkı zamanlama ile ilgili yuvalara ihtiyaç duyar. Veri sayfasının içinde, zaman aralığı ile ilgili mükemmel bilgiler alacağız.
Aşağıdaki fonksiyonun içinde tam zaman aralığını oluşturduk. Bekletme ve bırakma için kesin gecikmeyi yaratmak ve ilgili sensörün portunun TRIS bitini kontrol etmek önemlidir.
işaretsiz karakter ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (çıktı) DQ = 0; // pin numarasını düşük (0) __delay_us (480) olarak ayarlayın; // 1 kablo gecikme süresi gerektirir DQ_TRIS = 1; // Tris = 1 (girdi) __delay_us (60); // eğer (DQ == 0) // bir varlık pluse varsa 1 kablo zaman gecikmesi gerektirir {__delay_us (480); dönüş 0; // 0 döndür (1-kablo varlığı)} else {__delay_us (480); dönüş 1; // dönüş 1 (1 kablo mevcut DEĞİLDİR)}} // 0 = varlık, 1 = parça yok
Şimdi Okuma ve Yazmada kullanılan aşağıdaki zaman aralığı açıklamasına göre, sırasıyla okuma ve yazma işlevini oluşturduk.
işaretsiz karakter read_bit (void) {işaretsiz karakter i; DQ_TRIS = 1; DQ = 0; // zaman dilimini başlatmak için DQ'yu düşük çekin DQ_TRIS = 1; DQ = 1; // sonra yüksek döndür (i = 0; i <3; i ++); // zaman aralığı dönüşünün başlangıcından itibaren 15us gecikme (DQ); // DQ satırının dönüş değeri} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // zaman dilimini başlatmak için DQ'yu düşük çekin if (bitval == 1) DQ = 1; // 1 __delay_us (5) yazarsanız DQ yüksek döndürür; // zaman diliminin geri kalanı için değeri tut DQ_TRIS = 1; DQ = 1; } // Gecikme, döngü başına 16us artı 24us sağlar. Bu nedenle gecikme (5) = 104us
Daha fazla ilgili başlık ve.c dosyalarını buradan kontrol edin.
PIC Microcontroller ile sıcaklığı elde etmek için DS18B20 sensörünü bu şekilde kullanabiliriz.
LM35 ile basit bir Dijital Termometre oluşturmak istiyorsanız, diğer Mikrodenetleyicilerle aşağıdaki projeleri inceleyin:
- Raspberry Pi ile Oda Sıcaklığı Ölçümü
- Arduino ve LM35 kullanan Dijital Termometre
- LM35 ve 8051 kullanan Dijital Termometre
- LM35 ve AVR Mikrodenetleyici kullanarak Sıcaklık Ölçümü