zurück

Luftentfeuchtung durch Taupunktlüftung

Im modernen Bootsbau werden vorgefertigte Stringer-Sets in den Bootsrumpf eingeklebt. In diesen unzugänglichen Längs- und Quertunneln kann in Folge von Temperaturschwankungen, Leckagen im Deck oder Seewasserdurchführungen ein immerfeuchtes Klima entstehen, das den Polyesterrumpf von innen durchfeuchten und dauerhaft schädigen kann. Um der Gefahr der Osmose zu begegnen, belüfte ich die Längsstringer unter der Innenschale bzw. der Bilge und trockne damit auch evtl. schon feuchtes Laminat aus. Ausserdem dient es der Kontrolle undichter Stellen im Decksaufbau etc. Leider bewirkt spontanes lüften z.B. bei höheren Außentemperaturen und gleichen relativen Feuchtewerten, dass sich an den kühleren Innenwänden Feuchtigkeit niederschlägt und ins Laminat eindringt. Nur, wenn der Aussentaupunkt niedriger ist, wird der Innenraum entfeuchtet. Das ist nur mit geeigneter Meßtechnik und Ermittlung des Differenztaupunktes möglich. Optimales lüften ist so mit moderner Technik ohne teuere und energiefressende Aggregrate sogar mit lediglich 12 Volt und einer Leistung von weniger, als einem Watt möglich.

Realisierung

Da es preiswerte Sensoren, wie den DHT22 gibt, die neben der Temperatur auch die rel. Luftfeuchte ermitteln, braucht man nur noch einen Controller und geeignete Software, um daraus den Taupunkt zu berechnen. Ist er in der Bilge höher, wird die Lüftung eingeschaltet. Ein Arduino-Board berechnet dann aus den Werten den Taupunkt und schaltet die beiden Rohrlüfter über ein Relais ein oder aus. EinLüfter saugt die Frischluft aus den Backskisten an und der andere bläst sie in den Ankerkasten. Wer sich die Realisierung selbst zutraut, sollte unbedingt darauf achten dass der Arduino nicht mit der ungesiebten Batteriespannung beaufschlagt werden sollte, wenn andere induktive Verbraucher, wie Elektromotoren etc. vorhanden sind. Sie könnten mit ihren Induktionsspitzen ohne weiteres die Elektronik zerstören und sogar einen Brand auslösen. Mein Programm wird mit der kostenlosen open-Source-Software, dem Compiler in ein maschinenlesbares Programm in den Mikrocontroller geschrieben. Sie kann auf www.arduino.cc heruntergeladen werden. Mit dem Relais zusammen fände es in einer Seifendose Platz.

Programmierung des Arduino

/*   Variante 1:  ohne LCD-Anzeige
 *  -----------------------------------
 * Der Mikrocontroller ermittelt über die Digitaleingänge der Sensoren die Temperatur 
 * und die rel. Luftfeuchtigkeit und berechnet daraus die Taupunkttemperatur bzw. 
 * absolute Luftfeuchte. Wenn draussen eine um 2,5°C höherer Taupunkttemperatur 
 * besteht, wird gelüftet.
 * Da der preiswerte DHT22 nicht sonderlich stabil sein soll, werden seine 
 * Geberausgänge kontrolliert. Gibt ein Sensor beim lesen kein gültiges Signal 
 * aus, wird der Lüfter abgeschaltet und die LED 2 Sekunden ein- und eine Sekunde 
 * ausgeschaltet. Nach ca. 2 Min. wird die nächsten Messung durchgeführt. Ist sie wieder nicht 
 * erfolgreich, wird der Fehlertimer erhöht und die LED blinkt solange, bis der
 * Sensor wieder gültige Werte liefert. Nachdem der Fehler 40x (ca. 2 Min) auf-
 * getreten ist, wird der Sensor für 30 sek abgeschaltet, damit er sich resettet. 
 * Nach dem einschalten wartet die Logik noch 30sek bis zur ersten Messwertabfrage.
 * Die LED signalisiert das mit 60 sek. Dauerlicht.  
 * Ist der Arduino UNO mit dem PC über USB verbunden, kann man alle Werte über den 
 * seriellen Monitor des Arduino-Programmiertools auslesen.
 * 
 * Um die Funktion des Gerätes zu gewährleisten, sollte man vor dem Einbau der 
 * Sensoren die Abweichungen der Messwerte beider Sesoren prüfen. 
 */

