Lüftersteuerung für einen Humidor mit dem Arduino

Neben dem Programmieren genieße ich auch gerne mal eine gute Zigarre. Damit eine Zigarre ihr volles Aroma entfallten kann benötigt sie eine spezielle Lagerung. Zigarren werden in einem Klimaschrank, dem Humidor, gelagert in dem eine konstante Temperatur und eine konstante Luftfeuchtigkeit gehalten werden. Die Temperatur sollte um die 18°C liegen und die Luftfeuchtigkeit zwischen 65 und 70 %.

Meinen Humidor habe ich aus einem gebrauchten Weinkühlschrank gebaut. Damit habe ich die Temperatur schon sehr gut im Griff. Bleibt also noch die Luftfeuchtigkeit. Diese wird mit Bovedapacks reguliert. Diese bieten eine 2-Wege Feuchtigkeitskontrolle. Ist die Luftfeuchtigkeit zu hoch nehmen sie Feuchtigkeit auf und ist diese zu niedrig geben sie Feuchtigkeit ab. Ich verwende für meinen Humidor Bovedapacks, welche die Luftfeuchtigkeit auf ca. 69% halten.

Bei diesen klimatischen Bedingungen ist natürlich die Gefahr von Schimmel recht hoch, um diesem Vorzubeugen habe ich mir für meinen Humidor eine Lüftersteuerung gebaut. Der Lüfter sorgt für eine regelmässige Luftumwälzung und verhindert damit die Bildung von Feuchtigkeitsnestern.

Mir war bei diesem Projekt wichtig, dass die Luftfeuchtigkeit oben und unten im Humidor gleich ist. Deshalb habe ich mich für 2 Feuchtigkeitssensoren entschieden. Sollte die Luftfeuchtigkeit eines Sensors um 5% von dem anderen abweichen wird der Lüfter eingeschaltet.
Da ich die Zigarren ja nicht nur anschauen möchte, öffne ich gelegentlich den Humidor um eine Zigarre zu entnehmen. Dabei fällt die Luftfeuchtigkeit im inneren des Humidors ab, da ein Luftaustausch mit der Aussenluft stattfindet. Deshalb soll der Lüfter ebenfalls anspringen sobald die Luftfeuchtigkeit unter 63% fällt.
Wenn nun alles OK ist soll der Lüfter dennoch einmal pro Stunde laufen um die Luft im inneren Umzuwälzen.

Verkabelung der Lüftersteuerung
Verkabelung der Lüftersteuerung - erstellt mit Fritzing

Benötigte Teile

  • Arduino (bei mir ein Nano V3)
  • 2x DHT22
  • 16x2 LCD
  • Drehpotenztiometer
  • Lüfter (z.B. ein PC-Lüfter
  • NPN-Transistor oder ein Relais
  • Widerstand 1 - 10 kOhm
  • Netzteil für Arduino 5V DC
  • Netzteil für Lüfter 12V DC

Der Sketch

                        
#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN1 7
#define DHTPIN2 8 
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define DHTTYPE DHT22
int zeit;
int fan;
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);                    

Im ersten Schritt laden wir die benötigten Bibliotheken, für die Sensoren und das Display.
Dann bestimmen wir die Pins an denen die Sensoren und das Display angeschlossen sind und den Typ der Sensoren.
Nun legen wir noch 2 Variablen vom Typ int an und erstellen 2 Objekte für die beiden Sensoren.

                        
void setup() {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
  pinMode(13, OUTPUT);
}
                    

In der Methode void setup() starten wir unser Display mit 16 Zeichen und 2 Zeilen, sowie unsere beiden Sensoren. Ausserdem legen wir den Pin 13 als Outputpin an, dieser soll den Lüfter schalten. Die Methode void setup() wird genau 1 mal durchlaufen, wenn wir den Arduino starten.

                        
void loop() {
  zeit = (millis()/60000) % 60; 
  delay(2000);
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
  delay(2000);
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  int vergl = h1-h2;
  if (vergl >= 5 || vergl <= -5){
    fan = 1;
  }
  if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
  }
  
   if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  } 
}
                    

