- DHT11 - Özellikler ve Çalışma
- DHT11 Sensörü ile iletişim kurma
- Gerekli bileşenler
- Şematik
- PIC MPLABX Kod açıklaması ile DHT11
Sıcaklık ve Nem ölçümü genellikle Ev Otomasyonu, Ortam İzleme, Hava durumu istasyonu, vb. Gibi birçok uygulamada yararlıdır. LM35'in yanında en popüler olarak kullanılan Sıcaklık sensörü DHT11'dir, daha önce Arduino ve Ahududu ile arayüz oluşturarak birçok DHT11 Projesi oluşturduk. Pi ve diğer birçok geliştirme kartı. Bu yazıda, bu DHT11'i 8-bit PIC Mikrodenetleyici olan PIC16F87A ile nasıl arayüzleyeceğimizi öğreneceğiz. Bu mikro denetleyiciyi DHT11 kullanarak Sıcaklık ve Nem değerlerini okumak ve bir LCD ekranda görüntülemek için kullanacağız. PIC mikrodenetleyicilerini kullanma konusunda tamamen yeniyseniz, PIC mikro denetleyiciyi nasıl programlayacağınızı ve kullanacağınızı öğrenmek için PIC eğitim serimizden yararlanabilirsiniz, bununla birlikte başlayalım.
DHT11 - Özellikler ve Çalışma
DHT11 sensörü, modül formunda veya sensör formunda mevcuttur. Bu eğitimde sensörü kullanıyoruz, her ikisi arasındaki tek fark, modül formunda sensörün bir filtreleme kapasitörüne ve sensörün çıkış pinine bağlı bir çekme direncine sahip olmasıdır. Yani modülü kullanıyorsanız harici olarak eklemenize gerek yoktur. Sensör formundaki DHT11 aşağıda gösterilmiştir.
DHT11 sensörü mavi veya beyaz renkli bir kasa ile birlikte gelir. Bu kasanın içinde, bağıl nem ve sıcaklığı algılamamıza yardımcı olan iki önemli bileşene sahibiz. İlk bileşen bir çift elektrottur; bu iki elektrot arasındaki elektrik direncine nem tutucu bir substrat karar verir. Dolayısıyla ölçülen direnç, ortamın bağıl nemi ile ters orantılıdır. Bağıl nem ne kadar yüksekse, direnç değeri o kadar düşük olur ve bunun tersi de geçerlidir. Ayrıca, Bağıl nemin gerçek nemden farklı olduğunu unutmayın. Bağıl nem, havadaki sıcaklığa göre havadaki su içeriğini ölçer.
Diğer bileşen, yüzeye monte bir NTC Termistördür. NTC terimi, Negatif sıcaklık katsayısı anlamına gelir, sıcaklıktaki artış için direnç değeri azalacaktır. Sensörün çıkışı fabrikada kalibre edilmiştir ve bu nedenle bir programcı olarak sensörü kalibre etme konusunda endişelenmemize gerek yoktur. 1-Wire haberleşme ile verilen sensörün çıkışı, bu sensörün pin ve bağlantı şemasını görelim.
Ürün 4 pinli tek sıralı bir paket içindedir. 1. pin VDD'ye bağlanır ve 4. pin GND'ye bağlanır. 2. pin, iletişim amacıyla kullanılan veri pinidir. Bu veri pininin 5k'lik bir kaldırma direncine ihtiyacı vardır. Bununla birlikte, 4.7k ila 10k gibi diğerleri yukarı çekerek dirençler de kullanılabilir. 3. pin hiçbir şeye bağlı değil. Yani göz ardı edilir.
Veri sayfası, aşağıdaki tabloda görülebilen teknik özelliklerin yanı sıra arayüz bilgileri sağlar.
Yukarıdaki tablo, Sıcaklık ve Nem ölçüm aralığı ve doğruluğunu göstermektedir. 0-50 santigrat derece arasındaki sıcaklığı +/- 2 derece santigrat doğrulukla ve% 20-90 bağıl nemden +/-% 5 bağıl nem hassasiyetiyle ölçebilir. Ayrıntılı teknik özellikler aşağıdaki tabloda görülebilir.
DHT11 Sensörü ile iletişim kurma
Daha önce belirtildiği gibi, DHT11'den PIC ile veri okumak için PIC tek telli İletişim protokolünü kullanmamız gerekir. Bunun nasıl yapılacağına ilişkin ayrıntılar, DHT 11'in veri sayfasında bulunan arayüz diyagramından anlaşılabilir, aynı aşağıda verilmiştir.
DHT11'in iletişimi başlatmak için MCU'dan bir başlatma sinyaline ihtiyacı vardır. Bu nedenle, MCU'nun sıcaklık ve nem değerlerini göndermesini istemek için DHT11 Sensörüne bir başlatma sinyali göndermesi gerektiğinde. Başlatma sinyalini tamamladıktan sonra DHT11, sıcaklık ve nem bilgilerini içeren bir yanıt sinyali gönderir. Veri iletişimi, tek veriyolu veri iletişim protokolü ile yapılır. Tam veri uzunluğu 40bittir ve sensör önce daha yüksek veri biti gönderir.
Yukarı çekme direnci nedeniyle, veri hattı boş modda daima VCC seviyesinde kalır. MCU'nun minimum 18 ms'lik bir süre için bu voltajı yüksekten düşüğe indirmesi gerekir. Bu süre boyunca, DHT11 sensörü başlatma sinyalini algılar ve mikro denetleyici veri hattını 20-40us için yüksek yapar. Bu 20-40us süresine DHT11'in yanıt vermeye başladığı bekleme süresi denir. Bu bekleme süresinin ardından DHT11, verileri mikrodenetleyici birimine gönderir.
DHT11 Sensör VERİ Formatı
Veriler, birleştirilmiş ondalık ve ayrılmaz parçalardan oluşur. Sensör aşağıdaki veri formatını takip eder -
8 bit integral RH verisi + 8bit ondalık RH verisi + 8bit integral T verisi + 8bit ondalık T verisi + 8bit sağlama toplamı.
Sağlama toplamı değeri alınan verilerle kontrol edilerek veriler doğrulanabilir. Bunun nedeni, her şey doğruysa ve sensör doğru verileri iletmişse , sağlama toplamının “8 bitlik integral RH verisi + 8bit ondalık RH verisi + 8bit integral T verisi + 8bit ondalık T verisi” toplamı olması gerektiğinden yapılabilir .
Gerekli bileşenler
Bu proje için aşağıdakiler gereklidir -
- PIC mikrodenetleyici (8bit) programlama kurulumu.
- Breadboard
- 5V 500mA güç kaynağı ünitesi.
- 4.7k direnç 2 adet
- 1k direnç
- PIC16F877A
- 20mHz kristal
- 33pF kapasitör 2 adet
- 16x2 karakter LCD
- DHT11 sensörü
- Atlama telleri
Şematik
DHT11'in PIC16F877A ile arayüzlenmesi için devre şeması aşağıda gösterilmiştir.
DHT11'den ölçtüğümüz sıcaklık ve nem değerlerini görüntülemek için 16x2 LCD kullandık. LCD, 4 telli modda arabirimlidir ve hem sensör hem de LCD, 5V harici güç kaynağı ile çalışır. Gerekli tüm bağlantıları yapmak için bir devre tahtası kullandım ve harici bir 5V adaptör kullandım. Bu devre kartı güç kaynağı kartını, kartınızı 5V ile çalıştırmak için de kullanabilirsiniz.
Devre hazır olduktan sonra tek yapmamız gereken bu sayfanın alt kısmında verilen kodu yüklemek ve aşağıda gösterildiği gibi Sıcaklık ve Nemi okumaya başlayabiliriz. Kodun nasıl yazıldığını ve nasıl çalıştığını öğrenmek istiyorsanız daha fazla okuyun. Ayrıca bu projenin tam çalışmasını bu sayfanın alt kısmında verilen videoda bulabilirsiniz.
PIC MPLABX Kod açıklaması ile DHT11
Kod MPLABX IDE kullanılarak yazılmıştır ve her ikisi de Microchip tarafından sağlanan ve indirilmesi ve kullanılması ücretsiz olan XC8 derleyicisi kullanılarak derlenmiştir. Programlamanın temellerini anlamak için lütfen temel öğreticilere bakın, yalnızca DHT11 sensörüyle iletişim için gerekli olan üç önemli işlev aşağıda tartışılmıştır. Fonksiyonlar -
void dht11_init (); void find_response (); char read_dht11 ();
İlk fonksiyon, dht11 ile başlatma sinyali için kullanılır. Daha önce tartışıldığı gibi, DHT11 ile her iletişim bir başlatma sinyaliyle başlar, burada ilk önce pim yönü mikro denetleyiciden çıktı olarak veri pinini yapılandırmak için değiştirilir. Ardından veri hattı aşağı çekilir ve 18mS'yi beklemeye devam eder. Bundan sonra, mikro denetleyici tarafından hat tekrar yükseltilir ve 30us'a kadar beklemeye devam eder. Bu bekleme süresinden sonra, veri pini verileri almak için mikro denetleyiciye girdi olarak ayarlanır.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // RD0'ı çıktı olarak yapılandırın DHT11_Data_Pin = 0; // RD0 sensöre 0 gönderir __delay_ms (18); DHT11_Data_Pin = 1; // RD0 sensöre 1 gönderir __delay_us (30); DHT11_Data_Pin_Direction = 1; // RD0'ı girdi olarak yapılandırın }
Bir sonraki fonksiyon, veri pin durumuna bağlı olarak bir kontrol biti ayarlamak için kullanılır. DHT11 sensöründen gelen yanıtı algılamak için kullanılır.
void find_response () { Check_bit = 0; __delay_us (40); eğer (DHT11_Data_Pin == 0) { __delay_us (80); eğer (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Son olarak dht11 okuma fonksiyonu; burada veriler, veri pin durumuna bağlı olarak bit kaydırma işlemi kullanılarak verilerin döndürüldüğü 8 bitlik bir formatta okunur.
char read_dht11 () { karakter verisi, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); eğer (DHT11_Data_Pin == 0) { veri & = ~ (1 << (7 - for_count)); // biti temizle (7-b) } else { data- = (1 << (7 - for_count)); // bit (7-b) olarak ayarlayın while (DHT11_Data_Pin); } } verileri döndür; }
Bundan sonra, her şey ana işleve yapılır. İlk olarak, sistem başlatma, LCD'nin başlatıldığı ve LCD pinlerinin bağlantı noktası yönünün çıkışa ayarlandığı yerde yapılır. Uygulama ana işlevin içinde çalışıyor
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); eğer (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = okuma_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Toplama = read_dht11 (); eğer (Toplama == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Nem = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Sıcaklık:"); // lcd_puts (""); lcd_data (48 + ((Nem / 10)% 10)); lcd_data (48 + (Nem% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Nem:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Sağlama toplamı hatası"); } } değilse { clear_screen (); lcd_com (0x80); lcd_puts ("Hata !!!"); lcd_com (0xC0); lcd_puts ("Yanıt Yok."); } __delay_ms (1000); } }
DHT11 sensörü ile iletişim, başlatma sinyalinin sensöre gönderildiği while döngüsü içinde yapılır. Bundan sonra find_response işlevi tetiklenir. Eğer Check_bit sonra 1'dir daha fazla iletişim aksi LCD hata iletişim kutusu gösterecektir yapılır.
40bit verilere bağlı olarak, read_dht11 5 kez (5 kez x 8 bit) olarak adlandırılır ve veri sayfası sağlanan veri formatında göre verileri depolanır. Sağlama durumu da kontrol edilir ve hatalar bulunursa, o da LCD bildirecektir. Son olarak, veriler dönüştürülür ve 16x2 karakter LCD'ye iletilir.
Bu PIC Sıcaklık ve Nem ölçümü için eksiksiz kod buradan indirilebilir. Ayrıca aşağıda verilen tanıtım videosunu kontrol edin.
Umarım projeyi anladınız ve faydalı bir şey inşa etmekten keyif aldınız. Herhangi bir sorunuz varsa, bunları aşağıdaki yorum bölümüne bırakın veya diğer teknik sorular için forumlarımızı kullanın.