Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Система вентиляции подвала / подвала

Компоненты и расходные материалы

Arduino Nano R3
× 1
расширитель ввода-вывода
× 1
Пакет расширителя ввода-вывода
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Список возможностей

  • Датчик внутренней / наружной температуры / влажности.
  • Интеллектуальное управление вентилятором со сравнением влажности
  • Уменьшите влажность в подвале / подвале.
  • Помогите уменьшить рост плесени.
  • Интеллектуальная вентиляция экономит электроэнергию.

Детали, необходимые для создания системы вентиляции

  • Расширитель ввода-вывода
  • 1-Wire - I2C.
  • Arduino Nano.
  • 1-канальное реле постоянного тока 5 В
  • Датчик влажности x2 SHT10.
  • Дисплей I2C SSD1306 OLED 128x64.
  • x2 110 В, 172 x 150 x 38 мм, 0,34 А, 2400 об / мин, вентиляторы с шарикоподшипниками.
  • Прозрачный водонепроницаемый пластиковый корпус 158x90x65 мм.
  • Водонепроницаемый нейлоновый кабельный ввод ip68 pg7.
  • Водонепроницаемый нейлоновый кабельный ввод ip68 pg9.
  • Гнездо с винтовым зажимом RJ11, x2 шт.
  • Корпус x2 Keystone Enclosure.
  • 2 кабеля длиной 50 футов 4C4P RJ11.
  • 6-дюймовый провод 4C4P RJ11.
  • 100-футовый провод 110 В.
  • Вилка переменного тока.
  • Заголовок 2,54 мм.
  • Блок питания от настенного блока питания 12 В постоянного тока, 1 А.

Схема подключения

OLED-дисплей

Так зачем использовать расширитель ввода-вывода?

  • Проще проектировать
  • Готовые запчасти
  • Нет драйвера 1-Wire для написания
  • Нет драйвера реле для записи
  • Нет драйвера дисплея OLED для написания
  • Нет отображаемых шрифтов, занимающих пространство кода Arduino.
  • Не нужно писать драйвер датчика влажности
  • Экономит место для кода на Arduino; всего 6106 байт (19%)
  • На написание кода осталось меньше суток.
  • Простота подключения с помощью стандартного телефонного кабеля RJ11.
  • Нет проблем с длиной кабеля датчика.
  • Дешевле в сборке, чем коммерческие системы.
  • Легко вносить изменения для адаптации к индивидуальным требованиям.
  • Один источник питания

Постройте систему

Подключите Arduino Nano к расширителю ввода-вывода и запрограммируйте его с помощью следующего кода. Шестиконтактный разъем - это последовательный порт отладки программного обеспечения, который не нужен при окончательной установке.

Убедитесь, что вы изменили определенный адрес ONEWIRE_TO_I2C_ROM, чтобы он соответствовал вашему адресу 1-Wire на I2C.

  / * Расширитель ввода-вывода 
*
* Система вентиляции подвала / подвала, версия 1.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 // Вентилятор включен, если абсолютная дельта влажности внутри> =снаружи
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Вентилятор выключен, если дельта абсолютной влажности внутри <=снаружи
#define OUTSIDE_RELATIVE_FAN_ON 88 // Вентилятор включен, если относительная влажность снаружи <=%
# define OUTSIDE_RELATIVE_FAN_OFF 90 // Вентилятор выключен, если относительная влажность снаружи> =%
# define MINIMUM_TEMPERATURE 15 // Цикл вентиляции вкл / выкл, если наружная температура <=15C / 59F
#define FAN_ON_TIME (20 * 60 * 1000L) // 20 мин
#define FAN_OFF_TIME (20 * 60 * 1000L) // 20 минут

// # define SERIAL_DEBUG
#define SERIAL_TIMEOUT 5000 // 5-секундная задержка между чтениями 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 (десятичный , 1);
}

