Kursy • Poradniki • Inspirujące DIY • Forum
Czym jest pomiar wilgotności?
Bardzo często w kontekście Arduino pojawia się temat czujników wilgotności. Jednak w większości poradników pomija informacje na temat tego "co tak właściwie jest mierzone".
Opisywany w artykule czujnik DHT-11 mierzy wilgotność względną, którą w skrócie oznacza się jako RH od angielskiego Relative Humidity. Wartość ta mieści się zawsze w zakresie od 0 do 1 i nie ma swojej jednostki. Dlatego najczęściej wilgotność względną wyraża się w %RH - czyli podaje się wartość procentową z zakresu od 0 do 100%, gdzie 0%RH oznacza powietrze suche, a 100%RH oznacza powietrze o maksymalnym stężeniu pary wodnej.
Najprościej mówiąc, wilgotność względna informuje nas o ilości wody w powietrzu.
Jeśli wartość ta osiągnie 100% woda zacznie wydzielać się w postaci kropel.
Jeśli ktoś woli definicje bardziej "akademickie", to odsyłam do Wikipedii, gdzie znaleźć można, że: "wilgotność względna, to stosunek ciśnienia cząstkowego pary wodnej zawartej w powietrzu do ciśnienia nasycenia nad płaską powierzchnią czystej wody, określającego maksymalne ciśnienie cząstkowe pary wodnej w danej temperaturze."
Zajmując się opisywanym zagadnieniem warto jeszcze pamiętać o tym, że ilość wody, którą jest w stanie pomieścić powietrze zależy również m.in. od jego temperatury. Wraz ze zmianą wskazań termometru zmieniać będzie się %RH. Dla przypomnienia, skroplenie wody może nastąpić, gdy: dostarczymy brakującą ilość wody do powietrza lub, gdy obniżymy jego temperaturę. Aby nie przesadzić z teorią, zainteresowane osoby odsyłam do haseł wykres Molliera (uwaga, bo wygląda strasznie) oraz punkt rosy. Teraz pora przejść do praktyki!
Gotowe zestawy do kursów Forbota
Komplet elementów Gwarancja pomocy Wysyłka w 24h
Części do wykonania ćwiczeć z kursu Arduino (poziom 2) dostępne są w formie gotowych zestawów! W komplecie m.in. diody programowalne, termometry analogowe i cyfrowe, wyświetlacze 7-segmentowe oraz czujnik ruchu (PIR).
Zamów w Botland.com.pl »Czujnik DHT-11 w praktyce
Nasze testy przeprowadzimy na popularnym, cyfrowym czujniku DHT-11. Układ ten łączy w jednej obudowie termometr oraz czujnik wilgotności. Informacje z czujnika odczytać można za pomocą interfejsu jednoprzewodowego. W wielu miejscach znaleźć można informację, że czujnik ten korzysta z 1-wire (znanego np. z omawianych czujników DS18B20) - nie jest to prawdą!
Czujniki DHT-11 korzystają ze zmodyfikowanej wersji interfejsu 1-wire,
która nie jest zgodna z tym standardem!
Z niebieskiej obudowy wystają 4 wyprowadzenia, jednak tylko 3 z nich są wykorzystane. Wyjście oznaczone jako NC (skrót od Not Connected) nie pełni żadnej istotnej funkcji i nie trzeba go nigdzie podłączać. Najważniejsze parametry czujnika:
- Ogólne:
- Napięcie zasilania: 3 V do 5,5 V (w naszym przypadku będzie to 5 V)
- Pobór prądu: 0,2 mA
- Częstotliwość próbkowania: 1Hz (nowe informacje można odczytywać co sekundę)
- Wbudowany termometr
- Zakres pomiarowy: 0 - 50 °C
- Dokładność: ±2°C
- Czujnik wilgotności:
- Zakres pomiarowy: 20 - 95%RH
- Dokładność ±5%RH
Więcej informacji na temat czujnika DHT-11
znaleźć można w jego dokumentacji.
Niestety w sprzedaży można natrafić na różne wersje tego czujnika, które mogą charakteryzować się różnymi zakresami pomiarowymi. Na szczęście, na tylnej ściance obudowy DHT-11 często producenci drukują najważniejsze informacje. W moim przypadku wyglądało to następująco:
- Widok czujnika DHT-11 od przodu.
- Widok czujnika DHT-11 od tyłu.
Jeśli jesteśmy już przy obudowie, to warto zajrzeć do środka - zalecam jednak ostrożność przy jego otwieraniu. Poniżej umieszczam zdjęcia przykładowego egzemplarza więc nie ma potrzeby, aby każdy rozkładał swój sensor na czynniki pierwsze.
Istnieje wiele "różnych wersji wnętrza" - niektóre czujniki mogą wyglądać w środku zupełnie inaczej. Pozostaje wierzyć producentom, że wszystkie wersje działają poprawnie.
Układ mierzy temperaturę w zakresie od 0 do 50°C, więc idealnie sprawdzi się podczas monitorowania pomieszczeń. Ta wersja czujnika nie nadaje się do stosowania na zewnątrz, gdzie spodziewamy się ujemnych temperatur.
Większym zakresem pomiarowym charakteryzują się
bliźniacze czujniki DHT-21 oraz DHT-22 jednak są one 3-4 razy droższe.
Podłączenie czujnika DHT-11 do Arduino
Czujnik DHT-11 korzysta z interfejsu podobnego 1-wire, więc jego podłączenie jest bardzo proste. Na początek zasilanie 5V i GND, następnie łączymy linię danych z Arduino (np. z pinem nr 2).
Tak samo jak w poprzedniej części kursu konieczne jest dodanie rezystora 4.7k,
który łączy linię danych z dodatnią szyną zasilania.
Przykładowe podłączenie widoczne jest na poniższym zdjęciu:
- Podłączenie DHT-11 do Arduino UNO.
- Zbliżenie na DHT-11.
Komunikacja z czujnikiem DHT-11
Oczywiście w Internecie znaleźć można co najmniej kilka gotowych bibliotek, które ułatwią nam korzystanie z tego sensora. W swoich projektach najchętniej korzystam z bardzo prostej biblioteki, której autorem jest Mark Ruys. Niezbędne pliki znaleźć można na GitHubie autora.
Biblioteka potrafi również samodzielnie wykryć i obsłużyć
inne czujniki tego typu (np.: DHT22, AM2302, RHT03).
Po zainstalowaniu biblioteki (proces ten był opisywany we wcześniejszych odcinkach kursu) można przejść do napisania pierwszego programu. Zaczynamy od pustego szkieletu z dołączonym plikiem nagłówkowym biblioteki, definicją pinu oraz uruchomioną komunikacją przez UART:
#include "DHT.h"
#define DHT11_PIN 2
void setup()
{
Serial.begin(9600);
}
void loop()
{
}
W kolejnym kroku należy zadeklarować czujnik oraz poinformować bibliotekę o pinie, na którym ma odbywać się komunikacja:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;
void setup()
{
Serial.begin(9600);
dht.setup(DHT11_PIN);
}
void loop()
{
}
Odczytanie wilgotności i temperatury z DHT-11
Teraz w pętli głównej można przejść już do odczytów. Tutaj przydadzą się dwie funkcje. Pierwsza do pobierania informacji na temat wilgotności w %RH: dht.getHumidity() oraz druga do odczytywania temperatury w °C: dht.getTemperature().
Program w najprostszej postaci będzie więc wyglądał następująco:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;
void setup()
{
Serial.begin(9600);
dht.setup(DHT11_PIN);
}
void loop()
{
//Pobranie informacji o wilgotnosci
int wilgotnosc = dht.getHumidity();
Serial.print(wilgotnosc);
Serial.print("%RH | ");
//Pobranie informacji o temperaturze
int temperatura = dht.getTemperature();
Serial.print(temperatura);
Serial.println("*C");
delay(1000); //Odczekanie wymaganego czasu
}
Działanie programu w praktyce widoczne jest na poniższej animacji. Czujnik potrzebuje stosunkowo dużo czasu na zarejestrowanie zmiany wilgotności i temperatury - może to zająć nawet od 6 do 15 sekund (typowo około 10). Więcej informacji na ten temat znaleźć można w nocie katalogowej.
Poniższa animacja przedstawia zachowanie czujnika po chuchnięciu na niego:
Niestety czasami mogą wystąpić pewne problemy z komunikacją lub inne błędy. Wtedy na ekranie zostanie wyświetlona informacja o temperaturze i wilgotności wynoszącej 0. Używana przez nas biblioteka zawiera jeszcze kilka ciekawych funkcji, które pozwolą uniknąć takich problemów.
Po pierwsze, nie ma konieczności, aby wpisywać "na sztywno" czas, po którym może nastąpić kolejny odczyt. Dzięki funkcji dht.getMinimumSamplingPeriod() możliwe jest pobranie informacji o czasie, który trzeba odczekać podczas korzystania z danego czujnika.
Po drugie, za pomocą funkcji dht.getStatusString() możemy sprawdzić, czy odczytanie pomiarów przebiegło bezbłędnie. Jeśli tak będzie, to powyższa funkcja zwróci nam "OK". W przypadku błędu otrzymamy odpowiednią informację np. "TIMEOUT".
Dzięki powyższym funkcjom program może wyglądać następująco:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;
void setup()
{
Serial.begin(9600);
dht.setup(DHT11_PIN);
}
void loop()
{
//Pobranie informacji o wilgotnosci
int wilgotnosc = dht.getHumidity();
//Pobranie informacji o temperaturze
int temperatura = dht.getTemperature();
if (dht.getStatusString() == "OK") {
Serial.print(wilgotnosc);
Serial.print("%RH | ");
Serial.print(temperatura);
Serial.println("*C");
}
//Odczekanie wymaganego czasugo
delay(dht.getMinimumSamplingPeriod());
}
Od teraz w momencie napotkania błędu żadne informacje nie będą wyświetlane. Przykład działania tego programu widoczny jest poniżej. Uszkodzenie czujnika symulowane było odłączeniem przewodu, który łączył DHT-11 z Arduino.
Na sam koniec warto jeszcze wspomnieć o ostatniej funkcji zaszytej w naszej bibliotece, która przelicza temperaturę na skalę Fahrenheita: dht.toFahrenheit(). W praktyce w naszym przypadku jej wywołanie wyglądałoby następująco:
Serial.print(dht.toFahrenheit(temperatura));
Serial.println("F");
Działanie zmienionego programu:
Podsumowanie
Czujnik DHT-11, jak doskonale widać powyżej, jest bardzo prosty w wykorzystaniu, dlatego cały artykuł nie musiał być długi. Korzystając z wiedzy zdobytej podczas tego i poprzedniego artykułu zachęcam do zbudowania prostej stacji pogodowej. Urządzenie to może mierzyć temperaturę, wilgotność i zachmurzenie (za pomocą fotorezystora). Wyniki można prezentować przykładowo na komputerze lub na linijce diod programowalnych.
W następnym artykule zajmiemy się funkcją millis(), która pozwala na generowanie opóźnień, które nie zawieszają całego programu. Przy okazji stworzymy praktyczny projekt inteligentnego oświetlenia. Łącząc elementy z poprzednich części stworzymy układ ułatwiający poruszanie się po zmroku!
Nawigacja kursu
Autor kursu: Damian (Treker) Szymański
Ilustracje: Piotr Adamczyk
Załączniki
Powiązane wpisy
arduino, czujnik, dht11, kurs, kursArduino2, programowanie, wilgotności
Trwa ładowanie komentarzy...