Система для управления отоплением и вентиляцией на базе Arduino

Контроль отопления и вентиляции на базе Arduino

Привет! 🙂

Представляю мой новый проект — автоматическое управление отоплением и вентиляцией на базе Arduino Nano 3.0.

Довольно долго я бился над решением задачи создания оптимального микроклимата в ванной комнате, и наконец-то, благодаря знаниям, полученным в процессе изучения Arduino и различных датчиков температуры и влажности, мне это удалось! 🙂 

 

 

Началось все с того, что в весенний и осенний периоды, когда погода на улице еще не стабилизировалась, в ванной комнате наблюдались постоянные перепады температуры и влажности. Обогреватель то и дело перегревал воздух в дневное время, а если его отключить, то воздух становился неприемлемо холодным для ванной комнаты. То же самое и с влажностью. Постоянно включенная вытяжка приводила к переохлаждению комнаты в ночное время, а днем, если вытяжку не включить, происходило чрезмерное оседание конденсата, о борьбе с которым я уже писал ранее. В итоге, устав от необходимости бегать включать/выключать батарею и вытяжку по нескольку раз в день, а также имея практический опыт создания автоматизированной заслонки на базе Arduino, решил сконструировать прибор для автоматического управления отоплением и вентиляцией в ванной комнате. О результатах проделанной работы рассказано в этом видео.

А теперь предлагаю подробнее рассмотреть как все работает, включая программу (скетч) для Arduino!

Устройство системы

На передней панели системы управления отоплением и вентиляции находится двухстрочный дисплей LCD 1602 I2C, который отображает текущие значения температуры и влажности, а также позволяет просматривать меню установок прибора. Красная и зеленая кнопки — кнопки управления (оказалось вполне достаточно двух кнопок для изменения настроек и управления устройством). Красный светодиод загорается при включении отопления, а зеленый — при включении вентиляции. На левой стороне расположен датчик температуры и влажности DHT22 а также USB-порт модуля Arduino, который пришлось заклеить для лучшей сохранности.

Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку
Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку

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

Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку
Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку

Система контроля микроклимата работает от сети 220 вольт и подключена к ближайшей розетке.

Система для управления отоплением и вентиляцией на базе Arduino. Общий вид
Система для управления отоплением и вентиляцией на базе Arduino.

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

Система для управления отоплением и вентиляцией на базе Arduino со снятой лицевой панелью
Система для управления отоплением и вентиляцией на базе Arduino со снятой лицевой панелью

Внутри находится сборка из модуля ардуино нано 3.0, силовых реле с максимальным током до 10 ампер, и блоком питания на 9 вольт.

Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри
Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри

Панель управления подключена к основному модулю при помощи шлейфов.

Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри
Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри

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

Панель управления системы контроля микроклимата на базе Arduino
Панель управления системы контроля микроклимата на базе Arduino

Управляющий модуль сконструирован на монтажной плате и имеет разъемы для подключения датчика влажности и температуры DHT22, панели управления, нагрузки (4 разъема), а также источника питания. Первый, второй и четвертый разъемы работают в режиме ключа (замыкают и размыкают цепь). Третий разъем обеспечивает выход с напряжением 5 вольт для управления дистанционной розеткой.

Главный модуль системы контроля микроклимата на базе Arduino
Главный модуль системы контроля микроклимата на базе Arduino

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

Главный модуль системы контроля микроклимата на базе Arduino. Монтажная плата
Главный модуль системы контроля микроклимата на базе Arduino. Монтажная плата

Корпус системы — обычная электрическая разветвительная коробка стандартного размера.

Корпус системы контроля микроклимата
Корпус системы контроля микроклимата

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

Настенный конвектор, управляемый системой на базе Arduino
Настенный конвектор, управляемый системой на базе Arduino

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

Розетка с дистанционным управлением системы контроля микроклимата на базе Arduino
Розетка с дистанционным управлением системы контроля микроклимата на базе Arduino

Управляющая программа (скетч для ардуино)

Теперь, пожалуй, самое интересное 🙂 Предлагаю вашему вниманию полный скетч для управления отоплением и вентиляцией на базе Arduino. Скажу сразу, что скетч модернизировался после первого запуска системы целых 3 раза. И на то были определенные причины.

