Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Keller-/Kriechraum-Lüftungssystem

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
IO-Expander
× 1
IO-Expander-Bundle
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Funktionsliste

  • Innen-/Außentemperatur-/Feuchtigkeitssensor.
  • Smart Vent Lüftersteuerung mit Feuchtigkeitsvergleich
  • Reduzieren Sie die Feuchtigkeit in Ihrem Keller/Kriechraum
  • Helfen Sie, das Schimmelwachstum zu reduzieren
  • Intelligentes Lüften spart Strom

Benötigte Teile zum Bau des Lüftungssystems

  • IO-Expander
  • 1-Draht zu I2C.
  • Arduino Nano.
  • 1 Kanal DC 5V Relais.
  • x2 SHT10 Feuchtigkeitssensor.
  • I2C SSD1306 OLED 128x64-Display.
  • x2 110V 172x150x38mm 0,34A 2400 U/min Kugellagerlüfter.
  • 158x90x65mm klares wasserdichtes Kunststoffgehäuse.
  • ip68 pg7 Wasserdichte Nylon-Kabelverschraubung.
  • ip68 pg9 Wasserdichte Nylon-Kabelverschraubung.
  • x2 RJ11 Keystone Schraubklemmenbuchse.
  • x2 Keystone-Gehäuse.
  • x2 50ft 4C4P RJ11-Draht.
  • 6" 4C4P RJ11-Draht.
  • 100 Fuß 110-V-Kabel.
  • Netzstecker.
  • 2,54 mm Header-Draht.
  • 12 VDC 1A Netzteil für den Wandadapter.

Schaltplan

OLED-Display

Warum also den IO-Expander verwenden?

  • Einfacher zu gestalten
  • Standardteile
  • Kein 1-Wire-Treiber zum Schreiben
  • Kein Relay-Treiber zum Schreiben
  • Kein OLED-Displaytreiber zum Schreiben
  • Keine Anzeigeschriftarten, um Arduino-Codeplatz zu belegen
  • Kein Feuchtigkeitssensortreiber zum Schreiben
  • Speichert Codeplatz auf Arduino; nur 6106 Byte (19%)
  • Weniger als ein Tag zum Schreiben des Codes
  • Einfache Verkabelung mit Standard-RJ11-Telefonkabel
  • Keine Probleme mit der Sensorkabellänge
  • Billiger zu bauen als kommerzielle Systeme
  • Einfache Änderungen zur Anpassung an individuelle Anforderungen
  • Einzelnes Netzteil

Bauen Sie das System auf

Verbinden Sie den Arduino Nano mit dem IO Expander und programmieren Sie ihn mit dem folgenden Code. Der 6-Pin-Header ist der serielle Debug-Port der Software und wird bei der endgültigen Installation nicht benötigt.

Stellen Sie sicher, dass Sie die von ONEWIRE_TO_I2C_ROM definierte Adresse so ändern, dass sie Ihrer 1-Wire-zu-I2C-Adresse entspricht.

/* IO Expander
*
* Keller-/Kriechraum-Belüftungssystem v1.1
*
*/

#include
#include
#include
#include "IOExpander.h"

#define FAHRENHEIT
#define ONEWIRE_TO_I2C_ROM "i4s71"
#define INIT_OLED "st13;si;sc;sd"
#define HUMIDITY_SENSOR_INSIDE "s6t1"
#define HUMIDITY_SENSOR_OUTSIDE "s8 .1"
#define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 // Lüfter an wenn absolutes Feuchtigkeits-Delta von innen>=außen
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Lüfter aus wenn absolutes Feuchtigkeits-Delta von innen <=außen
#define OUTSIDE_RELATIVE_FAN_ON 88 // Lüfter an, wenn die relative Luftfeuchtigkeit außen <=% ist
#define OUTSIDE_RELATIVE_FAN_OFF 90 // Lüfter aus, wenn die relative Luftfeuchtigkeit außen>=%
#define MINIMUM_TEMPERATURE 15 // Lüftung ein-/ausschalten bei Außentemperatur <=15C/59F
#define FAN_ON_TIME (20*60*1000L) // 20 min
#define FAN_OFF_TIME (20*60*1000L) // 20 min

//#define SERIAL_DEBUG
#define SERIAL_TIMEOUT 5000 // 5 Sek. Verzögerung zwischen DHT22-Lesevorgängen

#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif

struct HS {
float temp;
float relativ;
float absolut;
bool error;
};

int led =13;
bool init_oled =true;
lange ontime, offtime;

