Kombinovaný snímač teploty a vlhkosti DHT22
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2025 - Martin Hubocký
Zadanie
Mojím zadaním bolo vytvoriť program, ktorý bude zo senzoru DHT22 (Snímač teploty a vlhkosti) čítať a spracovávať dáta a cez UART sériovú komunikáciu ich vypísať na obrazovku monitoru. V prípade že sa mi to podarí spravím rozšírenie programu aby sa dáta zobrazovali na displeji typu LCD (Liquid Crystal Display).

Analýza a opis riešenia
Postup vypracovávania projektu a opis činnosti zariadenia
Najskôr som vo vývojovom prostredí Arduino IDE overil funkčnosť snímača. V tomto prostredí sa nachádza množstvo knižníc, takže mi "spojazdnenie" snímaču trvalo pár minút. Keď som si bol istý že snímač funguje, prešiel som do prostredia AVR, kde to bez knižníc bolo trochu tažšie (trochu dosť :) ). Najskôr sa mi dlhú dobu nedarilo, potom sa mi podarilo cez UART vypísať celočíselné hodnoty, a napokon aj desatinné miesta. Na komunikáciu cez UART som samozrejme použil knižnicu, ktorú sme si vytvárali na cvičení z predmetu.
Ďalej som postupoval s pripojením displeja k mikrokontroléru podľa návodu na stránke (Tu), kde bol takisto aj link na stiahnutie knižnice lcd_ch.h (a lcd_ch.c), ktorú takisto vo svojom programe používam. Vytvoril (zadefinoval) som si dva vlastné znaky. 1. bol znak "°" (Stupeň Celzia), a 2. bol znak "ť" ktorý sa mi nepodaril práve najkrajšie (Pretože displej ktorý vo svojom projekte používam vykresľuje jeden znak pomocou políčka o rozmeroch 5x7 pixelov a nie 5x8 pixelov ako niektoré iné modely). Takisto som vypol kurzor displeju pretože mi osobne vadil. Zo začiatku som si myslel že displej nefunguje, no neskôr som si uvedomil svoju amatérsku chybu keď som zistil že som pomocou potenciometra nemal nastavený správny jas. Okrem toho som s displejom žiadny iný problém nemal.
Týmto som mal hlavnú úlohu svojho projektu splnenú, no rozhodol som sa ho ešte obohatiť o svetelnú a zvukovú signalizáciu. Do zapojenia som pridal dve RGB LED diódy (aj s rezistormi k nim) a jedno Piezo. Jedna dióda mala signalizovať stav teploty a druhá stav vlhkosti. Každá má 5 stavov:
1. Veľmi nízka hodnota - Biela farba - (1. Teplota je nižšia ako 28 °C), (2. Vlhkosť je nižšia ako 50 %)
2. Nízka hodnota - Modrá farba - (1. Teplota je v rozmedzí 28 - 32 °C), (2. Vlhkosť je v rozmedzí 50 - 60 %)
3. Stredná hodnota - Zelená farba - (1. Teplota je v rozmedzí 32 - 36 °C), (2. Vlhkosť je v rozmedzí 60 - 70 %)
4. Vysoká hodnota - Červená farba - (1. Teplota je v rozmedzí 36 - 40 °C), (2. Vlhkosť je v rozmedzí 70 - 80 %)
5. Veľmi vysoká hodnota - Fialová farba - (1. Teplota je vyššia ako 40 °C), (2. Vlhkosť je vyššia ako 80 %)
Úlohou pieza je signalizovať zmenu týchto 5 stavov (pípaním). Keďže piezo je len jedno, signalizuje zmenu stavu aj pre teplotu aj pre vlhkosť, no rozdiel je v tom že pri zmene stavu teploty spraví "krátke pípnutie" a pri zmene vlhkosti "dlhé pípnutie". Piezo rozlišuje aj to, či sa stav zmenil smerom nahor alebo nadol (teda napríklad či sa teplota zvýšila alebo znížila), a to tak, že pri zmene stavu nahor (inkrementácii), pípne dva krát a pri zmene stavu nadol (dekrementácii), pípne len raz. Teda ak sa napríklad zvýši stav vlhkosti, piezo spraví dve dlhé pípnutia, ak sa napríklad zníži stav teploty piezo spraví jedno krátke pípnutie a pod. Ak sa stane že teplota alebo vlhkosť dosiahne posledný 5. stav (najvyšší), piezo bude pípať "stále" (v skutočnosti bude pípať 5x v každej main() slučke programu). V tomto prípade som nepredpokladal že by som pri mojom "amatérskom testovaní" mohol vytvoriť také podmienky, že by mohlo dôjsť k 5. stavu teploty aj vlhkosti súčasne keďže zo zvyšujúcou sa teplotou vlhkosť klesá a zas naopak.
Poslednou vecou ktorú som spravil bolo, že som si zo starej stavebnice poskladal držiak na ktorý som umiestnil snímač aby som si uľahčil testovaciu (overovaciu) časť tohto projektu.

