Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Sistema de ventilación del sótano / espacio de acceso

Componentes y suministros

Arduino Nano R3
× 1
Expansor IO
× 1
Paquete expansor IO
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Lista de funciones

  • Sensor de temperatura / humedad interior / exterior.
  • Control inteligente del ventilador de ventilación con comparación de humedad
  • Reducir la humedad en su sótano / espacio de acceso
  • Ayude a reducir el crecimiento de moho
  • La ventilación inteligente ahorra energía

Piezas necesarias para construir el sistema de ventilación

  • Expansor de IO
  • 1 cable a I2C.
  • Arduino Nano.
  • Relé de 5 V CC de 1 canal.
  • Sensor de humedad x2 SHT10.
  • Pantalla I2C SSD1306 OLED 128x64.
  • x2 110V 172x150x38mm 0.34A 2400 RPM Ventiladores con rodamiento de bolas.
  • Caja de plástico transparente impermeable de 158x90x65 mm.
  • Prensaestopas de nailon impermeable ip68 pg7.
  • Prensaestopas de nailon impermeable ip68 pg9.
  • x2 Conector de terminal de tornillo Keystone RJ11.
  • Caja Keystone x2.
  • x2 Cable 4C4P RJ11 de 50 pies.
  • Cable RJ11 4C4P de 6 ".
  • Cable de 110V de 100 pies.
  • Enchufe de CA
  • Cable de cabecera de 2,54 mm.
  • Fuente de alimentación con adaptador de pared de 12VDC 1A.

Diagrama de cableado

Pantalla OLED

Entonces, ¿por qué utilizar el expansor IO?

  • Más simple de diseñar
  • Piezas disponibles en el mercado
  • No hay controlador de 1 cable para escribir
  • Sin controlador de retransmisión para escribir
  • Sin controlador de pantalla OLED para escribir
  • No hay fuentes de visualización para ocupar el espacio del código Arduino
  • Sin controlador de sensor de humedad para escribir
  • Ahorra espacio de código en Arduino; solo 6106 bytes (19%)
  • Menos de un día para escribir el código
  • Fácil de conectar con un cable telefónico RJ11 estándar
  • Sin problemas de longitud del cable del sensor
  • Más barato de construir que los sistemas comerciales
  • Fácil de realizar cambios para adaptarse a los requisitos individuales
  • Fuente de alimentación única

Construya el sistema

Conecte el Arduino Nano al IO Expander y prográmelo con el siguiente código. El encabezado de 6 pines es el puerto de depuración en serie del software y no es necesario en la instalación final.

Asegúrese de cambiar la dirección definida de ONEWIRE_TO_I2C_ROM para que coincida con su dirección 1-Wire con I2C.

  / * Expansor IO 
*
* Sistema de ventilación del sótano / espacio de acceso 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 "s8t #define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 // Ventilador encendido si la humedad absoluta delta del interior> =exterior
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Ventilador apagado si delta de humedad absoluta del interior <=exterior
# define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilador encendido si la humedad relativa exterior es <=%
# define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilador apagado si la humedad relativa exterior es> =%
# define MINIMUM_TEMPERATURE 15 // Enciende / apaga la ventilación si la temperatura exterior <=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 // Retraso de 5 segundos entre lecturas DHT22

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

struct HS {
temperatura de flotación;
relativa de flotación;
absoluta de flotación;
bool error;
};

int led =13;
bool init_oled =true;
tiempo de encendido largo, tiempo de apagado;