float DewPoint (температура поплавка, влажность поплавка)
{
float t =(17.625 * temp) / (243.04 + temp);
float l =log (влажность / 100);
float b =l + t;
// Используем Augus Приближение t-Роша-Магнуса
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)
{
// взято из https://carnotcycle.wordpress.com/2012/08/04/how-to-convert- относительная влажность - абсолютная влажность /
// точность составляет около 0,1 ° C в диапазоне от -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)
// ссылка https://www.eas.ualberta.ca/jdwilson/EAS372_13 /Vomel_CIRES_satvpformulae.html // Используйте Buck (1981)
return (6.1121 * pow (2.718281828, (17.67 * temp) / (temp + 243.5)) * relative * MOLAR_MASS_OF_WATER) / ((273.15 + temp) * UNIVERSAL_GAS;
}

void ReadHumiditySensor (HS * hs)
{
SerialCmd ("sr");
if (SerialReadFloat (&hs-> temp) &&
SerialReadFloat (&hs-> relative)) {
// hs-> точка росы =точка росы (hs-> temp, hs-> relative);
hs-> absolute =AbsoluteHumidity (hs-> temp, hs-> relative);
hs-> error =false;
}
иначе 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 внутри, снаружи;
static bool fan =false;
static bool cycle =false;
static long last_time =- (60L * 1000L);

Serial.println ();
if (SerialReadUntilDone ()) {
// Считывание датчиков влажности только раз в минуту, иначе они будут саморазогреваться при слишком быстром считывании
if (millis () - last_time> 60L * 1000L)
{
if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE) )
ReadHumiditySensor (&внутри);

if (SerialCmdDone (HUMIDITY_SENSOR_OUTSIDE))
ReadHumiditySensor (&снаружи);

i f (inside.error || outside.error) fan =false;
else {
if (fan) {
if (outside.relative> =OUTSIDE_RELATIVE_FAN_OFF || inside.absolute - снаружи.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, \ "г / м \"; 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);
Последовательный .print ("\"; ");
Serial.print (" sf0; sa0; sd0,0, \ "");
if (вентилятор) 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 ();
}

Примечание. Если вы используете порт USB для программирования Arduino Nano, вы должны отключить его от расширителя ввода-вывода, поскольку он также использует тот же единственный последовательный порт, вместо этого, если вы хотите отладить, используйте порт ICSP для программирования ATmega328P. Чтобы включить порт отладки программного обеспечения, раскомментируйте определение SERIAL_DEBUG.

Подключите провод 110 В переменного тока к обоим вентиляторам.

Просверлите отверстия 7/16 "и 9/16" с каждой стороны корпуса для PG7 и PG9. Воспользуйтесь инструментом dremel, чтобы немного увеличить отверстия, пока сальник не войдет в плотное соединение. PG7 будет питать входное напряжение 12 В постоянного тока, а PG9 - для датчиков и вентиляторов.

Найдите вентиляционное отверстие, которое открыто и не заблокировано. Это будет наш выхлоп, из которого мы будем выдувать воздух из подвала / подполья. Убедитесь, что все остальные вентиляционные отверстия на другой стороне открыты, так как они станут вашим воздухозаборником. Закройте прилегающие вентиляционные отверстия, чтобы создать региональный, а не местный воздушный поток через весь подвал / пространство для ползания.

Закрепите вентиляторы на внутренней стороне вентиляционного отверстия с помощью стяжек. Убедитесь, что вентиляторы направлены в правильном направлении, чтобы выдувать воздух.

Найдите существующую точку доступа и проденьте провод датчика наружной влажности внутрь. Убедитесь, что датчик влажности расположен достаточно далеко от дома и любых препятствий, чтобы вы могли точно измерить температуру / влажность окружающей среды. Сравните свои показания с вашими местными прогнозами погоды.

Подключите датчик наружной влажности к гнезду трапецеидального искажения и корпусу и установите его внутри.

Подключите внутренний датчик влажности к гнезду трапецеидального искажения и корпусу и установите его внутри. Предпочтительно центральное расположение или место, где требуется дополнительный контроль влажности.

Подключите 50-футовые провода RJ11 к датчикам влажности и проведите провода с проводом вентилятора к доступной точке доступа, где будет установлен шкаф управления.

Подключите все провода и соберите / подайте все детали в корпус управления. Если ваши 50-футовые провода RJ11 поставляются с предварительно обжатыми разъемами, вам придется отрезать их, чтобы пропустить провода через сальник и обжать новые разъемы.

Протестируйте систему и убедитесь, что все работает правильно. Чтобы проверить реле и вентиляторы, отключите Arduino от расширителя ввода-вывода и подключите его напрямую к компьютеру, чтобы управлять им вручную. Убедившись, что все работает, соберите все детали в корпус, используя двусторонний скотч и упаковочную пену, чтобы закрепить доски, и наслаждайтесь преимуществами и экономией вашей интеллектуальной системы вентиляции с контролем влажности

Обновление 20.03.2019

После запуска системы вентиляции в моем подвесном пространстве в течение последних нескольких месяцев с нулевыми зависаниями и с пиковой относительной влажностью более 95% после утечки из моего водонагревателя она успешно снизила относительную влажность до менее 50%. Система вентиляции - это постоянно работающая система управления, которая работает!

Переключен с 0,96-дюймового OLED-дисплея SSD1306 на 1,3-дюймовый OLED-дисплей SH1106. Он намного больше и его легче читать. С обновлением прошивки IO Expander его легко изменить. Просто измените «ST10» на «ST13» в своем коде.

Обновление от 12.09.2019

Выпущена версия 1.1, в которой исправлена ​​проблема с холодной загрузкой, при которой дисплей OLED не работал. Я все еще проветриваю пространство для ползания!

Код

  • Система вентиляции подвала / подвала
Система вентиляции подвала / подвала C / C ++
Используйте Arduino Nano для создания интеллектуальной системы вентиляции
 / * IO Expander * * Basement / Crawlspace Ventilation System v1.1 * * / # include  #include  #include  #include "IOExpander.h" #define FAHRENHEIT # определить ONEWIRE_TO_I2C_ROM "i4s71" #define INIT_OLED "ST13; си, СБН, сд" #define HUMIDITY_SENSOR_INSIDE "s6t1" #define HUMIDITY_SENSOR_OUTSIDE "s8t1" #define FAN_ON "R1O" # define FAN_OFF "r1f" #define ABSOLUTE_DELTA_FAN_ON 1 // Вентилятор включен, если абсолютная влажность внутри> =снаружи #define ABSOLUTE_DELTA_FAN_OFF 0.5 // Вентилятор выключен, если абсолютная влажность внутри <=снаружи # define OUTSIDE_RELATIVE_FAN_ON 88 // Вентилятор включен, если снаружи влажность <=% # define OUTSIDE_RELATIVE_FAN_OFF 90 // Вентилятор выключен, если внешняя относительная влажность> =% # define MINIMUM_TEMPERATURE 15 // Цикл вентиляции вкл / выкл, если внешняя температура <=15C / 59F # define FAN_ON_TIME (20 * 60 * 1000L) // 20 мин. # Определение FAN_OFF_TIME (20 * 60 * 1000L) // 20 мин. // # определение SERIAL_DEBUG # определение SERIAL_TIMEOUT 5000 // 5 сек. lay между DHT22 читает # ifdef SERIAL_DEBUGSoftwareSerial swSerial (8,7); # endifstruct HS {float temp; поплавок относительный; плавающий абсолютный; 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); если (ошибка) Serial.print (F ("NA")); else Serial.print (decimal, 1);} float DewPoint (температура поплавка, влажность поплавка) {float t =(17,625 * темп) / (243,04 + темп); float l =log (влажность / 100); поплавок b =l + t; // Использование приближения Августа-Роша-Магнуса 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) {// взято из https:// carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ // точность составляет около 0,1 ° C в диапазоне от -30 до 35 ° C // August-Roche- Магнус 6.1094 exp (17.625 x T) / (T + 243.04) // Buck (1981) 6.1121 exp (17.502 x T) / (T + 240.97) // ссылка https://www.eas.ualberta.ca/jdwilson/ EAS372_13 / Vomel_CIRES_satvpformulae.html // Использовать Buck (1981) return (6.1121 * pow (2.718281828, (17.67 * temp) / (temp + 243.5)) * relative * MOLAR_MASS_OF_WATER) / ((273.15 + temp_ANT) * UNIVCAL ReadHumiditySensor (HS * hs) {SerialCmd ("SR"); if (SerialReadFloat (&hs-> temp) &&SerialReadFloat (&hs-> relative)) {// HS-> точка росы =DewPoint (hs-> temp, hs-> relative); hs-> absolute =AbsoluteHumidity (hs-> temp, HS-> относительная); чс-> ошибка =ложь; } иначе 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 внутри, снаружи; static bool fan =false; static bool cycle =false; статический длинный last_time =- (60 л * 1000 л); Serial.println (); if (SerialReadUntilDone ()) {// if (init_oled) {// if (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) {// SerialCmdDone (INIT_OLED); // init_oled =false; //} //} // Считываем датчики влажности только один раз в минуту, иначе они будут саморазогреваться, если считывать слишком быстро if (millis () - last_time> 60L * 1000L) {if (SerialCmdDone (HUMIDITY_SENSOR_INSIDE)) ReadHumiditySensor (&inside); if (SerialCmdDone (HUMIDITY_SENSOR_OUTSIDE)) ReadHumiditySensor (&за пределами); если (inside.error || outside.error) fan =false; else {if (fan) {if (external.relative> =OUTSIDE_RELATIVE_FAN_OFF || inside.absolute - снаружи.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 {если (external.relative <=OUTSIDE_RELATIVE_FAN_ON &&inside.absolute - outside.absolute> =ABSOLUTE_DELTA_FAN_ON) cycle =fan =true; if (цикл &&external.temp <=MINIMUM_TEMPERATURE) fan =(millis () - offtime> FAN_OFF_TIME)? истина:ложь; если (вентилятор) ontime =millis (); }} if (вентилятор) SerialCmdDone (FAN_ON); иначе SerialCmdDone (FAN_OFF); если (SerialCmdNoError (ONEWIRE_TO_I2C_ROM)) {если (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, \ "г / м \"; 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, \ "", external.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 (); } иначе init_oled =true; last_time =миллис (); } задержка (1000); } else {digitalWrite (светодиод, ВЫСОКИЙ); задержка (500); digitalWrite (светодиод, НИЗКИЙ); задержка (500); init_oled =true; } wdt_reset ();} 

Схема

Используйте Arduino Nano для создания интеллектуальной системы вентиляции.

Производственный процесс

  1. Система посещаемости с использованием Arduino и RFID с Python
  2. Робототехническая система для обнаружения человека с использованием Arduino Uno
  3. Arduino Spybot
  4. FlickMote
  5. Самодельный телевизор B-Gone
  6. Основные часы
  7. Система сигнализации Arduino:SERENA
  8. Автоматическая система полива растений с Arduino
  9. Система мониторинга и обнаружения лесных пожаров (с SMS-оповещениями)
  10. Что такое система вентиляции?