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