Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Sistema de ventilação porão / crawlspace

Componentes e suprimentos

Arduino Nano R3
× 1
Expansor IO
× 1
Pacote de expansão IO
× 1

Aplicativos e serviços online

Arduino IDE

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

  1. Sistema de atendimento usando Arduino e RFID com Python
  2. Sistema de detecção de humanos usando Arduino Uno
  3. Arduino Spybot
  4. FlickMote
  5. TV B-Gone caseiro
  6. Relógio mestre
  7. Sistema de alarme Arduino:SERENA
  8. Sistema de rega automática de plantas com Arduino
  9. Sistema de monitoramento e detecção de incêndios florestais (com alertas SMS)
  10. O que é um sistema de ventilação?