Изначально температура измерялась каждые 2 секунды, и в зависимости от этого срабатывали правила включения и выключения электроприборов. Бывало так, что вытяжка включалась и выключалась каждые 2 секунды, в моменты колебания влажности или температуры на пограничных значениях.

Решением данной ситуации стало изменение алгоритма программы таким образом, чтобы измерения проводились 5 раз подряд (в течение 10 секунд), а затем для всех показателей вычислялось среднее значение, на основании которого применялись правила включения/отключения нагрузки. Это позволило избавиться от таких «скачков» с выключением вытяжки или батареи!

Итак, скетч под этим спойлером:

Скетч занимает около 50% памяти ардуино и требует дополнительных библиотек для работы с датчиком DHT22 и экраном LCD через интерфейс I2C, найти которые можно на просторах интернета.

На момент написания статьи уже месяц система работает в штатном режиме, микроклимат в ванной стал практически идеальным, конечно пришлось несколько раз менять настройки включения и выключения вытяжки и батареи, но подобрав нужные параметры все стало просто идеально — и днем и ночью комфортные ощущения при нахождении в этом помещении! 🙂

Обновлено 05.11.2018

Зависание контроллера Arduino

Прошло пол года с момента начала активной эксплуатации устройства, и обнаружились некоторые проблемы, а именно, периодические зависания модуля ардуино. Начав разбираться, первым делом наткнулся на некий WatchDog, который способен автоматически перезагрузить систему при зависании микроконтроллера. Подумал — вот оно подходящее решение. Но как выяснилось, на моей китайской копии Arduino Nano 3.0 WatchDog работает неправильно из-за некорректной прошивки загрузчика. Для того чтобы это исправить, нужна «правильная» прошивка загрузчика, найти которую можно в интернете, и программатор, которым все это дело будет «зашиваться» внутрь чипа. Пока ждал программатор с Китая, решил поискать реальные причины зависания контроллера.

Просадка напряжения

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

Первым делом решил добавить 2 конденсатора по 1000 мкф в надежде, что они уменьшат просадку напряжения при срабатывании реле. Первый поставил параллельно выходу с блока питания (там кстати уже был свой конденсатор, но второй лишним не будет, подумал я), а второй — установил параллельно выходу +5V на плате ардуино, откуда как раз берется питание для реле. С этого же выхода питается и сам микроконтроллер. Складывается логичная ситуация — когда все реле включаются одновременно, микроконтроллеру не хватает напряжения и он зависает.

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

Доработка скетча Ардуино

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

Дело в том, что после обработки данных, полученных с датчиков, и включении/выключении какого-либо реле, происходил мгновенный переход к следующей обработке данных с датчиков, и включение/выключение следующего реле, и так далее. Фактически, все реле действительно могли включаться или отключаться одновременно, с задержкой менее 1 мсек, поскольку между обработкой данных для каждого реле отсутствовала пауза.

Исправив код этой процедуры, а именно, добавив искусственную задержку в 200 миллисекунд после включения/отключения какого-либо реле, я был крайне удивлен стабильной работой прибора. Зависания вовсе прекратились, и вот уже 2 месяца прибор работает стабильно. Теперь и WatchDog не нужен, хотя конечно он не помешает, на всякий случай.

В итоге можно сказать, что причиной зависания являлась несбалансированность нагрузки на источник питания при выполнении программного кода, а также низкое качество источника питания. Исправив программу, исчез и дисбаланс. Ниже представлен исправленный фрагмент кода процедуры DoAll(). Жирным текстом выделены те самые задержки по 200 мсек, которые были добавлены в программу и кардинально повысили стабильность работы микроконтроллера.

void DoAll(){
  //включаем обогрев, разъем 3, дистанционная розетка
  //сделаем чтобы батарея также включалась при повышенной влажности, чтобы подсушивать воздух
  if (HeatState==0 && (t<=tempHeatOn || h>humVentOn)){
    digitalWrite(4,1);
    digitalWrite(14,HIGH);
    HeatState=1;
    delay(200);
  }
  //отключаем обогрев, когда температура пришла в норму, а также влажность не превышает верхний предел (порог включения вытяжки)
  if (t>=tempHeatOff && HeatState==1 && h<=humVentOn){
    digitalWrite(4,0);
    digitalWrite(14,LOW);
    HeatState=0;
    delay(200);
  }

  //включаем вентиляцию, замыкаем разъемы 1 и 2 (реле 1 и 2)
  //также включаем вытяжку, если температура превышает верхнее значение 
  //(т>температуры отключения обогрева, например если перегрели во время просушки, 
  //то вытяжка продолжит работать когда влажность уже в норме, но температура воздуха еще высокая)
  if (VentState==0 && (h>=humVentOn || t>tempHeatOff)){
    digitalWrite(9,1);
    digitalWrite(2,1);
    digitalWrite(15,HIGH);
    VentState=1;
    delay(200);
  }
  //отключаем вентиляцию, когда влажность и температура пришли в норму
  if (h<=humVentOff && VentState==1 && t<=tempHeatOff){
    digitalWrite(9,0);
    digitalWrite(2,0);
    digitalWrite(15,LOW);
    VentState=0;
    delay(200);
  }

}

