sensor DHT11 DHT21 odczyt danych

sensor DHT11 DHT21 odczyt danych
5 (100%) 1 vote

Sensor DHT11 DHT21 struktura i dekodowanie odebranych bajtów.

W poprzednim artykule przedstawiłem różnice w funkcjonalności rodziny sensorów (DHT11, DHT21) do pomiaru wartości temperatury i wilgotności względnej otoczenia. Stwierdziłem wtedy: Rodzina sensorów jest obfita w modele, które generalnie różnią się dokładnością pomiarów i ich powtarzalnością. DHT11, SHT11, DHT22, AM2301, AM2302, AM2303.
Teraz zajmę się przedstawieniem, i podaniem różnic, w sposób praktyczny jak przetworzyć odebrane bajty i wyłuskać z nich informację o wartościach zmierzonych czynników środowiskowych. Więc na „warsztat” trafia temat: sensor DHT11 DHT21 odczyt danych. Opis będzie nawiązywał do informacji z załączonych not katalogowych o nazwach: DHT11-1.pdf i AM2301.pdf. A więc do dzieła 😉

Z tego co jest istotne dla prawidłowego odczytania wartości pomiarów, to zakres i rozdzielczość generowanych wyników oraz ich precyzja. Dla nas ma znaczenie rozdzielczość z tytułu kodowania danych, na różny sposób (po mimo identycznie zorganizowanych bajtów z wysyłanymi danymi), pomiędzy poszczególnymi modelami sensorów.
No więc jak jest wiadomo, każdy sensor z poszczególnej rodziny „wypluwa” 40 bitów, z których powstaje 5 słów bajtowych. Licząc od części najbardziej znaczącej, każdy produkuje dwa bajty z wilgotnością, kolejnie dwa bajty z temperaturą i bajt z sumą kontrolną. I tu kończą się zgodności.

DHT11

ponieważ ma rozdzielczość 1 nie generuje części dziesiętnej (ułamkowej), która zawsze jest równa zero, zarówno przy temperaturze jak i wilgotności. Więc autor programu, który zamieściłem zignorował więc przetwarzanie tych bajtów, dla uproszczenia kodu.
Na potwierdzenie mojej teorii w nocie wyczytamy:

Data consists of decimal and integral parts. A complete data transmission is 40bit, and the
sensor sends higher data bit first.
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T
data + 8bit check sum. If the data transmission is right, the check-sum should be the last 8bit of
„8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data”

Czyli dla podkreślenia: sensor wysyła najpierw część całkowitą, a potem dziesiętną w tym przypadku zawsze równą zero.

bardzo wymowny opis z przykładem odczytu i przeliczenia danych

bardzo wymowny opis z przykładem odczytu i przeliczenia danych

Jak to zrobić w programie?

Kod zaczerpnięty z internetu, nie jestem jego autorem.

DRD to rejestr odpowiedzialny za konfigurację pinów IO, zapisy równoznaczne z np Config Pind.1 = Output/Input.
W tym programie pin do komunikacji z DHT raz jest wejściem a razy wyjściem, i stąd to.

DHT21 (DHT22, AM2301, AM2302, AM2303)

ten ma rozdzielczość jedną dziesiątą i trochę inaczej dane są upychane w tych 16 bitach, co można łatwo obejrzeć w nocie.

esencja o odebranych bitach i sposobie ich przetworzenia na wynik w oczekiwanym formanie

esencja o odebranych bitach i sposobie ich przetworzenia na wynik w oczekiwanym formacie

Dla przykładu temperatura 23,4 stopnie Celsjusza kodowana jest jako liczba 234, i trzeba sobie wstawić w odpowiednie miejsce przecinek. Dokładnie to widać w programie zamieszczonym poniżej. Dlatego dla zapisu tak dużej liczby potrzeba nierozłącznych dwóch bajtów (zakres temperatury do 80,0°C, wilgotności do 99,9%RH).

Nie jestem autorem tego kodu, a służy on jedynie za pomoc dydaktyczną w moich rozpatrywaniach ;-D

To co jest jeszcze istotne, to sposób „kodowania” temperatury ujemnej w sensorze, który ją umie mierzyć. Przedstawiony program nie zawiera jej obsługi. Znacznik „mrozów” to bit nr 24 (najstarszy bit temperatury), gdy jest ustawiony oznacza, że jako wynik dostaliśmy wartość ujemną. Należało by badać jego wystąpienie i przedsięwziąć odpowiednią akcję.
Warto jeszcze zwróć uwagę jak ciekawie autor tego kodu ominął dzielenie, przy wyświetlaniu wyniku, które jest mordęgą dla 8-śmio bitowego µC. Po prostu formatuje string-a przy wyświetlaniu 😉

jak cyferki są niepotrzebne do obliczeń itp  to jest to bardzo sprytne rozwiązanie.

Jak dla mnie pierwszy program mniej elegancki na instrukcji waitus, jest bardziej interesujący do wykorzystania w małym µC, pochłania mniej zasobów µC, i generuje mniejszą binarkę. Natomiast program z funkcjami i procedurami jest bardziej „edukacyjny” ale ma dla mnie jedną niedogodność – bitwait. W przypadku problemów „z łącznością” program może pójść w maliny i warto by tu zastosować watchdog-a, aby temu zapobiec. Co zeżre oczywiście następne bajty pamięci flash. W przypadku chwilowego rozłączenia sensor „wysypie” swoje bity, a µC będzie czekał w nieskończoność na wystąpienie stosownego bitu.

Aby pierwszy przykład kodu dostosować do obsługi drugiej rodziny sensorów trzeba by zając się na nowo zdekodowaniem danych temperatury i wilgotności z ciągu odczytanych bitów. Kolejnie wyłuskać i analizować znacznik mrozów, co nie powinno nikomu przysporzyć żadnych problemów.


Prezentacja układu z pomiarem temperatury za pośrednictwem przedstawionej metody.


Nota katalogowa AM2301.pdf (330 pobrań)
Nota katalogowa AM2302.pdf (315 pobrań)
Nota katalogowa AM2303.pdf (278 pobrań)
Nota katalogowa DHT11.pdf (338 pobrań)
Nota katalogowa DHT11-1.pdf (262 pobrania)
Nota katalogowa DHT22.pdf (1377 pobrań)

Share Button
Tagi , , , , , , , , , , , , , , , , .Dodaj do zakładek Link.

Jedna odpowiedź na „sensor DHT11 DHT21 odczyt danych

  1. GEx mówi:

    Może wygodniej i bezpieczniej jest używać Pulsein,  Pulseout,  niż bitwait czy timer ów? 😆

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

one + twelve =