#include "DHT.h"
#include "math.h"  
#define I_SENS_PIN 4       // D4 Innen-Sensor-Ausgang
#define I_SENS_PLUS_PIN 3  // D3 Pluspol Innensensor
#define A_SENS_PIN 7       // D7 Aussen-Sensor-Ausgang
#define A_SENS_PLUS_PIN 6  // D6 Pluspol Aussensensor  
#define INNENSENSOR  DHT22
#define AUSSENSENSOR DHT22   
#define RELAIS_PIN 8 

DHT innen(I_SENS_PIN, INNENSENSOR); 
DHT aussen(A_SENS_PIN, AUSSENSENSOR); 

const long WAIT_60s = 60000;   // 60 Sekunden warten 
const long WAIT_30s = 30000;   // 30 Sekunden warten 
const long WAIT_2s = 2000;     // 2 Sekunden warten
const long WAIT_1s = 1000;     // 1 Sekunde  warten
int LUEFTER; 
int errors = 50;
int runde = 0;
const float TaupunktSchwelle = 2.5;  // 2,5 
float Innentemperatur, Aussentemperatur;
float Innenluftfeuchte, Aussenluftfeuchte;
float Innentaupunkt, Aussentaupunkt, FI; 

void setup() {
   
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RELAIS_PIN, OUTPUT);
  pinMode(I_SENS_PLUS_PIN, OUTPUT);
  pinMode(A_SENS_PLUS_PIN, OUTPUT); 
  Serial.begin(9600); //Serielle Verbindung starten
  innen.begin(); 
  aussen.begin(); 
  
}

void loop() {
       
 
  if (errors == 50) { 
    Serial.print(" initialisiere beide Sensoren DHT22: LED an ..");
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(I_SENS_PLUS_PIN, HIGH);  // I_Sensor einschalten     
    digitalWrite(A_SENS_PLUS_PIN, HIGH);  // A_Sensor einschalten
    delay(WAIT_30s);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println(". LED aus");
    errors = 0;
  } else { 
    runde += 1;
    Serial.print("  Runde ");   // Anzeige im seriellen Monitor
    Serial.print(runde);
    if ((Aussentaupunkt + TaupunktSchwelle) <= Innentaupunkt) {
      digitalWrite(RELAIS_PIN, HIGH);    //  Lüfter an 
      Serial.println("   Lüfter an ");   
    } else {
      digitalWrite(RELAIS_PIN, LOW);     // Lüfter AUS
      Serial.println("   Lüfter aus ");
    }
  }
  Innenluftfeuchte = innen.readHumidity();      
  Innentemperatur = innen.readTemperature();
  while (isnan(Innenluftfeuchte) || isnan(Innentemperatur)) {
    Serial.print(" Innensensor Lesefehler  ");     
    Serial.println(errors); 
    digitalWrite(RELAIS_PIN, LOW);      // Luefter AUS
    digitalWrite(LED_BUILTIN, HIGH);
    delay(WAIT_2s);           
    errors += 1;
    if (errors == 40) {
      Serial.print(" Neustart Innensensor ");     
      digitalWrite(I_SENS_PLUS_PIN, LOW);        
      delay(WAIT_30s);  
      digitalWrite(I_SENS_PLUS_PIN, HIGH);
      delay(WAIT_30s);
      errors = 1;
    }            
    digitalWrite(LED_BUILTIN, LOW);
    delay(WAIT_1s);
    Innenluftfeuchte = innen.readHumidity();      
    Innentemperatur = innen.readTemperature();
  } 
  errors = 0;
  FI = (log10(Innenluftfeuchte) - 2) / 0.4343 + (17.68 * Innentemperatur) / (243.12 + Innentemperatur);
  Innentaupunkt = 243.12 * FI / (17.68 - FI);
  Serial.print("Innen: ");       
  //           --------
  Serial.print(Innenluftfeuchte); 
  Serial.print(" % rF und ");  
  Serial.print(Innentemperatur);
  Serial.print(" °C  ->  Taupunkttemperatur ");
  Serial.print(Innentaupunkt);
  Serial.println(" °C ");
  
  Aussenluftfeuchte = aussen.readHumidity();    
  Aussentemperatur = aussen.readTemperature();
  while (isnan(Aussenluftfeuchte) || isnan(Aussentemperatur)) {
    Serial.print(" Aussensensor Lesefehler ");      
    Serial.println(errors); 
    digitalWrite(RELAIS_PIN, LOW);      // Lüfter AUS
    digitalWrite(LED_BUILTIN, HIGH);
    delay(WAIT_2s);                    
    errors += 1;    
    if (errors == 40) {
      Serial.print(" Neustart Aussensensor "); 
      digitalWrite(A_SENS_PLUS_PIN, LOW);        
      delay(WAIT_30s);  
      digitalWrite(A_SENS_PLUS_PIN, HIGH);
      delay(WAIT_30s);
      errors = 1;
    }                     
    digitalWrite(LED_BUILTIN, LOW);
    delay(WAIT_1s);
    Aussenluftfeuchte = aussen.readHumidity();    
    Aussentemperatur  = aussen.readTemperature();
  }   
  errors = 0;
  FI = (log10(Aussenluftfeuchte) - 2) / 0.4343 + (17.68 * Aussentemperatur) / (243.12 + Aussentemperatur);
  Aussentaupunkt = 243.12 * FI / (17.68 - FI); 
  Serial.print("Außen: ");   
  //        ------------    
  Serial.print(Aussenluftfeuchte); 
  Serial.print(" % rF und ");
  Serial.print(Aussentemperatur);
  Serial.print(" °C  ->  Taupunkttemperatur ");
  Serial.print(AuVariante 2:ssentaupunkt);
  Serial.println(" °C ");
  
  delay(WAIT_60s);  
 
}


