Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Système de ventilation du sous-sol/du vide sanitaire

Composants et fournitures

Arduino Nano R3
× 1
Extenseur IO
× 1
Bundle d'extension d'IO
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Liste des fonctionnalités

  • Capteur de température/humidité intérieur/extérieur.
  • Contrôle intelligent du ventilateur avec comparaison de l'humidité
  • Réduire l'humidité dans votre sous-sol/vide
  • Aide à réduire la croissance du mildiou
  • La ventilation intelligente économise de l'énergie

Pièces nécessaires pour construire le système de ventilation

  • Extenseur d'E/S
  • 1-Wire vers I2C.
  • Arduino Nano.
  • Relais CC 5 V à 1 canal.
  •  x2 Capteur d'humidité SHT10.
  • Écran I2C SSD1306 OLED 128 x 64.
  • x2 ventilateurs à roulement à billes 110 V 172 x 150 x 38 mm 0,34 A 2400 tr/min.
  • Boîtier en plastique transparent étanche de 158 x 90 x 65 mm.
  • Presse-étoupe en nylon étanche ip68 pg7.
  • Presse-étoupe en nylon étanche ip68 pg9.
  •  x 2 prises RJ11 Keystone à vis.
  • Boîtier Keystone x2.
  • x2 50ft 4C4P RJ11 Fil.
  • Câble RJ11 4C4P 6 po.
  • Câble 110 V de 100 pi.
  • Prise CA.
  • Fil d'en-tête de 2,54 mm.
  • Alimentation pour adaptateur mural 12VDC 1A.

Schéma de câblage

Écran OLED

Alors pourquoi utiliser l'extension IO ?

  • Plus simple à concevoir
  • Pièces du commerce
  • Pas de pilote 1-Wire à écrire
  • Aucun pilote de relais à écrire
  • Aucun pilote d'affichage OLED à écrire
  • Pas de polices d'affichage pour occuper l'espace de code Arduino
  • Aucun pilote de capteur d'humidité à écrire
  • Économise de l'espace de code sur Arduino ; seulement 6106 octets (19%)
  • Moins d'une journée pour écrire le code
  • Facile à câbler à l'aide d'un câble téléphonique RJ11 standard
  • Aucun problème de longueur de câble de capteur
  • Moins cher à construire que les systèmes commerciaux
  • Facile à apporter des modifications pour s'adapter aux besoins individuels
  • Alimentation simple

Construire le système

Connectez l'Arduino Nano à l'extenseur IO et programmez-le avec le code suivant. L'en-tête à 6 broches est le port de débogage série du logiciel et n'est pas nécessaire dans l'installation finale.

Assurez-vous de modifier l'adresse définie ONEWIRE_TO_I2C_ROM pour qu'elle corresponde à votre adresse 1-Wire vers I2C.