#ifdef FAHRENHEIT
#define C2F(temp) CelsiusToFahrenheit(temp)
float CelsiusToFahrenheit(float celsius)
{
return ((celsius*9)/5)+ 32;
}
#else
#define C2F(temp) (temp)
#endif

void SerialPrint(const char* str, float decimal , Zeichenfehler)
{
Serial.print(str);
if (error) Serial.print(F("NA"));
else Serial.print(dezimal , 1);
}

float Taupunkt(Float Temp, Float Feuchte)
{
float t =(17.625 * temp) / (243.04 + temp);
float l =log(humidity/100);
float b =l + t;
// Benutze den Augus t-Roche-Magnus-Approximation
return (243.04*b)/(17.625-b);
}

#define MOLAR_MASS_OF_WATER 18.01534
#define UNIVERSAL_GAS_CONSTANT 8.21447215

float AbsoluteHumidity(float temp, float relative)
{
//entnommen von https://carnotcycle.wordpress.com/2012/08/04/how-to-convert- relative-Luftfeuchtigkeit-zu-absolute-Luftfeuchtigkeit/
//Genauigkeit liegt bei etwa 0,1°C im Bereich -30 bis 35°C
//August-Roche-Magnus 6.1094 exp(17.625 x T)/ (T + 243.04)
//Buck (1981) 6.1121 exp(17.502 x T)/(T + 240.97)
//Referenz https://www.eas.ualberta.ca/jdwilson/EAS372_13 /Vomel_CIRES_satvpformulae.html // Buck verwenden (1981)
return (6.1121 * pow(2.718281828, (17.67 * temp) / (temp + 243.5)) * relativ * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT);
}

void ReadHumiditySensor(HS* hs)
{
SerialCmd("sr");
if (SerialReadFloat(&hs->temp) &&
SerialReadFloat(&hs->relative)) {
//hs->taupunkt =DewPoint(hs->temp, hs->relative);
hs->absolute =AbsoluteHumidity(hs->temp, hs->relative);
hs->error =false;
}
else hs ->error =true;
SerialReadUntilDone();
}

void setup() {
Serial.begin(115200);
#ifdef SERIAL_DEBUG
swSerial.begin(115200);
//swSerialEcho =&swSerial;
#endif
pinMode(led, OUTPUT);
wdt_enable(WDTO_8S);
offtime =millis() - FAN_OFF_TIME;
}

void loop() {
HS innen, außen;
static bool fan =false;
static bool cycle =false;
static long last_time =-(60L * 1000L);

Serial.println();
if (SerialReadUntilDone()) {
// Lesen Sie die Feuchtigkeitssensoren nur einmal pro Minute aus oder sie heizen sich selbst auf, wenn sie zu schnell gelesen werden
if (millis() - last_time> 60L * 1000L)
{
if (SerialCmdDone(HUMIDITY_SENSOR_INSIDE) )
ReadHumiditySensor(&inside);

if (SerialCmdDone(HUMIDITY_SENSOR_OUTSIDE))
ReadHumiditySensor(&outside);

i f (inside.error || outside.error) fan =false;
else {
if (fan) {
if (outside.relative>=OUTSIDE_RELATIVE_FAN_OFF || inside.absolute - outside.absolute <=ABSOLUTE_DELTA_FAN_OFF)
cycle =fan =false;
else {
if (cycle &&outside.temp <=MINIMUM_TEMPERATURE &&
millis() - ontime> FAN_ON_TIME) fan =false;
}
if (!fan) offtime =millis();
}
else {
if (outside.relative <=OUTSIDE_RELATIVE_FAN_ON &&inside.absolute - outside.absolute>=ABSOLUTE_DELTA_FAN_ON)
cycle =fan =true;
if (cycle &&outside.temp <=MINIMUM_TEMPERATURE)
fan =(millis() - offtime> FAN_OFF_TIME) ? true :false;
if (fan) ontime =millis();
}
}

if (fan) SerialCmdDone(FAN_ON);
else SerialCmdDone(FAN_OFF);

if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM)) {
if (init_oled) {
SerialCmdDone(INIT_OLED);
init_oled =false;
}
SerialCmdDone("st13;sc;sf0;sa1;sd70,0,\"INSIDE\";sd127,0,\"OUTSIDE\";sf1;sa0;sd0,12,248,\""
#ifdef FAHRENHEIT
"F"
#else
"C"
#endif
"\";sd0,30,\"%\";sf0;sd0,50,\"g/m\";sd20,46,\"3\";");
SerialPrint("sf1;sa1;sd70,12,\"", C2F(inside.temp ), inside.error);
SerialPrint("\";sd70,30,\"", inside.relative, inside.error);
SerialPrint("\";sd70,48,\" ", inside.absolute, inside.error);
SerialPrint("\";sd127,12,\"", C2F(outside.temp), outside.error);
SerialPrint("\";sd127,30,\"", outside.relative, outside.error);
SerialPrint("\";sd127,48,\"", outside.absolute, outside.error);
Serial .print("\";");
Serial.print("sf0;sa0;sd0,0,\"");
if (fan) Serial.print("FAN");
else Serial.print("v1.1");
Serial.println("\";sd");
SerialReadUntilDone();
}
else init_oled =true;

last_time =millis();
}

