středa 9. října 2019

Teploměr & vlhkoměr se spínáním ventilátoru do garáže.

   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

Požadavky na zdroj: 12V/600mA

   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);
  }



-------------------------------------------------------------- 

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

Žádné komentáře:

Okomentovat

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