/* IO Expander
*
* Système de ventilation de sous-sol/vide sanitaire 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"1
t8t #define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 // Ventilateur allumé si delta d'humidité absolue de l'intérieur>=extérieur
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Ventilateur éteint si delta d'humidité absolue de l'intérieur <=extérieur
#define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilateur activé si humidité relative extérieure <=%
#define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilateur désactivé si humidité relative extérieure>=%
#define MINIMUM_TEMPERATURE 15 // Cycle ventilation marche/arrêt si température extérieure <=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 délai entre les lectures DHT22

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

struct HS {
float temp;
float relatif;
float absolu;
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)
#endif

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

float DewPoint(float temp, float humidité)
{
float t =(17,625 * temp) / (243,04 + temp);
float l =log(humidité/100);
float b =l + t;
// Utiliser l'Augus Approximation t-Roche-Magnus
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)
{
// extrait de https://carnotcycle.wordpress.com/2012/08/04/how-to-convert- humidité relative à humidité absolue/
//la précision est d'environ 0,1°C dans la plage -30 à 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)
//référence https://www.eas.ualberta.ca/jdwilson/EAS372_13 /Vomel_CIRES_satvpformulae.html // Utiliser Buck (1981)
return (6.1121 * pow(2.718281828, (17.67 * temp) / (temp + 243.5)) * relative * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT);
}

void ReadHumiditySensor(HS* hs)
{
SerialCmd("sr");
if (SerialReadFloat(&hs->temp) &&
SerialReadFloat(&hs->relative)) {
//hs->dewpoint =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;
}

boucle vide() {
HS à l'intérieur, à l'extérieur ;
static bool fan =false ;
static bool cycle =false;
static long last_time =-(60L * 1000L);

Serial.println();
if (SerialReadUntilDone()) {
// Ne lisez les capteurs d'humidité qu'une fois par minute ou ils s'échaufferont automatiquement s'ils sont lus trop rapidement
if (millis() - last_time> 60L * 1000L)
{
if (SerialCmdDone(HUMIDITY_SENSOR_INSIDE) )
ReadHumiditySensor(&inside);

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

i f (intérieur.erreur || 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,\"INTÉRIEUR\";sd127,0,\"EXTÉRIEUR\";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();
}

Remarque : Si vous utilisez le port USB pour programmer l'Arduino Nano, vous devez le déconnecter de l'extenseur IO car il utilise également le même port série unique, à la place, si vous souhaitez déboguer, utilisez le port ICSP pour programmer l'ATmega328P. Pour activer le port de débogage du logiciel, décommentez la définition SERIAL_DEBUG.

Connectez le fil 110VAC aux deux ventilateurs.

Percez un trou de 7/16" et 9/16" de chaque côté du boîtier pour les PG7 et PG9. Utilisez un outil Dremel pour agrandir légèrement les trous jusqu'à ce que le presse-étoupe soit bien ajusté. Le PG7 alimentera la tension d'entrée 12VDC et le PG9 pour les capteurs et les ventilateurs.

Trouvez un évent qui est ouvert et non bloqué. Ce sera notre échappement que nous soufflerons dans l'air du sous-sol/du vide sanitaire. Assurez-vous que tous les autres évents de l'autre côté sont ouverts, car ils deviendront votre prise d'air. Fermez les bouches d'aération adjacentes afin de créer un flux d'air régional au lieu d'un flux d'air local dans tout votre sous-sol/vide sanitaire.

Montez les ventilateurs à l'intérieur de l'évent à l'aide d'attaches. Assurez-vous que les ventilateurs pointent dans la bonne direction pour souffler l'air.

Trouvez un point d'accès existant et enfilez le fil du capteur d'humidité extérieur à l'intérieur. Assurez-vous que le capteur d'humidité est suffisamment éloigné de la maison et de tout obstacle pour mesurer avec précision la température/l'humidité ambiante. Vérifiez vos lectures par rapport à vos bulletins météo publiés localement.

Câblez le capteur d'humidité extérieur dans la prise Keystone et le boîtier et montez-le à l'intérieur.

Câblez le capteur d'humidité intérieur dans la prise keystone et le boîtier et montez-le à l'intérieur. Un emplacement central ou une zone nécessitant un contrôle supplémentaire de l'humidité est préférable.

Connectez les fils RJ11 de 50 pieds aux capteurs d'humidité et acheminez les fils avec le fil du ventilateur à un point d'accès disponible où le boîtier de commande sera installé.

Connectez tous les fils et assemblez/alimentez toutes les pièces dans le boîtier de commande. Si vos fils RJ11 de 50 pieds sont livrés avec des connecteurs pré-sertis, vous devrez les couper pour faire passer les fils à travers le presse-étoupe et sertir de nouveaux connecteurs.

Testez le système et assurez-vous que tout fonctionne correctement. Pour tester le relais et les ventilateurs, déconnectez l'Arduino de l'extenseur IO et connectez-le directement à votre ordinateur pour le contrôler manuellement. Une fois que vous avez vérifié que tout fonctionne, assemblez toutes les pièces dans le boîtier à l'aide de ruban adhésif double face et de mousse d'emballage pour sécuriser vos cartes, et profitez des avantages et des économies de votre système de ventilation Smart Moisture Control

Mise à jour 20/03/2019

Après avoir fait fonctionner le système de ventilation dans mon vide sanitaire au cours des deux derniers mois sans aucun blocage et avec une humidité relative de pointe supérieure à 95% après la fuite de mon chauffe-eau, il a réussi à faire baisser l'humidité relative à moins de 50%. Le système de ventilation est un système de contrôle continu qui fonctionne !

Passé d'un écran OLED SSD1306 0,96" à un écran OLED SH1106 1,3". C'est beaucoup plus gros et plus facile à lire. Le changer a été un jeu d'enfant avec la mise à jour du micrologiciel IO Expander. Remplacez simplement « ST10 » par « ST13 » dans votre code.

Mise à jour 9/12/2019

Sortie v1.1 qui corrige un problème de démarrage à froid où l'écran OLED s'éteint. Je travaille toujours à la ventilation de mon vide sanitaire !

Code

  • Système de ventilation de sous-sol/vide sanitaire
Système de ventilation de sous-sol/vide sanitaireC/C++
Utilisez l'Arduino Nano pour créer un système de ventilation intelligent
/* IO Expander * * Basement/Crawlspace Ventilation System 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_OUTS"#define F1_SENSOR_OUTS" define FAN_OFF "r1f"#define ABSOLUTE_DELTA_FAN_ON 1 // Ventilateur allumé si delta humidité absolue intérieur>=extérieur #define ABSOLUTE_DELTA_FAN_OFF 0.5 // Ventilateur éteint si delta humidité absolue intérieur <=extérieur#define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilateur allumé si extérieur relatif l'humidité est <=%#define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilation désactivée si l'humidité relative extérieure est>=%#define MINIMUM_TEMPERATURE 15 // Cycle évent marche/arrêt si température extérieure <=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 se situer entre les lectures DHT22#ifdef SERIAL_DEBUGSoftwareSerial swSerial(8,7);#endifstruct HS { float temp; flottant relatif; flottant absolu ; 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 (erreur) Serial.print(F("NA")); else Serial.print(decimal, 1);}float DewPoint(float temp, float humidité){ float t =(17,625 * temp) / (243,04 + temp); float l =log(humidité/100); flotteur b =l + t; // Utilisez le retour d'approximation August-Roche-Magnus (243.04*b)/(17.625-b);}#define MOLAR_MASS_OF_WATER 18.01534#define UNIVERSAL_GAS_CONSTANT 8.21447215float AbsoluteHumidity(float temp, float relative){ //tiré de https:// carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ //la précision est d'environ 0,1°C dans la plage -30 à 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) //référence https://www.eas.ualberta.ca/jdwilson/ EAS372_13/Vomel_CIRES_satvpformulae.html // Utiliser Buck (1981) return (6.1121 * pow(2.718281828, (17.67 * temp) / (temp + 243.5)) * relative * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT);}void ReadHumiditySensor(HS* hs){ SerialCmd("sr"); if (SerialReadFloat(&hs->temp) &&SerialReadFloat(&hs->relative)) { //hs->dewpoint =DewPoint(hs->temp, hs->relative); hs->absolute =AbsoluteHumidity(hs->temp, hs->relative); hs->erreur =faux ; } 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;}boucle vide() { HS à l'intérieur, à l'extérieur ; ventilateur booléen statique =faux ; cycle booléen statique =faux ; statique long last_time =-(60L * 1000L); Serial.println(); if (SerialReadUntilDone()) { //if (init_oled) { // if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM)) { // SerialCmdDone(INIT_OLED); // init_oled =false; // } //} // Ne lisez les capteurs d'humidité qu'une fois par minute ou ils s'auto-chauffent s'ils sont lus trop rapidement if (millis() - last_time> 60L * 1000L) { if (SerialCmdDone(HUMIDITY_SENSOR_INSIDE)) ReadHumiditySensor(&inside); if (SerialCmdDone(HUMIDITY_SENSOR_OUTSIDE)) ReadHumiditySensor(&outside); if (intérieur.erreur ||extérieur.erreur) 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) ? vrai faux; 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 =faux ; } SerialCmdDone("st13;sc;sf0;sa1;sd70,0,\"INTÉRIEUR\";sd127,0,\"EXTÉRIEUR\";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("\";Dakota du Sud"); SerialReadUntilDone(); } else init_oled =vrai; last_time =millis(); } délai(1000); } else { digitalWrite(led, HIGH); retard (500); digitalWrite(led, LOW); retard (500); init_oled =vrai ; } wdt_reset();}

Schémas

Utilisez l'Arduino Nano pour créer un système de ventilation intelligent.

Processus de fabrication

  1. Système de présence utilisant Arduino et RFID avec Python
  2. Système robotique de détection humaine utilisant Arduino Uno
  3. Arduino Spybot
  4. FlickMote
  5. Téléviseur maison B-Gone
  6. horloge maîtresse
  7. Système d'alarme Arduino :SERENA
  8. Système d'arrosage automatique des plantes avec Arduino
  9. Qu'est-ce qu'un système de ventilation ?