delay(1000);
}
else {
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
init_oled =true;
}
wdt_reset();
}

Hinweis: Wenn Sie den USB-Port zum Programmieren des Arduino Nano verwenden, müssen Sie ihn vom IO-Expander trennen, da er auch denselben einzelnen seriellen Port verwendet. Wenn Sie stattdessen debuggen möchten, verwenden Sie den ICSP-Port zum Programmieren des ATmega328P. Um den Software-Debugging-Port zu aktivieren, entkommentieren Sie die SERIAL_DEBUG-Definition.

Schließen Sie das 110-VAC-Kabel an beide Lüfter an.

Bohren Sie ein 7/16" und 9/16" Loch auf beiden Seiten des Gehäuses für PG7 und PG9. Verwenden Sie ein Dremel-Werkzeug, um die Löcher leicht zu vergrößern, bis die Drüse fest sitzt. Der PG7 speist die 12VDC Eingangsspannung ein und der PG9 für die Sensoren und Lüfter.

Suchen Sie nach einer Öffnung, die geöffnet und nicht blockiert ist. Dies wird unser Auspuff sein, mit dem wir die Keller- / Kriechraumluft ausblasen werden. Stellen Sie sicher, dass alle anderen Belüftungsöffnungen auf der anderen Seite geöffnet sind, da diese zu Ihrem Lufteinlass werden. Schließen Sie die angrenzenden Lüftungsschlitze, damit Sie einen regionalen statt eines lokalen Luftstroms über Ihren gesamten Keller/Kriechraum erzeugen.

Montieren Sie die Lüfter mit Kabelbindern an der Innenseite des Luftauslasses. Stellen Sie sicher, dass die Lüfter in die richtige Richtung zeigen, um die Luft auszublasen.

Suchen Sie einen vorhandenen Zugangspunkt und fädeln Sie das äußere Feuchtigkeitssensorkabel in das Innere ein. Stellen Sie sicher, dass der Feuchtigkeitssensor weit genug vom Haus und von Hindernissen entfernt ist, damit Sie die Umgebungstemperatur/-feuchtigkeit genau messen können. Vergleichen Sie Ihre Messwerte mit Ihren lokal veröffentlichten Wetterberichten.

Verdrahten Sie den Außenfeuchtigkeitssensor mit der Keystone-Buchse und dem Gehäuse und montieren Sie ihn an der Innenseite.

Verdrahten Sie den inneren Feuchtigkeitssensor mit der Keystone-Buchse und dem Gehäuse und montieren Sie ihn an der Innenseite. Ein zentraler Ort oder Bereich, der zusätzliche Feuchtigkeitskontrolle benötigt, ist vorzuziehen.

Schließen Sie die 50-Fuß-RJ11-Kabel an die Feuchtigkeitssensoren an und führen Sie die Kabel mit dem Lüfterkabel zu einem verfügbaren Zugangspunkt, an dem das Steuerungsgehäuse installiert wird.

Schließen Sie alle Drähte an und montieren/führen Sie alle Teile in das Steuergehäuse ein. Wenn Ihre 50-Fuß-RJ11-Drähte mit vorgecrimpten Steckern geliefert werden, müssen Sie diese abschneiden, um die Drähte durch die Kabelverschraubung zu führen und neue Stecker zu crimpen.

Testen Sie das System und stellen Sie sicher, dass alles richtig funktioniert. Um das Relais und die Lüfter zu testen, trennen Sie das Arduino vom IO-Expander und schließen Sie es direkt an Ihren Computer an, um es manuell zu steuern. Sobald Sie sich vergewissert haben, dass alles funktioniert, montieren Sie alle Teile mit doppelseitigem Klebeband und Verpackungsschaum in das Gehäuse, um Ihre Boards zu sichern, und genießen Sie die Vorteile und Einsparungen Ihres Smart Moisture Control Ventilation Systems

