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

Умная вентиляция подвала на Arduino: контроль влажности

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

Arduino Nano R3 1
IO Expander (своя плата расширения в/в) 1
Два датчика влажности/температуры SHT10 (1-Wire) 2
OLED 128×64 (SSD1306 / SH1106) 1
Два вентилятора 110В 172×150×38 мм (0.34 А) 2
Реле 1-канальное 5 В 1
Водонепроницаемый корпус 158×90×65 мм, кабельные вводы PG7/PG9 1
RJ11 разъёмы и кабель (2×50 фут + 6 фут) 1 компл.
Блок питания 12 В 1 А, провод 110 В, вилка 1 компл.

Программное обеспечение

О проекте

Система принудительной вентиляции подвала/подпола, сравнивающая абсолютную влажность внутри и снаружи. Включает вентиляторы только когда наружная влажность ниже и абсолютная влажность внутри выше — это эффективно снижает влажность и предотвращает плесень.

Основные функции

Почему IO Expander?

Сборка системы

  1. Подключите Arduino Nano к IO Expander, загрузите скетч (6-pin заголовок — отладочный Serial, не нужен в финале).
  2. Измените ONEWIRE_TO_I2C_ROM на адрес вашего 1-Wire→I2C конвертера.
  3. Подключите вентиляторы к 110 В через реле.
  4. Сверлите отверстия в корпусе для PG7 (питание 12 В) и PG9 (датчики/вентиляторы).
  5. Установите вентиляторы в вентиляционное отверстие на выдув, остальные вентиляционные щёлки — на впуск. Закройте соседние для создания поперечного потока.
  6. Выведите внешний датчик достаточно далеко от дома, проверьте показания по погодному сервису.
  7. Соберите всё в корпусе на двустороннем скотче и пенопласте.

Результаты (обновление 20.03.2019)

После месяцев работы при RH > 95% (течь водонагревателя) система снизила влажность до < 50%. Работает стабильно.

Заменён дисплей на SH1106 1.3″ — крупнее, читабельнее. Изменение одной константы в коде (ST10 → ST13).

Код (основной скетч)

/* 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.0
#define ABSOLUTE_DELTA_FAN_OFF 0.5
#define OUTSIDE_RELATIVE_FAN_ON 88
#define OUTSIDE_RELATIVE_FAN_OFF 90
#define MINIMUM_TEMPERATURE 15
#define FAN_ON_TIME (20*60*1000L)
#define FAN_OFF_TIME (20*60*1000L)

struct HS { float temp, relative, absolute; bool error; };

int led = 13;
bool init_oled = true;
long ontime, offtime;

float CelsiusToFahrenheit(float c) { return (c*9)/5 + 32; }
#define C2F(t) CelsiusToFahrenheit(t)

float AbsoluteHumidity(float temp, float rh) {
  // Buck (1981) formula
  return (6.1121 * pow(2.718281828, (17.67 * temp) / (temp + 243.5)) * rh * 18.01534) / ((273.15 + temp) * 8.21447215);
}

void ReadHumiditySensor(HS* hs) {
  SerialCmd("sr");
  if (SerialReadFloat(&hs->temp) && SerialReadFloat(&hs->relative)) {
    hs->absolute = AbsoluteHumidity(hs->temp, hs->relative);
    hs->error = false;
  } else hs->error = true;
  SerialReadUntilDone();
}

void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);
  wdt_enable(WDTO_8S);
  offtime = millis() - FAN_OFF_TIME;
}

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

  Serial.println();
  if (SerialReadUntilDone()) {
    if (millis() - last_time > 60000L) {
      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);
          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; }
        // формирование экрана OLED через команды IO Expander
        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\";");
        // вывод значений...
        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();
}

Схемы

Принципиальная схема подключения через IO Expander.

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

  1. Надежная система учета рабочего времени на Arduino с RFID и Python
  2. Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
  3. Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
  4. FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
  5. DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
  6. Создание пользовательских LED-часов с будильником — видно с 12 метров
  7. SERENA: Пользовательская система сигнализации на Arduino Mega 2560 с TFT Touchscreen
  8. Автоматическая система полива растений на Arduino — уходи в отпуск спокойно
  9. Система мониторинга лесных пожаров в реальном времени с SMS-уведомлениями
  10. Системы вентиляции: сохраняем свежий и здоровый воздух в помещении