# 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 (temperatura de flotación, humedad de flotación)
{
float t =(17.625 * temp) / (243.04 + temp);
float l =log (humedad / 100);
float b =l + t;
// Usa el Augus Aproximación 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 (temperatura flotante, relativa flotante)
{
// tomado de https://carnotcycle.wordpress.com/2012/08/04/how-to-convert- humedad-relativa-media-a-absoluta /
// la precisión es de aproximadamente 0,1 ° C en el rango de -30 a 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)
// referencia 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)) * relativo * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT);
}

void ReadHumiditySensor (HS * hs)
{
SerialCmd ("sr");
if (SerialReadFloat (&hs-> temp) &&
SerialReadFloat (&hs-> relativo)) {
// hs-> dewpoint =DewPoint (hs-> temp, hs-> relativo);
hs-> absoluto =Humedad absoluta (hs-> temp, hs-> relativo);
hs-> error =falso;
}
else hs -> error =true;
SerialReadUntilDone ();
}

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

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

Serial.println ();
if (SerialReadUntilDone ()) {
// Lea los sensores de humedad solo una vez por minuto o se autocalentarán si se leen demasiado rápido
if (millis () - last_time> 60L * 1000L)
{
if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE) )
ReadHumiditySensor (&inside);

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

i f (error interior || 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)
ciclo =ventilador =verdadero;
if (ciclo &&temperatura exterior <=TEMPERATURA_MÍNIMA)
ventilador =(milis () - tiempo de inactividad> 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, \" DENTRO \ "; sd127,0, \" FUERA \ "; 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 ();
}

Nota: Si usa el puerto USB para programar el Arduino Nano, debe desconectarlo del IO Expander, ya que también está usando el mismo puerto serie único, en cambio, si desea depurar, use el puerto ICSP para programar el ATmega328P. Para habilitar el puerto de depuración del software, elimine el comentario de la definición SERIAL_DEBUG.

Conecte el cable de 110 VCA a ambos ventiladores.

Taladre un orificio de 7/16 "y 9/16" a cada lado del gabinete para el PG7 y el PG9. Utilice una herramienta dremel para agrandar ligeramente los orificios hasta que el casquillo encaje perfectamente. El PG7 alimentará el voltaje de entrada de 12VDC y el PG9 para los sensores y ventiladores.

Busque un respiradero que esté abierto y no bloqueado. Este será nuestro escape que expulsaremos el aire del sótano / espacio de acceso. Asegúrese de que todas las demás rejillas de ventilación del otro lado estén abiertas, ya que se convertirán en su entrada de aire. Cierre las rejillas de ventilación adyacentes para crear un flujo de aire regional en lugar de local en todo su sótano / espacio de acceso.

Monte los ventiladores en el interior de la rejilla de ventilación con bridas. Asegúrese de que los ventiladores apunten en la dirección correcta para expulsar el aire.

Busque un punto de acceso existente y enrosque el cable del sensor de humedad exterior en el interior. Asegúrese de que el sensor de humedad esté lo suficientemente lejos de la casa y de cualquier obstrucción para que pueda medir con precisión la temperatura / humedad ambiental. Verifique sus lecturas con los informes meteorológicos publicados localmente.

Conecte el sensor de humedad exterior al conector keystone y al gabinete y móntelo en el interior.

Conecte el sensor de humedad interior al conector keystone y la caja y móntelo en el interior. Es preferible una ubicación central o un área que necesite un control adicional de la humedad.

Conecte los cables RJ11 de 50 pies a los sensores de humedad y pase los cables con el cable del ventilador a un punto de acceso disponible donde se instalará el gabinete de control.

Conecte todos los cables y ensamble / alimente todas las piezas al gabinete de control. Si sus cables RJ11 de 50 pies vienen con conectores prensados, tendrá que cortarlos para pasar los cables a través del prensaestopas y engarzar los nuevos conectores.

Pruebe el sistema y asegúrese de que todo funcione correctamente. Para probar el relé y los ventiladores, desconecte el Arduino del expansor IO y conéctelo directamente a su computadora para controlarlo manualmente. Una vez que haya verificado que todo está funcionando, ensamble todas las piezas en el gabinete con cinta adhesiva de doble cara y espuma de embalaje para asegurar sus tableros, y disfrute de los beneficios y ahorros de su Sistema de Ventilación con Control Inteligente de Humedad

Actualización 20/03/2019

Después de ejecutar el sistema de ventilación en mi espacio de acceso durante los últimos meses con cero cuelgues y con una humedad relativa máxima de más del 95% después de la fuga de mi calentador de agua, ha bajado con éxito la humedad relativa a menos del 50%. ¡El sistema de ventilación es un sistema de control continuo que funciona!

Se cambió de una pantalla OLED SSD1306 de 0.96 "a una pantalla OLED SH1106 de 1.3". Es mucho más grande y más fácil de leer. Cambiarlo fue muy sencillo con la actualización del firmware IO Expander. Simplemente cambie 'ST10' a 'ST13' en su código.

Actualización 12/09/2019

Se lanzó v1.1 que solucionó un problema de arranque en frío en el que la pantalla OLED se apagaba. ¡Todavía estoy trabajando para ventilar mi espacio de acceso!

Código

  • Sistema de ventilación del sótano / espacio de acceso
Sistema de ventilación del sótano / espacio de acceso C / C ++
Utilice el Arduino Nano para crear un sistema de ventilación inteligente
 / * IO Expander * * Sistema de ventilación de sótano / espacio de acceso 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 "OUT" #define "rUMIDITY define FAN_OFF "r1f" #define ABSOLUTE_DELTA_FAN_ON 1 // Ventilador encendido si delta de humedad absoluta del interior> =exterior #define ABSOLUTE_DELTA_FAN_OFF 0.5 // Ventilador apagado si delta de humedad absoluta del interior <=exterior # define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilador encendido si exterior relativo la humedad es <=% # define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilador apagado si la humedad relativa exterior es> =% # define MINIMUM_TEMPERATURE 15 // Enciende y apaga la ventilación si la temperatura exterior <=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 seg de colocar entre DHT22 lee # ifdef SERIAL_DEBUGSoftwareSerial swSerial (8,7); # endifstruct HS {float temp; pariente flotante; flotar absoluto; bool error;}; int led =13; bool init_oled =true; long on time, 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 (error) Serial.print (F ("NA")); else Serial.print (decimal, 1);} float DewPoint (temperatura de flotación, humedad de flotación) {float t =(17.625 * temp) / (243.04 + temp); flotador l =log (humedad / 100); flotar b =l + t; // Use la aproximación de August-Roche-Magnus return (243.04 * b) / (17.625-b);} # define MOLAR_MASS_OF_WATER 18.01534 # define UNIVERSAL_GAS_CONSTANT 8.21447215float AbsoluteHumidity (float temp, float relativo) {// tomado de https:// carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ // la precisión es de aproximadamente 0,1 ° C en el rango de -30 a 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) // referencia 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)) * relativo * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_GAS);} ReadHumiditySensor (HS * hs) {SerialCmd ("sr"); if (SerialReadFloat (&hs-> temp) &&SerialReadFloat (&hs-> relativo)) {// hs-> punto de rocío =DewPoint (hs-> temp, hs-> relativo); hs-> absoluta =Humedad absoluta (hs-> temp, hs-> relativa); hs-> error =falso; } else hs-> error =true; SerialReadUntilDone ();} void setup () {Serial.begin (115200); # ifdef SERIAL_DEBUG swSerial.begin (115200); // swSerialEcho =&swSerial; #endif pinMode (led, SALIDA); wdt_enable (WDTO_8S); offtime =millis () - FAN_OFF_TIME;} void loop () {HS adentro, afuera; ventilador bool estático =falso; ciclo bool estático =falso; estático largo last_time =- (60L * 1000L); Serial.println (); if (SerialReadUntilDone ()) {// if (init_oled) {// if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) {// SerialCmdDone (INIT_OLED); // init_oled =falso; //} //} // Lea los sensores de humedad solo una vez por minuto o se autocalentarán si se leen demasiado rápido if (millis () - last_time> 60L * 1000L) {if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE)) ReadHumiditySensor (&inside); if (SerialCmdDone (HUMIDITY_SENSOR_OUTSIDE)) ReadHumiditySensor (y afuera); if (inside.error || outside.error) fan =false; else {if (ventilador) {if (exterior.relativo> =OUTSIDE_RELATIVE_FAN_OFF || inside.absolute - outside.absolute <=ABSOLUTE_DELTA_FAN_OFF) ciclo =ventilador =falso; else {if (ciclo &&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) ciclo =ventilador =verdadero; if (ciclo &&outside.temp <=MINIMUM_TEMPERATURE) fan =(millis () - offtime> FAN_OFF_TIME)? verdadero Falso; if (ventilador) ontime =millis (); }} if (ventilador) SerialCmdDone (FAN_ON); más SerialCmdDone (FAN_OFF); if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) {if (init_oled) {SerialCmdDone (INIT_OLED); init_oled =falso; } SerialCmdDone ("st13; sc; sf0; sa1; sd70,0, \" DENTRO \ "; sd127,0, \" FUERA \ "; sf1; sa0; sd0,12,248, \" "#ifdef FAHRENHEIT" F "# más "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, \ "", exterior.relativo, exterior.error); SerialPrint ("\"; sd127,48, \ "", exterior.absoluta, exterior.error); Serial.print (" \ ";"); Serial.print ("sf0; sa0; sd0,0, \" "); if (ventilador) Serial.print (" FAN "); else Serial.print (" v1.1 "); Serial.println (" \ ";Dakota del Sur"); SerialReadUntilDone (); } más init_oled =true; last_time =millis (); } retraso (1000); } else {digitalWrite (led, HIGH); retraso (500); digitalWrite (led, BAJO); retraso (500); init_oled =verdadero; } wdt_reset ();} 

Esquemas

Utilice el Arduino Nano para crear un sistema de ventilación inteligente.

Proceso de manufactura

  1. Sistema de asistencia que usa Arduino y RFID con Python
  2. Sistema de robótica de detección humana con Arduino Uno
  3. Arduino Spybot
  4. FlickMote
  5. Televisión casera B-Gone
  6. Reloj maestro
  7. Sistema de alarma Arduino:SERENA
  8. Sistema de riego automático de plantas con Arduino
  9. Sistema de monitoreo y detección de incendios forestales (con alertas por SMS)
  10. Sistema de asistencia basado en Arduino y hoja de cálculo de Google
  11. ¿Qué es un sistema de ventilación?