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 Intelligent pour Sous-Sol : Contrôle d'Humidité par Arduino

Composants et Fournitures

Composant Description Quantité
Arduino Nano R3 Microcontrôleur compact 1
Expandeur E/S (IO Expander) Module d'extension entrées/sorties 1
Bundle Expandeur E/S Kit complet avec accessoires 1

Applications et Services en Ligne

Application Description
Arduino IDE Environnement de développement

À Propos de ce Projet

Liste des Fonctionnalités

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Pièces Nécessaires pour Construire le Système de Ventilation

Schéma de Câblage

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Affichage OLED

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Pourquoi Utiliser l'IO Expander ?

Construire le Système

Connectez l'Arduino Nano à l'IO Expander et programmez-le avec le code ci-dessous. Le connecteur 6 broches est le port série de débogage logiciel et n'est pas nécessaire dans l'installation finale.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Important : Vous devez modifier l'adresse ONEWIRE_TO_I2C_ROM définie pour qu'elle corresponde à l'adresse de votre convertisseur 1-Wire vers I2C.

Code Complet (C/C++)

/* IO Expander
* 
* Basement/Crawlspace Ventilation System v1.1
* 
*/
#include <math.h>
#include <SoftwareSerial.h>
#include <avr/wdt.h>
#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 "s8t1"
#define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 // Ventilateur ON si delta humidité absolue intérieur >= extérieur
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Ventilateur OFF si delta humidité absolue intérieur <= extérieur
#define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilateur ON si humidité relative extérieure <= %
#define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilateur OFF si humidité relative extérieure >= %
#define MINIMUM_TEMPERATURE 15 // Cycle vent ON/OFF si température extérieure <= 15°C/59°F
#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 délai entre lectures DHT22

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

struct HS {
  float temp;
  float relative;
  float absolute;
  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 humidity)
{
  float t = (17.625 * temp) / (243.04 + temp);
  float l = log(humidity/100);
  float b = l + t;
  // Approximation August-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)
{
  // Source: https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/
  // Précision ~0,1°C entre -30 et 35°C
  // Formule 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;
}

void loop() {
  HS inside, outside;
  static bool fan = false;
  static bool cycle = false;
  static long last_time = -(60L * 1000L);

  Serial.println();
  if (SerialReadUntilDone()) {
    // Lire les capteurs d'humidité une seule fois par minute pour éviter l'auto-échauffement
    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 && 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();
}

Note : Si vous utilisez le port USB pour programmer l'Arduino Nano, vous devez le déconnecter de l'IO Expander car il utilise le même port série unique. Si vous voulez déboguer, utilisez le port ICSP pour programmer l'ATmega328P. Pour activer le port de débogage logiciel, décommentez la définition SERIAL_DEBUG.

Connectez le fil 110VAC aux deux ventilateurs.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Percez un trou de 11 mm (7/16") et un de 14 mm (9/16") de chaque côté du boîtier pour les presses-étoupes PG7 et PG9. Utilisez un outil Dremel pour agrandir légèrement jusqu'à ce que le presse-étoupe s'ajuste parfaitement. Le PG7 alimente l'entrée 12VDC, le PG9 pour les capteurs et ventilateurs.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Trouvez une ventilation ouverte et non bloquée. Ce sera notre exhausteur pour souffler l'air du sous-sol/vide sanitaire vers l'extérieur. Assurez-vous que toutes les autres ventilations du côté opposé sont ouvertes – elles deviendront vos entrées d'air. Fermez les ventilations adjacentes pour créer un flux d'air régional plutôt que local sur l'ensemble de votre sous-sol/vide sanitaire.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Montez les ventilateurs à l'intérieur de la ventilation avec des colliers de serrage (tie wraps). Assurez-vous qu'ils sont orientés pour souffler l'air vers l'extérieur.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Trouvez un point d'accès existant et faites passer le fil du capteur d'humidité extérieur vers l'intérieur. Assurez-vous que le capteur est assez loin de la maison et de toute obstruction pour mesurer précisément la température/humidité ambiante. Vérifiez vos relevés par rapport aux bulletins météo locaux.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

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

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

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

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Connectez les fils RJ11 de 15 m aux capteurs d'humidité et faites passer les fils avec le fil des ventilateurs vers un point d'accès disponible où le boîtier de contrôle sera installé.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Connectez tous les fils et assemblez/insérez toutes les pièces dans le boîtier de contrôle. Si vos fils RJ11 de 15 m ont des connecteurs précâblés, vous devrez les couper pour passer les fils dans le presse-étoupe et recâbler de nouveaux connecteurs.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Testez le système et assurez-vous que tout fonctionne correctement. Pour tester le relais et les ventilateurs, déconnectez l'Arduino de l'IO Expander et connectez-le directement à votre ordinateur pour le contrôler manuellement. Une fois tout vérifié, assemblez toutes les pièces dans le boîtier en utilisant du ruban double face et de la mousse d'emballage pour fixer vos cartes, et profitez des avantages et économies de votre Système de Ventilation Intelligent de Contrôle d'Humidité !

Mise à jour du 20/03/2019

Après avoir fait fonctionner le système de ventilation dans mon vide sanitaire pendant les derniers mois avec zéro plantage et un pic d'humidité relative supérieur à 95 % suite à une fuite de mon chauffe-eau, il a réussi à faire descendre l'humidité relative sous les 50 %. Le système de ventilation est un système de contrôle continu qui fonctionne !

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Passé d'un écran OLED SSD1306 0,96" à un SH1106 1,3". Beaucoup plus grand et lisible. Le changement a été un jeu d'enfant grâce à la mise à jour firmware de l'IO Expander. Il suffit de changer 'ST10' en 'ST13' dans votre code.

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Mise à jour du 12/09/2019

Sortie de la v1.1 qui a corrigé un problème de démarrage à froid où l'écran OLED restait vide. Toujours en train de ventiler mon vide sanitaire !

Schémas

Système de Ventilation Intelligent pour Sous-Sol : Contrôle d Humidité par Arduino

Processus de fabrication

  1. Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
  2. Robot de détection humaine basé sur Arduino Uno : Intégration capteurs étape par étape
  3. Construire un Spybot Arduino piloté par Bluetooth
  4. FlickMote : Télécommande IR à gestes pour maison connectée
  5. TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
  6. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  7. SERENA : Système d'Alarme Arduino Mega 2560 Personnalisé avec Écran Tactile TFT LCD
  8. Système d'arrosage automatique pour plantes piloté par Arduino
  9. Comprendre les Systèmes de Ventilation : Garder l'Air Intérieur Sain et Frais