/* 
 * Variante 2:  Entfeuchtung mit LCD 16x2 und Zehntel-Anzeige der Lüftungszeit
 * ---------------------------------------------------------------------------
 * Der Mikrocontroller vom Typ Arduino ermittelt über die Digitaleingänge der 
 * Sensoren die Temperatur und die rel. Luftfeuchtigkeit und berechnet daraus 
 * die Taupunkttemperatur bzw. absolute Luftfeuchte. Wenn draußen eine um 2°C 
 * höherer Taupunkttemperatur besteht, wird gelüftet.
 * Da der preiswerte DHT22 nicht sonderlich stabil sein soll, werden seine 
 * Geberausgänge kontrolliert. Gibt ein Sensor beim lesen kein gültiges Signal 
 * aus, wird der Lüfter abgeschaltet und die LED leuchtet für 2 Sekunden auf.  
 * Nach ungefähr 2 Minuten wird der Sensor erneut abgefragt. Ist sie 
 * wieder nicht erfolgreich, wird der Fehlertimer erhöht und die LED blinkt 
 * wieder kurz. Nach dem 10. Fehlversuch wird der Sensor für 20 sekunden 
 * abgeschaltet, damit er sich resettet. Nach dem einschalten wartet die Logik 
 * nochmal 20 sekunden bis zur ersten Messwertabfrage. Während der Zeit der 
 * Inaktivität leuchtet die LED. Die 2-zeilige LCD-Anzeige zeigt oben die 
 * Außentemperatur, Luftfeuchte, den Taupunkt und die das Verhältnis der Laufzeit 
 * zur Ruhezeit des Lüfters im Bereich von 0 bis 9 an. Jeweils nach ca. 5 Tagen wird 
 * die Anzeige der Lüfterlaufzeit auf Null gestellt.   
 * In der 2. Zeile wird die Temperatur, Luftfeuchte und Taupunkt der Bilge angezeigt 
 * und dahinter steht ein '+'Zeichen für den laufenden Lüfter bzw. ein '-', wenn er steht.
 * 
 * prozentuale Anzeige der Laufzeit des Lüfter in den letzten 24 Stunden 
 * 
 * Um die Funktion des Gerätes zu gewährleisten, sollte man vor dem Einbau der 
 * Sensoren die Abweichungen der Messwerte beider Sensoren prüfen. 
 */