Schéma zapojenia a jej popis
Mikrokontrolér Arduino UNO R3
- MASTER (riadiaci orgán celého zariadenia)
- sú k nemu pripojené všetky ostatné zariadenia a súčiastky použité v projekte
- je napájaný priamo z notebooku pomocou USB kábla (a zároveň je ním aj programovaný)
Snímač teploty a vlhkosti DHT22
- má 3 piny:
VCC - pripojený k 5V pinu mikrokontroléra GND - pripojený ku GND (Zem) pinu mikrokontroléra DATA - pripojený k D8 pinu mikrokontroléra --> Cez tento pin prichádzajú do mikrokontroléra dáta v tvare: [Vlhkosť celé číslo, Vlhkosť desatinné číslo, Teplota celé číslo, Teplota desatinné číslo, Kontrolný súčet] [8 bitov, 8 bitov, 8 bitov, 8 bitov, 8 bitov; 8 + 8 + 8 + 8 + 8 = 40 bitový prenos]
Liquid Crystal Display typu DEM16216
- má 16 pinov:
VSS - pripojený ku GND (Zem) pinu mikrokontroléra VDD - pripojený k 5V pinu mikrokontroléra --> Piny VSS a VDD slúžia na napájanie displeja VO - je naň prostredníctvom potenciometra privedené napätie --> Týmto pinom sa v závislosti od privedeného napätia nastavuje jas (kontrast) RS - je pripojený k D2 pinu mikrokontroléra --> Slúži na výber registra (Command RS=0; DATA RS=1) R/W - je pripojený k D3 pinu mikrokontroléra --> Slúži na výber medzi čítaním alebo zápisom (READ R/W=1; WRITE R/W=0) E - je pripojený k D4 pinu mikrokontroléra --> Slúži na spustenie časového signálu (Hovorí displeju kedy má čítať) (Reaguje pri dobežnej hrane) D0-D3 - sú nezapojené (pretože nepoužívam 8 bitový mód ale len 4 bitový) D4-D7 - sú zapojené k pinom D9-D12 mikrokontroléru --> Slúžia na 4 bitový prenos dát A - pripojený ku GND (Zem) pinu mikrokontroléra K - pripojený k 5V pinu mikrokontroléra --> Piny A a K slúžia na zapnutie podsvietenia displeja
RGB LED Diódy
- každá má 4 piny:
R - sú cez odpory R6 a R3 (220 Ω) pripojené k A0 (LED1) a A3 (LED2) pinom mikrokontroléra --> Slúžia na zapínanie červenej LED diódy (privedením log. 1) G - sú cez odpory R5 a R2 (220 Ω) pripojené k A1 (LED1) a A4 (LED2) pinom mikrokontroléra --> Slúžia na zapínanie zelenej LED diódy (privedením log. 1) B - sú cez odpory R4 a R1 (220 Ω) pripojené k A2 (LED1) a A5 (LED2) pinom mikrokontroléra --> Slúžia na zapínanie modrej LED diódy (privedením log. 1) GND - obidva piny (LED1 aj LED2) sú pripojené ku GND (Zem) pinu mikrokontroléra
Piezo
- má 2 piny:
VCC - pripojený k D13 pinu mikrokontroléra --> V závislosti od signálu vydá piezo zvuk (V mojom prípade je to vždy log. 1 a teda frekvencia zvuku je vždy rovnaká) GND - pripojený ku GND (Zem) pinu mikrokontroléra

Algoritmus a program
Vo svojom hlavnom programe som si vytvoril nasledovné funkcie:
- void lcd_print_float(float hodnota);
- void Vlastne_znaky(void);
- void RGB_teplota(uint8_t cervena, uint8_t zelena, uint8_t modra);
- void RGB_vlhkost(uint8_t cervena, uint8_t zelena, uint8_t modra);
- void Farba_teplota(float teplota);
- void Farba_vlhkost(float vlhkost);
- void Pipnutie(uint8_t pocet_pipnuti);
- void Pipnutie_dlhe(uint8_t pocet_pipnuti);
- uint8_t Precitaj_senzor(void);
Okrem týchto funkcií nepriamo využívam aj pár pomocných funkcií z knižníc. Tie používam dve:
- uart.h (a uart.c) - Túto knižnicu sme si robili na cvičení z predmetu počas semestru
- lcd_ch.h (a lcd_ch.c) - Túto knižnicu som podľa dohody s vyučujúcim použil z web-stránky ktorej odkaz je uvedený na samom spodku pod názvom "Práca s displejom"
Tu je výpis celého kódu aj spolu s knižnicami:
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
Kompletný projekt nájdete tu:
Zdrojový kód: ProjektMartinHubocky.zip
Overenie funkčnosti zariadenia
Funkčnosť zariadenia som overil veľmi jednoducho a to tak že som menil teplotu a vlhkosť v okolí snímača a sledoval či sa zariadenie správa tak ako som chcel. Vlhkosť som menil tak že som na snímač dýchal ústami čím sa mi podarilo zvýšiť vlhkosť niekedy až na 90%. Účinok je takmer instantný a rovnako tak je aj pokles naspäť veľmi rýchly. No a ako som menil teplotu? (.....) Bohužiaľ ma nenapadlo nič "inteligentnejšie" ako ohrievať snímač zospodu zapaľovačom. Bolo to pomerne rýchle, no ale samozrejme som svoju "šikovnosť" nezaprel a raz sa mi podarilo snímač "opáliť". Našťastie stále funguje...
Na obrázku číslo 5 môžete vidieť funkčnosť UART-u a nižšie je video kde môžete vidieť priebeh testovania zariadenia. Rád by som podotkol že na videu sú farby RGB LED diód veľmi skreslené a ťažko ich od seba odlíšiť (niekedy sa zdá že sa farby ani nezmenili), za čo sa ospravedlňujem.


Video:
Literatúra a použité zdroje
Dokumentácia k mikrokontroléru:
- Mikrokontrolér Arduino UNO R3 - PINOUT
- Mikrokontrolér Arduino UNO R3 - DATASHEET
- Mikrokontrolér Arduino UNO R3 - SCHEMATICS
- Dokumentácia k procesoru ATmega328P
Dokumentácia k snímaču DHT22:
Dokumentácia k LCD displeju: