V garáži pozoruji již delší dobu zvýšenou vlhkost. Ta působí zvýšený výskyt koroze na brzdových kotoučích i jiných částech automobilu. Proto jsem se rozhodnul vytvořit nejen dva větrací otvory, ale i podpořit cirkulaci vzduchu pomocí ventilátoru spínaném v okamžiku, kdy vlhkost stoupne.
Použité součástky:
Arduino Nano
DHT 11
Rezistor 10kΩ
LCD 20x4
Relé modul 5V, 4-kanálový
Ventilátor průměr 80 mm; 12V
Zapojení je vlastně úplně jednoduché. DHT11 měří vlhkost (teplota je v podstatě bonus). Pokud vlhkost stoupne, nastavená hanice je 40%, zapne se ventilátor. Hystereze je nastavená tak, aby se ventilátor vypnul při vlhkosti nižší, než 35%.
Využil jsem však dostatku místa na CD displeji a trošku si pohrál s kódem. Je zde zobrazena nejen aktuální teplota a vlhkost, ale i minimální a maximální dosažená hodota vlhkosti a také zda od posledního měření klesá, stoupá, nebo je stálá. Rovněž je zde signalizován stav ventilátoru ON/OFF.
![]() |
| LCD displej |
Výpis kódu:
-------------------------------------------------------------------------------------------------------------------------------
// **************Teploměr a vlhkoměr s DHT11/22 *****************
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27,20,4);
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT 5
// odkomentování správného typu čidla
#define typDHT11 DHT11 // DHT 11
//#define typDHT22 DHT22 // DHT 22 (AM2302)
// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);
int tep;
int vlh;
const int rele_vetrak = 13;
boolean vetrak_toci = false;
int vlh_vyp = 35;
int vlh_zap = 40;
int vlh_stara = 0;
int vlh_max = 0;
int vlh_min = 100;
void setup() {
Serial.begin(9600);
// zapnutí komunikace s teploměrem DHT
mojeDHT.begin();
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("---------------------");
lcd.setCursor(0,1);
lcd.print("| Teplomer a |");
lcd.setCursor(0,2);
lcd.print("| vlhkomer |");
lcd.setCursor(0,3);
lcd.print("---------------------");
delay(5000);
test_ventilatoru();
}
void loop() {
mereni();
//serialovy_vypis();
vypis_lcd();
hystereze_vlhkost();
stav_vlhkosti();
vlhkost_max();
vlhkost_min();
delay(5000); // pauza pro dalsi mereni
}
// funce mereni
void mereni(){
tep = mojeDHT.readTemperature();
vlh = mojeDHT.readHumidity();
}
// funkce vypis serial
void serialovy_vypis(){
if (isnan(tep) || isnan(vlh)) {
Serial.println("Chyba při čtení z DHT senzoru!"); // při chybném čtení vypiš hlášku
} else { // pokud jsou hodnoty v pořádku, vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" stupnu Celsia, ");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
}
}
void hystereze_vlhkost() {
if ((vlh < vlh_vyp) && (vetrak_toci))
{
digitalWrite(rele_vetrak, LOW);
vetrak_toci = false;
}
else if ((vlh > vlh_zap) && (!vetrak_toci))
{
digitalWrite(rele_vetrak, HIGH);
vetrak_toci = true;
}
if (vetrak_toci == true)
{
lcd.setCursor(17,3);
lcd.print(" ON");
}
else {
lcd.setCursor(17,3);
lcd.print("OFF");
}
}
void vypis_lcd(){
lcd.setCursor(0,0);
lcd.print("Teplota:");
lcd.setCursor(16,0);
lcd.print(tep);
lcd.print((char)223); // symbol "°" (stupne)
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Vlhkost:");
lcd.setCursor(17,1);
lcd.print(vlh);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Ventilator:");
}
void stav_vlhkosti(){
if(vlh_stara == 0){
lcd.setCursor(14,1);
lcd.print(" ");
}
else if(vlh_stara > vlh){
lcd.setCursor(9,1);
lcd.print("klesa ");
}
else if(vlh_stara < vlh){
lcd.setCursor(9,1);
lcd.print("stoupa");
}
else if(vlh_stara == vlh){
lcd.setCursor(9,1);
lcd.print("stala ");
}
vlh_stara = vlh;
}
void vlhkost_max(){
if(vlh > vlh_max){
vlh_max = vlh;
lcd.setCursor(2,2);
lcd.print("Max:");
lcd.setCursor(7,2);
lcd.print(vlh_max);
lcd.print("%");
}
}
void vlhkost_min(){
if(vlh < vlh_min){
vlh_min = vlh;
lcd.setCursor(12,2);
lcd.print("Min:");
lcd.setCursor(17,2);
lcd.print(vlh_min);
lcd.print("%");
}
}
void test_ventilatoru(){
digitalWrite(rele_vetrak, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Test ventilatoru ");
for (int i=1; i<19; i++){
lcd.setCursor(i,2);
lcd.print("|");
delay(250);
}
digitalWrite(rele_vetrak, LOW);
delay(1000);
lcd.clear();
delay(1000);
}
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27,20,4);
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT 5
// odkomentování správného typu čidla
#define typDHT11 DHT11 // DHT 11
//#define typDHT22 DHT22 // DHT 22 (AM2302)
// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);
int tep;
int vlh;
const int rele_vetrak = 13;
boolean vetrak_toci = false;
int vlh_vyp = 35;
int vlh_zap = 40;
int vlh_stara = 0;
int vlh_max = 0;
int vlh_min = 100;
void setup() {
Serial.begin(9600);
// zapnutí komunikace s teploměrem DHT
mojeDHT.begin();
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("---------------------");
lcd.setCursor(0,1);
lcd.print("| Teplomer a |");
lcd.setCursor(0,2);
lcd.print("| vlhkomer |");
lcd.setCursor(0,3);
lcd.print("---------------------");
delay(5000);
test_ventilatoru();
}
void loop() {
mereni();
//serialovy_vypis();
vypis_lcd();
hystereze_vlhkost();
stav_vlhkosti();
vlhkost_max();
vlhkost_min();
delay(5000); // pauza pro dalsi mereni
}
// funce mereni
void mereni(){
tep = mojeDHT.readTemperature();
vlh = mojeDHT.readHumidity();
}
// funkce vypis serial
void serialovy_vypis(){
if (isnan(tep) || isnan(vlh)) {
Serial.println("Chyba při čtení z DHT senzoru!"); // při chybném čtení vypiš hlášku
} else { // pokud jsou hodnoty v pořádku, vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" stupnu Celsia, ");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
}
}
void hystereze_vlhkost() {
if ((vlh < vlh_vyp) && (vetrak_toci))
{
digitalWrite(rele_vetrak, LOW);
vetrak_toci = false;
}
else if ((vlh > vlh_zap) && (!vetrak_toci))
{
digitalWrite(rele_vetrak, HIGH);
vetrak_toci = true;
}
if (vetrak_toci == true)
{
lcd.setCursor(17,3);
lcd.print(" ON");
}
else {
lcd.setCursor(17,3);
lcd.print("OFF");
}
}
void vypis_lcd(){
lcd.setCursor(0,0);
lcd.print("Teplota:");
lcd.setCursor(16,0);
lcd.print(tep);
lcd.print((char)223); // symbol "°" (stupne)
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Vlhkost:");
lcd.setCursor(17,1);
lcd.print(vlh);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Ventilator:");
}
void stav_vlhkosti(){
if(vlh_stara == 0){
lcd.setCursor(14,1);
lcd.print(" ");
}
else if(vlh_stara > vlh){
lcd.setCursor(9,1);
lcd.print("klesa ");
}
else if(vlh_stara < vlh){
lcd.setCursor(9,1);
lcd.print("stoupa");
}
else if(vlh_stara == vlh){
lcd.setCursor(9,1);
lcd.print("stala ");
}
vlh_stara = vlh;
}
void vlhkost_max(){
if(vlh > vlh_max){
vlh_max = vlh;
lcd.setCursor(2,2);
lcd.print("Max:");
lcd.setCursor(7,2);
lcd.print(vlh_max);
lcd.print("%");
}
}
void vlhkost_min(){
if(vlh < vlh_min){
vlh_min = vlh;
lcd.setCursor(12,2);
lcd.print("Min:");
lcd.setCursor(17,2);
lcd.print(vlh_min);
lcd.print("%");
}
}
void test_ventilatoru(){
digitalWrite(rele_vetrak, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Test ventilatoru ");
for (int i=1; i<19; i++){
lcd.setCursor(i,2);
lcd.print("|");
delay(250);
}
digitalWrite(rele_vetrak, LOW);
delay(1000);
lcd.clear();
delay(1000);
}
--------------------------------------------------------------
V části LOOP používám jen funkce, přijde mi tak celý kód přehlednější.
![]() | |||||
| Jednoduché schéma zapojení. (Chybí tu rezistor 10kΩ zapojený mezi datovým vodičem na 5 a napájením 5V na DHT11). |
Postupem času jsem zařízení několikrát aktualizoval nyní (9/20)už j v provozu verze 4 s dvema dht senzory, webovým serverem, ovládáním otáček ventilátoru pomocí PWM a chlazením, protože teplo z Arduina a ethernetshieldu ovlivňovalo měření teploty i vlhkosti. Bude li čas, zaktualizuji i tady.
Knihovny:
DHT-sensor-library.zip
LiquidCrystal_I2C-1.1.2.zip
Knihovny:
DHT-sensor-library.zip
LiquidCrystal_I2C-1.1.2.zip


Žádné komentáře:
Okomentovat
Poznámka: Komentáře mohou přidávat pouze členové tohoto blogu.