#include "DHT.h"
#include "math.h"  
#include "Wire.h" // Verbindung
#include "LCD.h"  // Darstellungsbefehle
#include "LiquidCrystal_I2C.h" // Vermittlung zwischen Displaytreiber und Display

#define I_SENS_PIN 4       // D4 Innen-Sensor-Ausgang
#define I_SENS_PLUS_PIN 3  // D3 Pluspol Innensensor
#define A_SENS_PIN 7       // D7 Aussen-Sensor-Ausgang
#define A_SENS_PLUS_PIN 6  // D6 Pluspol Aussensensor  
#define INNENSENSOR  DHT22
#define AUSSENSENSOR DHT22   
#define RELAIS_PIN 8 

LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); // 0x27=I2C-Adresse
// beim Arduino ist A4 auch SDA und A5=SCL  (SDA und SCL sind I2C-Pins) 
// die Hintergrundbeleuchtung dimme ich mit einem 1kOhm-Widerstand an Stelle der Brücke

DHT innen(I_SENS_PIN, INNENSENSOR); 
DHT aussen(A_SENS_PIN, AUSSENSENSOR); 

const long WAIT_60s = 60000;   // 60 Sekunden warten 
const long WAIT_20s = 20000;   // 30 Sekunden warten 
const long WAIT_3s =  3000;    // 2 Sekunden warten
const long WAIT_1s =  1000;    // 1 Sekunde  warten
const long WEEK   =  10080;      // Loop=1min *60 = 1h *24 = 1d *7
float LEIN = 0;   // Zähler für Lüfter aus/Loop
float LAUS = 0;   // Zähler für Lüfter ein/Loop
float ZEHNTEL = 0; 
int LUEFTER;  //
int errors = 0;
int runde = 0;
int iaus;
const float TaupunktSchwelle = 2.0;  // 2,5 
float Innentemperatur, Aussentemperatur;
float Innenluftfeuchte, Aussenluftfeuchte;
float Innentaupunkt, Aussentaupunkt, FI; 

void setup() 
{   
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RELAIS_PIN, OUTPUT);
  pinMode(I_SENS_PLUS_PIN, OUTPUT);
  pinMode(A_SENS_PLUS_PIN, OUTPUT); 
  //Serial.begin(9600); //Serielle Verbindung starten
  innen.begin(); 
  aussen.begin(); 
  lcd.begin(16, 2);  // number of columns and rows 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Taupunktmessung ");
  lcd.setCursor(0,1);
  lcd.print("Initialisierung ");
  digitalWrite(I_SENS_PLUS_PIN, HIGH);  // I_Sensor einschalten     
  digitalWrite(A_SENS_PLUS_PIN, HIGH);  // A_Sensor einschalten
  delay(800);
  //lcd.setBacklight(LOW);
  lcd.clear();
  lcd.setBacklight(HIGH);
}