Обновлено 02.02.2019

Раздельное включение вентиляторов вытяжки

Зимой обнаружилось, что из одной из вытяжет стал капать конденсат, поэтому было решено отключать на зиму этот вентилятор. И чтобы не лазить каждый сезон с отверткой в развет коробку и уж тем более в само устройство, решил сделать все программно, поскольку каждый вентилятор управляется отдельным реле. Немного переработал скетч, добавив дополнительный экран настроек, на котором можно задействовать или отключить каждый вентилятор по отдельности Также уменьшил время одновременного нажатия кнопок для переключения между экранами настроек с 3 до 2 секунд. Свежий скетч можно скачать по ссылке ниже

Обновлено 19.11.2019

Многие спрашивают схему для сборки этого прибора, поэтому предлагаю вашему вниманию новый, более совершенный и интересный проект, созданный на базе этого, в котором есть схема, и подробно расписан весь процесс сборки, наладки и пуска системы! Читаем здесь 🙂

Спасибо за внимание! Будут вопросы — обращайтесь! 🙂

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

31 мысль о “Контроль отопления и вентиляции на базе Arduino”

  1. Здравствуйте мне понравился ваш проект контроллера и я решил его собрать, но вот никак не получается скомпилировать под ардуино, постоянно выскакивает ошибка (exit status 1
    Ошибка компиляции для платы Arduino Nano.
    ). Подскажите что сделать чтоб корректно завершить процесс загрузки скетча? Я уже и библиотеки разные ставил и пробовал менять begin на init результата нет(( Помогите пожалуйста.

    1. Здравствуйте!
      Ответил Вам по почте!
      Проблема была в некорректных библиотеках. Нужно использовать библиотеки из репозитория (в среде разработки)

      1. Доброго времени суток.Подскажите пожалуйста при компиляции выскакивает ошибка exit status 1 помогите решить данную проблему очень хочется собрать Ваш проект

  2. День добрый. Подскажите, у вас силовие реле питают конвектор? На сколько он кВт?

  3. Здравствуйте.
    К каким пинам подключены кнопки 5 и 8 так?
    и дисплей I2C lcd ?
    тоже самое делаю только для котла.

    1. Приветствую!
      Да, кнопки на 5 и 8 пины подключены.
      Дисплей подклчен по I2C, а это всегда 4 и 5 аналоговый разъемы ардуино (A4 & A5), посмотрите описание своей платы, там будет указано, где SCL и SDA находятся!

  4. Не компилируется никак. Есть ли скомпилированый?
    Самому придётся пепелапачивать(

    1. Библиотеки подключаю через стандартный репозиторий: Инструменты -> Управлять библиотеками

      Там только lcd.begin может меняться с lcd.init в разных библиотеках. Остальное все совместимо 🙂

  5. Евгений, добрый день!
    собрал по Вашему скечу и тут возник вопрос отключение отопление и вентиляции у Вас написано
    //2 — экран настройки температуры отключения обогрева
    //4 — экран настройки влажности отключения вентиляции
    не смог в коде найти отключение, не подскажите где.

    как то Вам задавал вопрос меняющего экрана на 4 датчика и вот как реализовал (меняющийся экран) ну лучше сразу брать экран больше

    //процедура отрисовки экрана LCD
    void DrawLCD(){
    if (mode==0){
    //отрисовка первого экрана
    //первой строки
    strOut=MakeString(«M:»+out_t+»*C «+out_h+»%»);
    //отрисовка второй строки
    DrawTicker(strOut,MakeString(«2 Rel:»+ String(tempC)+»*C»));
    //отрисовка второго экрана
    //первая сирока
    lcd.setCursor(0, 0);
    strOut=MakeString(«P1:»+ String(tempC2)+»*C»);
    lcd.print(strOut);
    //второй строки
    lcd.setCursor(0, 1);
    strOut=MakeString(«P2:»+String(tempC1)+»*C»);
    lcd.print(strOut);
    delay (3000);

  6. Очень интересный проект. Правда без схемы реализовать его не имея определённого опыта весьма затруднительно. Поднаберусь немного опыта на более простых примерах и постараюсь реализовать нечто подобное. Большое спасибо за потраченное время.

    1. Собирать проекты по схеме — это совсем примитивно и не интересно! Хотя и практично! И честно говоря, многие спрашивают схему к этому проекту, но я просто ее не проектировал, а собрал прибор сразу на ходу, и поэтому даже я сейчас не знаю точной схемы, т.к. прошло уже много времени 🙂 я могу восстановить схему по скетчу, чтобы она совпадала и можно было не напрягаясь собрать и включить и все заработает, но желания такого у меня нет, потому что мне проще заново собрать и попутно нарисовать схему 🙂 Поэтому, если есть сильное желание схему именно этого проекта — пишите мне на почту, что-нибудь придумаем! jablo@yandex.ru

  7. Помогите пожалуйста составить скетч, для схемы:
    3 датчика DHT11, реле, ардуино уно.

    Нужно при заданных параметрах либо влажности, либо температуры любого из трех датчиков, включалась вентиляция.
    Например:
    Влажность >= 90 — включение вентиляции, до момента когда влажность будет = 30 — включение той же вентиляции до того момента пока температура не станет <= 25

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

    Я в этом вообще ни бум бум, поэтому решился написать вам!

    1. Схему я не рисовал и не проектировал, т.к. собирал все по наитию…
      Но вы уже не первый кто интересуется схемой, поэтому как будет время, нарисую схему подключения…

  8. Здравствуйте как в вашем скетче можно инвертировать состояния реле и удалить второй вентилятор?

    1. Здравствуйте. Инвертировать реле можно поменяв настроечные параметры выводов с 0 на 1. В прикрепленном файле есть функция отключения второго вентилятора. Если он вообще не нужен, то можно просто удалить из программы соответствующий код, там комментарии прописаны где включение первого и второго вентилятора.
      Если не понятно пишите на почту, разберемся подробнее )

  9. Здравствуйте не могли бы вы нарисовать схему данного устройства а то по фото не совсем понятно как подключены модули к ардуино.

    1. Здравствуйте.
      Да, конечно можно, у DHT11 характеристики почти такие же, а комнатные условия оба датчика покрывают (DHT22 еще и на улице можно использовать, благодаря более широкому диапазону температур)

  10. Евгений, добрый день
    В продолжение нашего с Вами разговора по почте.
    Задача: контролировать температуру в удаленном строении в 3-4 местах для этого закуплены 18b20 датчики и модуль GPRS GSM.
    сейчас занимаюсь датчиками
    #include //библиотеки
    #include
    #define ONE_WIRE_BUS 10 // 10 пин на контроллере

    OneWire oneWire(ONE_WIRE_BUS); // определяем, что это шина
    DallasTemperature sensors(&oneWire);

    DeviceAddress Thermometer1 = {0x33, 0x36, 0x5D, 0x68, 0xA, 0x00, 0x00, 0xBB }; //адрес датчика DS18B20
    DeviceAddress Thermometer2 = {0x28, 0xBD, 0x5F, 0x88, 0xA, 0x00, 0x33, 0xA9 }; //адрес датчика DS18B20
    DeviceAddress Thermometer3 = {0x28, 0x78, 0x65, 0x67, 0x92, 0xD, 0x08, 0x46 }; //адрес датчика DS18B20

    float tempC; // для хранения температуры с датчиков 18b20
    float tempC1; // для хранения температуры с датчиков 18b20
    float tempC2; // для хранения температуры с датчиков 18b20

    unsigned long prevMilis = millis(); //для цикла тест
    int var = 1; //для цикла вывода

    void setup()

    void printTemperature(DeviceAddress deviceAddress) {
    tempC = sensors.getTempC(deviceAddress );
    Serial.println(tempC);

    }
    //Задаём функцию для второго датчика и выводим на экран
    void printTemperature2(DeviceAddress deviceAddress) {
    tempC1 = sensors.getTempC(deviceAddress );
    Serial.println(tempC1);

    }
    //Задаём функцию для третьего датчика и выводим на экран
    void printTemperature3(DeviceAddress deviceAddress) {
    tempC2 = sensors.getTempC(deviceAddress );
    Serial.println(tempC2);

    }
    void loop()
    {
    //измеряем температуру и влажность каждые 2 секунды
    if (counter==200 && mode==0){
    counter=0;
    ReadData(); //процедура для чтения информации с датчика DHT22
    //запрашиваем температуру с 18 датчиков и выводим в монитор
    sensors.requestTemperatures();
    Serial.print(«Sensor1 «);
    printTemperature(Thermometer1);
    Serial.print(«Sensor2 «);
    printTemperature2(Thermometer2);
    Serial.print(«Sensor3 «);
    printTemperature3(Thermometer3);

    }

    далее на чем остановился и размышляю как сделать
    void DrawLCD(){
    if (mode==0)
    //&& (millis() — prevMilis >= 15000)) // пытался сделать с меняющимся экраном, не смог добиться вывода. У Вас по интересному, в моем понимании, сделан вывод.
    {
    //switch (var) {
    //case 1:
    lcd.setCursor(0, 0);
    strOut=MakeString(«Temp: «+out_t+»*C»);
    lcd.setCursor(0, 1);
    strOut=MakeString(«Hum: «+out_h+»%»);
    lcd.print(strOut);
    delay (1000);
    //lcd.clear();
    //var++;
    //break;

    //case 2:

    lcd.setCursor(0, 0);
    //lcd.print(MakeString(String(«R: «+tempC+»*C»)));
    strOut=MakeString(«R: «+String(tempC)+»*C»);
    //lcd.print(MakeString((e4)));
    //strOut=MakeString();
    lcd.setCursor(0, 1);
    //strOut=MakeString(«P:»+tempC1+»*C»);
    strOut=MakeString(«R: «+String(tempC1)+»*C»);
    //lcd.clear();
    // var=1;
    //break;
    delay (1000);

    // case 3:
    // lcd.setCursor(0, 0);
    // lcd.print(«text3»);
    // var = 1;
    // break;
    //}

    //lcd.setCursor(0, 0);
    //strOut=MakeString(«M»+out_t+»Po»+tempC2);
    //lcd.print(strOut);
    //lcd.setCursor(0, 1);
    //strOut=MakeString(«H»+out_h+»%»+»O»+tempC+»P»+tempC1); //использовать одни цифры в выводе на экран крайне не информативно.
    //lcd.print(strOut);

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

    P.S. 1. не выкладываю весь скетч — чтоб не плодить лишнее.
    2. программированием занимался крайне давно далеко не на С++. Тогда еще команда GOTO была нормой в программировании :).

  11. Здравствуйте, как чувствует себя данная разработка, что то добавили,изменили, хотелось бы увидеть схему что бы повторить и применить в своих условиях.Приточный клапан подсоединили? Спасибо.

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

  12. Добрый день, Александр!
    Поделитесь пожалуйста доработками c датчиком влажности. Если не сложно.

  13. Уважаемый, Вы создали очень полезную вещь!
    Я ищу нечто подобное. Мне необходимо использование такого контроля в гроубоксе. Но для полной автоматизации не хватает контроля для полива. Я так понимаю, что на базе вашего устройства это вполне реализуемо, путем добавления еще одного датчика и нескольких строк в скетче. Сам я как бы ни хотел, но опыта в этом не накопил достаточно. Так вот вопрос: Не могли бы Вы рассмотреть такой вариант и помочь гроверам в таком важном деле?
    Буду примного благодарен. Требуется добавить датчик влажности почвы, и по его показаниям так же включать реле, с которого запитан насос. Включение полива тоже желательно что бы настраивалось по таймингу. В зависимости от обьема и типа насоса у всех время будет разное. Т.е. при снижении влажности до определенного уровня, включается насос на несколько секунд и увлажняет почву!

    1. Здравствуйте, Александр.
      Ваша задача вполне реализуема.
      Напишите мне на почту Jablo@yandex.ru обсудим ваше «железо» (оборудование) и решим как можно вам помочь

Добавить комментарий для Turbo Dj Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *