- DHT11 - specyfikacja i działanie
- Komunikacja z czujnikiem DHT11
- Wymagane komponenty
- Schematyczny
- DHT11 z objaśnieniem kodu PIC MPLABX
Pomiar temperatury i wilgotności jest często przydatny w wielu zastosowaniach, takich jak automatyka domowa, monitorowanie środowiska, stacja pogodowa itp. Najpopularniejszym czujnikiem temperatury obok LM35 jest DHT11, wcześniej zbudowaliśmy wiele projektów DHT11, łącząc go z Arduino, z Raspberry Pi i wiele innych płyt programistycznych. W tym artykule dowiemy się, jak połączyć ten DHT11 z PIC16F87A, który jest 8-bitowym mikrokontrolerem PIC. Użyjemy tego mikrokontrolera do odczytu wartości Temperatury i Wilgotności za pomocą DHT11 i wyświetlimy je na wyświetlaczu LCD. Jeśli jesteś zupełnie nowy w używaniu mikrokontrolerów PIC, możesz skorzystać z naszej serii samouczków PIC, aby dowiedzieć się, jak programować i używać mikrokontrolera PIC.
DHT11 - specyfikacja i działanie
Czujnik DHT11 jest dostępny w postaci modułu lub czujnika. W tym samouczku używamy czujnika, jedyną różnicą między nimi jest to, że w postaci modułu czujnik ma kondensator filtrujący i rezystor podciągający przymocowany do styku wyjściowego czujnika. Więc jeśli używasz modułu, nie musisz dodawać ich zewnętrznie. Poniżej przedstawiono DHT11 w postaci czujnika.
Czujnik DHT11 jest dostarczany z obudową w kolorze niebieskim lub białym. Wewnątrz tej obudowy znajdują się dwa ważne elementy, które pomagają nam wyczuć wilgotność względną i temperaturę. Pierwszy element to para elektrod; o oporze elektrycznym między tymi dwoma elektrodami decyduje podłoże zatrzymujące wilgoć. Zatem zmierzona rezystancja jest odwrotnie proporcjonalna do wilgotności względnej otoczenia. Im wyższa wilgotność względna, niższa będzie wartość oporu i odwrotnie. Należy również pamiętać, że wilgotność względna różni się od rzeczywistej. Wilgotność względna mierzy zawartość wody w powietrzu w stosunku do temperatury powietrza.
Drugim elementem jest termistor NTC do montażu powierzchniowego. Termin NTC oznacza ujemny współczynnik temperaturowy, przy wzroście temperatury wartość rezystancji maleje. Wyjście czujnika jest skalibrowane fabrycznie, dlatego jako programista nie musimy martwić się o kalibrację czujnika. Wyjście czujnika podane przez komunikację 1-Wire, zobaczmy pin i schemat połączeń tego czujnika.
Produkt jest w 4-pinowym opakowaniu jednorzędowym. Pierwszy pin jest połączony przez VDD, a czwarty pin jest połączony przez GND. Drugi pin to pin danych, używany do celów komunikacyjnych. Ten pin danych wymaga rezystora podciągającego 5k. Jednak można również użyć innych rezystorów podciągających, takich jak 4,7 k do 10 k. Trzeci pin nie jest z niczym połączony. Więc jest ignorowany.
Arkusz danych zawiera specyfikacje techniczne, a także informacje dotyczące interfejsów, które można zobaczyć w poniższej tabeli:
Powyższa tabela przedstawia zakres i dokładność pomiaru temperatury i wilgotności. Może mierzyć temperaturę od 0-50 stopni Celsjusza z dokładnością +/- 2 stopnie Celsjusza i wilgotność względną od 20-90% RH z dokładnością +/- 5% RH. Szczegółową specyfikację można zobaczyć w poniższej tabeli.
Komunikacja z czujnikiem DHT11
Jak wspomniano wcześniej, aby odczytać dane z DHT11 za pomocą PIC, musimy użyć protokołu komunikacji PIC one wire. Szczegóły dotyczące tego, jak to zrobić, można zrozumieć na schemacie połączeń DHT 11, który można znaleźć w arkuszu danych, to samo podano poniżej.
DHT11 potrzebuje sygnału startu z MCU, aby rozpocząć komunikację. Dlatego za każdym razem MCU musi wysłać sygnał startu do czujnika DHT11, aby zażądać przesłania wartości temperatury i wilgotności. Po zakończeniu sygnału startu DHT11 wysyła sygnał odpowiedzi, który zawiera informacje o temperaturze i wilgotności. Transmisja danych odbywa się za pomocą protokołu transmisji danych z pojedynczą magistralą. Pełna długość danych wynosi 40 bitów, a czujnik najpierw wysyła wyższy bit danych.
Ze względu na rezystor podciągający, linia danych zawsze pozostaje na poziomie VCC w trybie bezczynności. MCU musi obniżyć to napięcie z wysokiego do niskiego poziomu przez co najmniej 18 ms. W tym czasie czujnik DHT11 wykrywa sygnał startu i mikrokontroler ustawia stan wysoki na linii danych przez 20-40us. Ten czas 20-40us nazywany jest okresem oczekiwania, w którym DHT11 rozpoczyna odpowiedź. Po tym okresie oczekiwania DHT11 przesyła dane do jednostki mikrokontrolera.
Format danych czujnika DHT11
Dane składają się z połączonych części dziesiętnych i całkowych. Czujnik obsługuje poniższy format danych -
8-bitowe całkowane dane RH + 8-bitowe dziesiętne dane RH + 8-bitowe całkowite dane T + 8-bitowe dziesiętne dane T + 8-bitowe sumy kontrolne.
Dane można zweryfikować sprawdzając wartość sumy kontrolnej z otrzymanymi danymi. Można to zrobić, ponieważ jeśli wszystko jest w porządku i jeśli czujnik przesłał poprawne dane, to suma kontrolna powinna być sumą „8-bitowych całkowanych danych RH + 8-bitowych całkowych danych RH + 8-bitowych całkowych danych T + 8-bitowych dziesiętnych danych T”.
Wymagane komponenty
W przypadku tego projektu wymagane są poniższe rzeczy -
- Konfiguracja programowania mikrokontrolera PIC (8-bitowego).
- Płytka prototypowa
- Zasilacz 5V 500mA.
- Rezystor 4,7k 2szt
- Rezystor 1k
- PIC16F877A
- Kryształ 20 MHz
- Kondensator 33pF 2 szt
- Wyświetlacz LCD 16x2 znaków
- Czujnik DHT11
- Przewody połączeniowe
Schematyczny
Schemat obwodu do połączenia DHT11 z PIC16F877A pokazano poniżej.
Użyliśmy wyświetlacza LCD 16x2 do wyświetlania wartości temperatury i wilgotności, które mierzymy z DHT11. Wyświetlacz LCD jest połączony w trybie 4-przewodowym, a zarówno czujnik, jak i wyświetlacz LCD są zasilane z zewnętrznego źródła zasilania 5 V. Użyłem płytki prototypowej do wykonania wszystkich wymaganych połączeń i użyłem zewnętrznego adaptera 5 V. Możesz również użyć tej płytki zasilającej do płytki prototypowej, aby zasilić swoją płytkę napięciem 5 V.
Gdy obwód będzie gotowy, wszystko, co musimy zrobić, to załadować kod podany na dole tej strony i możemy rozpocząć odczytywanie temperatury i wilgotności, jak pokazano poniżej. Jeśli chcesz wiedzieć, jak kod został napisany i jak działa, przeczytaj dalej. Pełną pracę tego projektu można również znaleźć w filmie wideo zamieszczonym na dole tej strony.
DHT11 z objaśnieniem kodu PIC MPLABX
Kod został napisany przy użyciu MPLABX IDE i skompilowany przy użyciu kompilatora XC8, który został dostarczony przez samą firmę Microchip i można go bezpłatnie pobrać i używać. Zapoznaj się z podstawowymi samouczkami, aby zrozumieć podstawy programowania. Poniżej omówiono tylko trzy ważne funkcje, które są wymagane do komunikacji z czujnikiem DHT11. Funkcje są -
void dht11_init (); void find_response (); char read_dht11 ();
Pierwsza funkcja jest używana dla sygnału startu z dht11. Jak wspomniano wcześniej, każda komunikacja z DHT11 zaczyna się od sygnału startu, tutaj kierunek pinów jest najpierw zmieniany, aby skonfigurować pin danych jako wyjście z mikrokontrolera. Następnie linia danych jest obniżana i czeka na 18 ms. Następnie mikrokontroler ponownie podnosi linię i czeka do 30us. Po tym czasie oczekiwania pin danych ustawia się jako wejście do mikrokontrolera w celu odbioru danych.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Skonfiguruj RD0 jako wyjście DHT11_Data_Pin = 0; // RD0 wysyła 0 do czujnika __delay_ms (18); DHT11_Data_Pin = 1; // RD0 wysyła 1 do czujnika __delay_us (30); DHT11_Data_Pin_Direction = 1; // Skonfiguruj RD0 jako wejście }
Następna funkcja służy do ustawienia bitu kontrolnego w zależności od stanu pinów danych. Służy do wykrywania odpowiedzi czujnika DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Wreszcie funkcja odczytu dht11; tutaj dane są wczytywane do formatu 8-bitowego, w którym dane są zwracane przy użyciu operacji przesunięcia bitów w zależności od stanu pinów danych.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { dane & = ~ (1 << (7 - for_count)); // Wyczyść bit (7-b) } else { data- = (1 << (7 - for_count)); // Ustaw bit (7-b) while (DHT11_Data_Pin); } } zwracane dane; }
Wcześniejsze
Następnie wszystko odbywa się w głównej funkcji. Najpierw inicjalizacja systemu jest wykonywana, gdy wyświetlacz LCD jest inicjalizowany, a kierunek portu pinów LCD jest ustawiony na wyjście. Aplikacja działa wewnątrz funkcji głównej
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Podsumowanie = read_dht11 (); if (Sumowanie == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Wilgotność = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Wilgotność / 10)% 10)); lcd_data (48 + (wilgotność% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Wilgotność:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Błąd sumy kontrolnej"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Błąd !!!"); lcd_com (0xC0); lcd_puts ("Brak odpowiedzi."); } __delay_ms (1000); } }
Komunikacja z czujnikiem DHT11 odbywa się wewnątrz while pętli, gdzie sygnał startu jest przekazywanych do czujnika. Następnie wywoływana jest funkcja find_response . Jeśli Check_bit ma wartość 1, dalsza komunikacja jest prowadzona, w przeciwnym razie na wyświetlaczu LCD pojawi się okno dialogowe błędu.
W zależności od danych 40-bitowych, read_dht11 jest wywoływane 5 razy (5 razy x 8 bitów) i zapisuje dane zgodnie z formatem danych podanym w arkuszu danych. Stan sumy kontrolnej jest również sprawdzany, a jeśli zostaną znalezione błędy, powiadomi również o tym na wyświetlaczu LCD. Na koniec dane są konwertowane i przesyłane do wyświetlacza LCD 16x2 znaków.
Pełny kod tego pomiaru temperatury i wilgotności PIC można pobrać tutaj. Sprawdź również film demonstracyjny podany poniżej.
Mam nadzieję, że zrozumiałeś projekt i podobało Ci się stworzenie czegoś pożytecznego. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej lub skorzystaj z naszych forów, aby uzyskać odpowiedzi na inne pytania techniczne.