void loop() 
{
  runde += 1;   
  //
  // Die Außentemperatur wird auf dem Display oben angezeigt
  // --------------------------------------------------------  
  Aussenluftfeuchte = aussen.readHumidity();    
  Aussentemperatur = aussen.readTemperature();
  while (isnan(Aussenluftfeuchte) || isnan(Aussentemperatur)) 
  {
    lcd.setCursor(0,0); 
    lcd.print("A_Sensor_error ");
    lcd.print(errors);
    digitalWrite(RELAIS_PIN, LOW);      // Lüfter AUS
    digitalWrite(LED_BUILTIN, HIGH);
    delay(WAIT_3s);                    
    errors += 1;    
    if (errors == 10) 
    {
      lcd.setCursor(0,0); 
      lcd.print("Neustart A_Sens ");
      digitalWrite(A_SENS_PLUS_PIN, LOW);        
      delay(WAIT_20s);  
      digitalWrite(A_SENS_PLUS_PIN, HIGH);
      delay(WAIT_20s);
      errors = 1;
    }                     
    digitalWrite(LED_BUILTIN, LOW);
    delay(WAIT_1s);
    Aussenluftfeuchte = aussen.readHumidity();    
    Aussentemperatur  = aussen.readTemperature();
  }   
  lcd.setCursor(0,0);
  errors = 0;
  FI = (log10(Aussenluftfeuchte) - 2) / 0.4343 + (17.68 * Aussentemperatur) / (243.12 + Aussentemperatur);
  Aussentaupunkt = 243.12 * FI / (17.68 - FI);
  iaus = Aussenluftfeuchte;
   lcd.print(iaus);
   lcd.print("%rF ");
  iaus = Aussentemperatur;
   lcd.print(iaus);
   lcd.print("\337C "); // Grad in Oktalschreibweise (Dezimal:223) 
  iaus = Aussentaupunkt;
   lcd.print(iaus);
   lcd.print("T  ");
  //
  // Die Innentemperatur wird auf dem Display unten angezeigt
  // ------------------------------------------------------------------
  Innenluftfeuchte = innen.readHumidity();   // in der Bilge bzw.  
  Innentemperatur = innen.readTemperature(); // zwischen Innen- und Aussenschale
  while (isnan(Innenluftfeuchte) || isnan(Innentemperatur)) 
  {
    lcd.setCursor(0,1); 
    lcd.print("I_Sensor_error ");
    lcd.print(errors);
    digitalWrite(RELAIS_PIN, LOW);      // Luefter AUS
    digitalWrite(LED_BUILTIN, HIGH);    // Messung error
    delay(WAIT_3s);           
    errors += 1;
    if (errors == 10) 
    {
      lcd.setCursor(0,1);
      lcd.print("Neustart I_Sens ");
      digitalWrite(I_SENS_PLUS_PIN, LOW);        
      delay(WAIT_20s);  
      digitalWrite(I_SENS_PLUS_PIN, HIGH);
      delay(WAIT_20s);
      errors = 1;
    }            
    digitalWrite(LED_BUILTIN, LOW); // Messung ok
    delay(WAIT_1s);
    Innenluftfeuchte = innen.readHumidity();      
    Innentemperatur = innen.readTemperature();
  } 
  lcd.setCursor(0,1); 
  errors = 0;
  FI = (log10(Innenluftfeuchte) - 2) / 0.4343 + (17.68 * Innentemperatur) / (243.12 + Innentemperatur);
  Innentaupunkt = 243.12 * FI / (17.68 - FI);
  iaus = Innenluftfeuchte;
    lcd.print(iaus); 
    lcd.print("%rF ");
  iaus = Innentemperatur;
    lcd.print(iaus);
    lcd.print("\337C ");  // lcd.print(0xDF)    0x20 ... 0x7f    
  iaus = Innentaupunkt; 
    lcd.print(iaus);
    lcd.print("T ");
   
  // Lüfter an oder aus wird in der 2. Zeile angezeigt  
  //---------------------------------------------------------- 
  if ((Aussentaupunkt + TaupunktSchwelle) <= Innentaupunkt) {
    digitalWrite(RELAIS_PIN, HIGH);    //  Lüfter an
    lcd.setCursor(15,1);  
    lcd.print("+"); 
    LEIN += 1;
  } else {
    digitalWrite(RELAIS_PIN, LOW);     // Lüfter AUS
    lcd.setCursor(15,1); 
    lcd.print("-"); 
    LAUS += 1;
  }  
  
  // Zehntelanzeige Lüfterbetrieb
  // ------------------------------------
  if ((LEIN + LAUS) >= WEEK ) {
   LEIN = 0;
   LAUS = 0;
   ZEHNTEL = 0;
  } else { 
    ZEHNTEL= LEIN / (LEIN + LAUS) * 10;  
  }
  lcd.setCursor(15,0);  
  lcd.print(ZEHNTEL); 
  
  delay(WAIT_60s);  
}




Last Mod: 14.6.2020