Sistema de ventilação porão / crawlspace
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
|
Sobre este projeto
Lista de recursos
- Sensor interno / externo de temperatura / umidade.
- Controle inteligente de ventilador de ventilação com comparação de umidade
- Reduza a umidade em seu porão / área de rastreamento
- Ajude a reduzir o crescimento do mofo
- Ventilação inteligente economiza energia
Peças necessárias para construir o sistema de ventilação
- Expansor IO
- 1-fio para I2C.
- Arduino Nano.
- Relé de 1 canal DC 5V.
- x2 sensor de umidade SHT10.
- Tela I2C SSD1306 OLED de 128x64.
- x2 110V 172x150x38mm 0,34A Ventiladores de rolamento de esferas de 2400 RPM.
- Caixa de plástico transparente à prova d'água de 158x90x65mm.
- ip68 pg7 prensa-cabo de nylon à prova d'água.
- ip68 pg9 prensa-cabo de nylon à prova d'água.
- Tomada de terminal de parafuso Keystone x2 RJ11.
- x2 Keystone Enclosure.
- Cabo RJ11 4C4P x2 50 pés.
- Cabo RJ11 4C4P de 6 ".
- 100 pés 110 V fio.
- Plug AC.
- Fio de plataforma de 2,54 mm.
- Fonte de alimentação do adaptador de parede 12VDC 1A.
Diagrama de fiação
Tela OLED
Então, por que usar o IO Expander?
- Mais simples de projetar
- Peças disponíveis no mercado
- Nenhum driver 1-Wire para escrever
- Nenhum driver de retransmissão para escrever
- Nenhum driver de exibição OLED para escrever
- Nenhuma fonte de exibição para ocupar espaço de código do Arduino
- Nenhum driver de sensor de umidade para escrever
- Economiza espaço de código no Arduino; apenas 6106 bytes (19%)
- Menos de um dia para escrever o código
- Fácil de conectar usando o cabo telefônico RJ11 padrão
- Sem problemas de comprimento do cabo do sensor
- Mais barato de construir do que sistemas comerciais
- Fácil de fazer alterações para se adaptar aos requisitos individuais
- Fonte de alimentação única
Construa o sistema
Conecte o Arduino Nano ao IO Expander e programe-o com o seguinte código. O cabeçalho de 6 pinos é a porta de depuração serial do software e não é necessário na instalação final.
Certifique-se de alterar o endereço definido ONEWIRE_TO_I2C_ROM para corresponder ao endereço 1-Wire para I2C.
/ * Expansor IO
*
* Sistema de ventilação porão / Crawlspace 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 "
#define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 // Ventilador ligado se umidade absoluta delta de dentro> =externo
#define ABSOLUTE_DELTA_FAN_OFF 0,5 // Ventilador desligado se delta de umidade absoluta de dentro <=fora
# define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilador ligado se a umidade relativa externa for <=%
# define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilador desligado se a umidade relativa externa for> =%
# define MINIMUM_TEMPERATURE 15 // Ciclo de ventilação on / off se temperatura externa <=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 // atraso de 5 seg entre leituras DHT22
#ifdef SERIAL_DEBUG
SoftwareSerial swSerial (8,7);
#endif
struct HS {
float temp;
float relativo;
float absoluto;
erro de bool;
};
int led =13;
bool init_oled =true;
muito tempo ativado, desativado;
# 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 , erro de caractere)
{
Serial.print (str);
if (erro) Serial.print (F ("NA"));
else Serial.print (decimal , 1);
}
float Ponto Dew (temperatura flutuante, umidade flutuante)
{
float t =(17,625 * temp) / (243,04 + temp);
float l =log (umidade / 100);
float b =l + t;
// Use o Augus Aproximação t-Roche-Magnus
retorno (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)
{
// retirado de https://carnotcycle.wordpress.com/2012/08/04/how-to-convert- umidade relativa média para umidade absoluta /
// a precisão é de cerca de 0,1 ° C no intervalo de -30 a 35 ° C
// Agosto-Roche-Magnus 6.1094 exp (17.625 x T) / (T + 243.04)
// Buck (1981) 6.1121 exp (17.502 x T) / (T + 240.97)
// referência 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-> relative)) {
// hs-> ponto de orvalho =DewPoint (hs-> temp, hs-> relativo);
hs-> absoluto =Umidade Absoluta (hs-> temp, hs-> relativo);
hs-> erro =falso;
}
senão hs -> erro =verdadeiro;
SerialReadUntilDone ();
}
configuração vazia () {
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 dentro, fora;
bool fan =false;
ciclo de bool estático =falso;
estático longo last_time =- (60L * 1000L);
Serial.println ();
if (SerialReadUntilDone ()) {
// Leia os sensores de umidade apenas uma vez por minuto ou eles se autoaquecerão se forem lidos muito rapidamente
if (millis () - last_time> 60L * 1000L)
{
if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE) )
ReadHumiditySensor (&inside);
if (SerialCmdDone (HUMIDITY_SENSOR_OUTSIDE))
ReadHumiditySensor (&outside);
i f (dentro.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)
ciclo =ventilador =verdadeiro;
if (ciclo &&outside.temp <=MINIMUM_TEMPERATURE)
ventilador =(millis () - offtime> FAN_OFF_TIME)? verdadeiro:falso;
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, \" EXTERIOR \ "; 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 (dentro de 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);
atraso (500);
digitalWrite (led, LOW);
atraso (500);
init_oled =true;
}
wdt_reset ();
}
Nota: Se você usar a porta USB para programar o Arduino Nano, deverá desconectá-lo do IO Expander, pois ele também está usando a mesma porta serial única; em vez disso, se quiser depurar, use a porta ICSP para programar o ATmega328P. Para ativar a porta de depuração de software, descomente a definição SERIAL_DEBUG.
Conecte o fio 110VAC a ambos os ventiladores.
Faça um furo de 7/16 "e 9/16" em cada lado do gabinete para o PG7 e PG9. Use uma ferramenta dremel para aumentar ligeiramente os orifícios até que a sobreposta se ajuste bem. O PG7 alimentará a tensão de entrada de 12 VCC e o PG9 para os sensores e ventiladores.
Encontre uma ventilação que esteja aberta e não bloqueada. Este será o nosso escapamento, que iremos soprar para fora do ar do porão / área de rastreamento. Certifique-se de que todas as outras aberturas do outro lado estejam abertas, pois elas se tornarão a entrada de ar. Feche as aberturas de ventilação adjacentes para criar um fluxo de ar regional em vez de local em todo o porão / área de entrada.
Monte os ventiladores na parte interna da saída de ar usando abraçadeiras. Certifique-se de que os ventiladores estejam apontando na direção certa para soprar o ar.
Encontre um ponto de acesso existente e enrosque o fio do sensor de umidade externo no interior. Certifique-se de que o sensor de umidade esteja longe o suficiente da casa e de qualquer obstrução, para que você possa medir com precisão a temperatura / umidade ambiente. Compare suas leituras com seus relatórios meteorológicos publicados localmente.
Conecte o sensor de umidade externa ao conector keystone e ao invólucro e monte-o por dentro.
Conecte o sensor de umidade interno ao conector keystone e ao gabinete e monte-o por dentro. É preferível um local ou área central que precise de controle adicional de umidade.
Conecte os fios RJ11 de 50 pés aos sensores de umidade e passe os fios com o fio do ventilador até um ponto de acesso disponível onde o gabinete de controle será instalado.
Conecte todos os fios e monte / alimente todas as peças no gabinete de controle. Se os seus fios RJ11 de 50 pés vierem com conectores pré-crimpados, você terá que cortá-los para alimentar os fios através da sobreposta e crimpar novos conectores.
Teste o sistema e verifique se tudo está funcionando corretamente. Para testar o relé e os ventiladores, desconecte o Arduino do IO Expander e conecte-o diretamente ao seu computador para controlá-lo manualmente. Depois de verificar se tudo está funcionando, monte todas as peças no gabinete usando fita dupla-face e espuma de embalagem para proteger suas placas e aproveite os benefícios e a economia de seu Sistema de Ventilação de Controle de Umidade Inteligente
Atualização 20/03/2019
Depois de executar o sistema de ventilação em meu crawlspace nos últimos dois meses com zero travamentos e com um pico de umidade relativa de mais de 95% após o vazamento do meu aquecedor de água, ele reduziu com sucesso a umidade relativa para menos de 50%. O sistema de ventilação é um sistema de controle contínuo que funciona!
Mudou de um display OLED de 0,96 "SSD1306 para um display OLED SH1106 de 1,3". É muito maior e mais fácil de ler. Mudá-lo foi muito fácil com a atualização do firmware do IO Expander. Basta alterar 'ST10' para 'ST13' em seu código.
Atualização 12/09/2019
Lançada a v1.1, que corrigiu um problema de inicialização a frio em que o display OLED ficava vazio. Ainda estou trabalhando para liberar meu crawlspace!
Código
- Sistema de ventilação porão / espaço para rastreamento
Sistema de ventilação porão / crawlspace C / C ++
Use o Arduino Nano para criar um sistema de ventilação inteligente/ * 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 INIT_OLED "#define INIT_OLED" st13; si; sc; sd "#define HUMIDITY_SENSOR_INSIDE" s6t1 "#define HUMIDITY1 "_SOR1" #define INIT_OLED " definir FAN_OFF "r1f" #define ABSOLUTE_DELTA_FAN_ON 1 // Ventilador ligado se delta de umidade absoluta interno> =externo #define ABSOLUTE_DELTA_FAN_OFF 0,5 // Ventilador desligado se delta de umidade absoluta interno <=externo # define OUTSIDE_RELATIVE_FAN_ON 88 // Ventilador ligado se externo relativo a umidade é <=% # define OUTSIDE_RELATIVE_FAN_OFF 90 // Ventilador desligado se a umidade relativa externa é> =% # define MINIMUM_TEMPERATURE 15 // Ciclo de ventilação liga / desliga se temperatura externa <=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 lê # ifdef SERIAL_DEBUGSoftwareSerial swSerial (8,7); # endifstruct HS {float temp; flutuar relativo; float absoluto; erro bool;}; int led =13; bool init_oled =true; tempo ativo longo, horário desativado; #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 erro) {Serial.print (str); if (erro) Serial.print (F ("NA")); senão Serial.print (decimal, 1);} float Ponto Dew (temp flutuante, umidade flutuante) {float t =(17,625 * temp) / (243,04 + temp); flutuante l =log (umidade / 100); flutuante b =l + t; // Use a aproximação 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 relative) {// retirado de https:// carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ // a precisão é de cerca de 0,1 ° C no intervalo 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) // referência 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)) * relative * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS_CONSTANT); ReadHumiditySensor (HS * hs) {SerialCmd ("sr"); if (SerialReadFloat (&hs-> temp) &&SerialReadFloat (&hs-> relativo)) {// hs-> ponto de orvalho =Ponto de orvalho (hs-> temp, hs-> relativo); hs-> absoluto =Umidade Absoluta (hs-> temp, hs-> relativo); hs-> erro =falso; } senão hs-> erro =verdadeiro; 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 dentro, fora; ventilador bool estático =falso; ciclo bool estático =falso; estático longo last_time =- (60L * 1000L); Serial.println (); if (SerialReadUntilDone ()) {// if (init_oled) {// if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) {// SerialCmdDone (INIT_OLED); // init_oled =false; //} //} // Lê os sensores de umidade apenas uma vez por minuto ou eles se autoaquecerão se forem lidos muito rapidamente if (millis () - last_time> 60L * 1000L) {if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE)) ReadHumiditySensor (&inside); if (SerialCmdDone (HUMIDITY_SENSOR_OUTSIDE)) ReadHumiditySensor (&fora); 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 (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) cycle =fan =true; if (ciclo &&outside.temp <=MINIMUM_TEMPERATURE) fan =(millis () - offtime> FAN_OFF_TIME)? verdadeiro falso; if (ventilador) ontime =millis (); }} if (fan) SerialCmdDone (FAN_ON); senão 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, \ "", fora.relativo, fora.error); SerialPrint ("\"; sd127,48, \ "", fora.absoluto, fora.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 (); } atraso (1000); } else {digitalWrite (led, HIGH); atraso (500); digitalWrite (led, BAIXO); atraso (500); init_oled =true; } wdt_reset ();}
Esquemas
Use o Arduino Nano para criar um sistema de ventilação inteligente.Processo de manufatura
- Sistema de atendimento usando Arduino e RFID com Python
- Sistema de detecção de humanos usando Arduino Uno
- Arduino Spybot
- FlickMote
- TV B-Gone caseiro
- Relógio mestre
- Sistema de alarme Arduino:SERENA
- Sistema de rega automática de plantas com Arduino
- Sistema de monitoramento e detecção de incêndios florestais (com alertas SMS)
- O que é um sistema de ventilação?