Update 20.03.2019

Nachdem ich das Lüftungssystem in meinem Kriechkeller in den letzten Monaten ohne Hängenbleiben und mit einer maximalen relativen Luftfeuchtigkeit von mehr als 95 % nach dem Leck aus meinem Warmwasserbereiter betrieben habe, hat es die relative Luftfeuchtigkeit erfolgreich auf weniger als 50 % gesenkt. Das Lüftungssystem ist ein laufendes Kontrollsystem, das funktioniert!

Wechsel von einem SSD1306 0,96" OLED Display auf ein SH1106 1,3" OLED Display. Es ist viel größer und einfacher zu lesen. Der Wechsel war mit dem IO Expander Firmware-Update ein Kinderspiel. Ändern Sie einfach 'ST10' in 'ST13' in Ihrem Code.

Update 12.09.2019

Veröffentlichung von v1.1, das ein Kaltstartproblem behebt, bei dem das OLED-Display leer mit Strom versorgt wird. Arbeite immer noch daran, meinen Crawlspace zu entlüften!

Code

  • Keller-/Kriechraum-Belüftungssystem
Keller-/Kriechraum-BelüftungssystemC/C++
Verwenden Sie den Arduino Nano, um ein intelligentes Belüftungssystem zu erstellen
/* IO-Expander * * Keller-/Kriechraum-Belüftungssystem v1.1 * */#include #include #include #include "IOExpander.h"#define FAHRENHEIT#define ONEWIRE_TO_I2C_ROM "i4s71"#define INIT_OLED "st13;si;sc;sd"#define HUMIDITY_SENSOR_INSIDE "s6t1"#define HUMIDITY_SENSOR F_OUTSIDE"#r1 define FAN_OFF "r1f"#define ABSOLUTE_DELTA_FAN_ON 1 // Lüfter an wenn absolutes Feuchtigkeits-Delta von innen>=außen #define ABSOLUTE_DELTA_FAN_OFF 0.5 // Lüfter aus wenn absolutes Feuchtigkeits-Delta von innen <=außen#define OUTSIDE_RELATIVE_FAN_ON 88 // Lüfter an wenn außen relativ Luftfeuchtigkeit <=%#define OUTSIDE_RELATIVE_FAN_OFF 90 // Lüfter aus, wenn die relative Außenluftfeuchtigkeit>=%#define MINIMUM_TEMPERATURE 15 // Lüftungszyklus ein/aus wenn Außentemperatur <=15C/59F#define FAN_ON_TIME (20*60*1000L) // 20 min#define FAN_OFF_TIME (20*60*1000L) // 20 min//#define SERIAL_DEBUG#define SERIAL_TIMEOUT 5000 // 5 sec de lag zwischen DHT22 liest#ifdef SERIAL_DEBUGSoftwareSerial swSerial(8,7);#endifstruct HS { float temp; Float relativ; Float absolut; bool error;};int led =13;bool init_oled =true;long ontime, offtime;#ifdef FAHRENHEIT#define C2F(temp) CelsiusToFahrenheit(temp)float CelsiusToFahrenheit(float celsius){ return ((celsius*9)/5) +32;} #else #define C2F (temp) (temp) # endifvoid SerialPrint (const char * str, float decimal, char error) {Serial.print (str); if (Fehler) Serial.print (F ("NA")); sonst Serial.print (dezimal, 1);} Float DewPoint (Float Temp, Float Luftfeuchtigkeit) { Float t =(17,625 * Temp) / (243,04 + Temp); Schwimmer l =log(Feuchtigkeit/100); Schwimmer b =l + t; // Verwenden Sie die August-Roche-Magnus-Approximationsrückgabe (243.04*b)/(17.625-b);}#define MOLAR_MASS_OF_WATER 18.01534#define UNIVERSAL_GAS_CONSTANT 8.21447215float AbsoluteHumidity(float temp, float relative){ //aus https:// carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ //Präzision liegt bei etwa 0,1°C im Bereich -30 bis 35°C //August-Roche- Magnus 6.1094 exp(17.625 x T)/(T + 243.04) //Buck (1981) 6.1121 exp(17.502 x T)/(T + 240.97) //Referenz https://www.eas.ualberta.ca/jdwilson/ EAS372_13/Vomel_CIRES_satvpformulae.html // Use Buck (1981) return (6.1121 * pow(2.718281828, (17.67 * temp) / (temp + 243.5)) * relativ * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT);} ReadHumiditySensor (HS * hs) { SerialCmd ("sr"); if (SerialReadFloat(&hs->temp) &&SerialReadFloat(&hs->relative)) {//hs->dewpoint =DewPoint(hs->temp, hs->relative); hs->absolut =AbsoluteHumidity(hs->temp, hs->relativ); hs->Fehler =falsch; } else hs->error =true; SerialReadUntilDone();}void setup() { Serial.begin(115200);#ifdef SERIAL_DEBUG swSerial.begin(115200); //swSerialEcho =&swSerial;#endif pinMode(led, OUTPUT); wdt_enable(WDTO_8S); offtime =millis() - FAN_OFF_TIME;}void loop() { HS innen, außen; static bool fan =false; statischer Bool-Zyklus =false; statisch lange last_time =-(60L * 1000L); Serial.println(); if (SerialReadUntilDone ()) { // if (init_oled) { // if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) { // SerialCmdDone (INIT_OLED); // init_oled =false; // } //} // Lesen Sie die Feuchtigkeitssensoren nur einmal pro Minute oder sie heizen sich selbst auf, wenn sie zu schnell gelesen werden if (millis() - last_time> 60L * 1000L) { if (SerialCmdDone(HUMIDITY_SENSOR_INSIDE)) ReadHumiditySensor(&inside); if (SerialCmdDone(HUMIDITY_SENSOR_OUTSIDE)) ReadHumiditySensor(&outside); if (inside.error || outside.error) fan =false; else { if (fan) { if (outside.relative>=OUTSIDE_RELATIVE_FAN_OFF || inside.absolute - outside.absolute <=ABSOLUTE_DELTA_FAN_OFF) cycle =fan =false; else { if (cycle &&outside.temp <=MINIMUM_TEMPERATURE &&millis() - ontime> FAN_ON_TIME) fan =false; } if (!fan) offtime =millis(); } else { if (outside.relative <=OUTSIDE_RELATIVE_FAN_ON &&inside.absolute - outside.absolute>=ABSOLUTE_DELTA_FAN_ON) cycle =fan =true; if (cycle &&außen.temp <=MINIMUM_TEMPERATURE) fan =(millis() - offtime> FAN_OFF_TIME) ? wahr falsch; if (Lüfter) ontime =millis(); } } if (Lüfter) SerialCmdDone (FAN_ON); sonst SerialCmdDone (FAN_OFF); if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) { if (init_oled) { SerialCmdDone (INIT_OLED); init_oled =false; } SerialCmdDone("st13;sc;sf0;sa1;sd70,0,\"INSIDE\";sd127,0,\"OUTSIDE\";sf1;sa0;sd0,12,248,\"" #ifdef FAHRENHEIT "F" # else "C" #endif "\";sd0,30,\"%\";sf0;sd0,50,\"g/m\";sd20,46,\"3\";"); SerialPrint("sf1;sa1;sd70,12,\"", C2F(inside.temp), inside.error); SerialPrint("\";sd70,30,\"", inside.relative, inside.error); SerialPrint("\";sd70,48,\"", inside.absolute, inside.error); SerialPrint("\";sd127,12,\"", C2F(outside.temp), outside.error); SerialPrint ("\";sd127,30,\"", outside.relative, outside.error); SerialPrint("\";sd127,48,\"", outside.absolute, outside.error); Serial.print(" \";"); Serial.print("sf0;sa0;sd0,0,\""); if (Fan) Serial.print("FAN"); sonst Serial.print("v1.1"); Serial.println("\";sd"); SerialReadUntilDone(); } sonst init_oled =true; letzte_zeit =millis(); } Verzögerung (1000); aufrechtzuerhalten. Sonst { DigitalWrite (led, HIGH); Verzögerung (500); digitalWrite (LED, NIEDRIG); Verzögerung (500); init_oled =wahr; } wdt_reset();}

Schaltpläne

Verwenden Sie den Arduino Nano, um ein intelligentes Belüftungssystem zu erstellen.

Herstellungsprozess

  1. Anwesenheitssystem mit Arduino und RFID mit Python
  2. Robotersystem zur Erkennung von Menschen mit Arduino Uno
  3. Arduino Spybot
  4. FlickMote
  5. Selbstgemachter Fernseher B-Gone
  6. Hauptuhr
  7. Arduino-Alarmsystem:SERENA
  8. Automatisches Pflanzenbewässerungssystem mit Arduino
  9. Waldbrandüberwachungs- und -erkennungssystem (mit SMS-Warnungen)
  10. Was ist ein Belüftungssystem?