Die Methode void loop() beinhaltet unser eigentliches Programm und wird immer wieder durchlaufen.

                        
zeit = (millis()/60000) % 60;                    
Hier füllen wir die Variable zeit mit einem Wert. Die Funktion millis() gibt die Millisekunden aus seit dem das Programm gestartet wurde. Die Millisekunden rechnen wir um in Minuten um den Lüfter später einmal pro Stunden laufen zu lassen.
                        
delay(2000);
int h1 = dht1.readHumidity();
int t1 = dht1.readTemperature();
if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
}                    
Wir lassen den Programmablauf für 2 Sekunden anhalten, da der DHT22 ein recht langsamer Sensor ist. Wir geben ihm also kurz Zeit und fragen dann die Luftfeuchtigkeit und die Temperatur von dem ersten Sensor ab. Die empfangenen Werte speichern wir in den Variablen h1 bzw. t1.
Danach prüfen wir ob den Variablen Werte zugewiesen wurden, wenn nicht dann zeigen wir auf dem Display eine Fehlermeldung an.
                        
lcd.setCursor(0, 0);
lcd.print("H1: ");
lcd.print(h1);
lcd.print("% ");
lcd.setCursor(9, 0);
lcd.print("T1: ");
lcd.print(t1);
lcd.print("C ");
                    
lcd.setCursor(0, 0) setzt den Cursor auf das erste Zeichen und die erste Zeile. Es Wird also erst das Zeichen dann die Zeile angegeben. Beachte, dass die Null in der Programmierung auch einen Wert hat. Deshalb entspricht die Null hier dem ersten Zeichen bzw. der ersten Zeile.
Jetzt geben wir die gemessenen Werte auf dem Display aus.
                        
delay(2000);
int h2  = dht2.readHumidity();
int t2 = dht2.readTemperature();
if (isnan(h2) || isnan(t2)) {
  lcd.setCursor(0, 1);
  lcd.print("Fehler Sensor 2!");
}
lcd.setCursor(0, 1);
lcd.print("H2: ");
lcd.print(h2);
lcd.print("% ");
lcd.setCursor(9, 1);
lcd.print("T2: ");
lcd.print(t2);
lcd.print("C ");
                    
Die vorherigen Schritte nocheinmal für den zweiten Sensor.
                        
int vergl = h1-h2;
if (vergl >= 5 || vergl <= -5){
  fan = 1;
}
                    
Wir vergleichen die Werte der beiden Sensoren und kontrollieren ob eine Abweichung von 5% gegeben ist. Wenn dies der Fall ist weisen wir der Variable fan den Wert 1 zu.
                        
if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
}
                    
Jetzt müssen wir uns darum kümmern, dass der Lüfter auch wieder ausgeschaltet wird wenn die Werte nicht mehr voneinander abweichen. Wenn die Werte noch abweichen, dann bekommt die Variable fan den Wert 1 sonst den Wert 0.
                        
if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){
    digitalWrite(13, HIGH);
}else{
    digitalWrite(13, LOW);
} 
                    
Der letzte Abschnitt unseres Programms schaltet nun den Lüfter ein bzw. aus.
Wir prüfen ob die Variable fan den Wert 1 hat oder ob einer der Sensoren einen Wert kleiner als 63% ausgibt oder ob die Zeit größer als 55 Minuten ist. Wenn das der Fall ist wird der Lüfter eingeschaltet.

Der gesamte Sketch

                    
#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN1 7
#define DHTPIN2 8 
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define DHTTYPE DHT22
int zeit;
int fan;
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);

void setup() {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
  pinMode(13, OUTPUT);
}

void loop() {
  zeit = (millis()/60000) % 60; 
  delay(2000);
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
  delay(2000);
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  int vergl = h1-h2;
  if (vergl >= 5 || vergl <= -5){
    fan = 1;
  }
  if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
  }
  
   if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  } 
}