Многозонный контроллер отопления
Компоненты и расходные материалы
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Я построил это устройство, потому что на моей кухне было либо тепло, либо холодно с одним термостатом в моей жизни. Коммерческие многозонные контроллеры отопления (например, EvoHome) очень дороги. Эта программа захватывает интеллект этих дорогих систем, размещенных на простой плате Arduino Uno. Это полностью решило мою проблему.
Основные моменты / особенности:
- Вам нужно только настроить закрепление и количество зон.
- Простая Arduino Uno может управлять до 5 зонами Floor Unit.
- С Arduino Mega количество зон практически неограничено.
Предоставляемые элементы управления программой:
- Напольный насос
- Объединяет все ваши зоны в один термостат для центрального обогревателя.
- Клапаны, используемые для открытия / закрытия зон
- Таймер Watch Dog для надежной работы
Позволяет индивидуальный обогрев каждой зоны:
- Термостат для каждой зоны, определяющий запрос на нагрев.
- Для каждой зоны реле для управления одним или несколькими клапанами, чтобы открывать / закрывать группы блоков этажа в этой зоне.
- Помещение с несколькими группами этажей можно рассматривать как одну зону обогрева (подключите клапаны параллельно реле зоны)
- Это не только удобнее, но и экономит энергию, так как в комнатах больше не становится слишком жарко.
Управляет насосом напольного агрегата:
- В основном он запускает насос только тогда, когда это необходимо для отопления. Это уже экономит вам 100-200 евро электроэнергии в год (по сравнению с тем же насосом, работающим круглосуточно и без выходных (80 Вт - 2 кВт в час =0,50 евро в день).
- Включает насос напольного агрегата не реже одного раза в 36 часов на 8 минут, если не было запроса на отопление (летом).
- Предотвращает запуск насоса без предварительного открытия клапанов; С учетом этих клапанов потребуется 3-5 минут.
При желании вы также можете контролировать остальную часть вашего дома (комнаты без подогрева пола):
- Здесь обычно есть ручки термостатов на радиаторах; поэтому нагреваются только холодные помещения.
- Просто установите термостат в комнатах, которыми вы хотите управлять. Подключите эти термостаты параллельно входу No_Zone
Заключительные примечания:
Не все зоны нужно контролировать; только те зоны, которые становятся либо теплыми, либо остаются слишком холодными (в противном случае используйте ручки ручной регулировки на напольном блоке)
Я явно решил не подключать устройство к Интернету:
- Это повысит риск неправильного функционирования (должно быть надежным)
- Вы можете использовать умные термостаты, чтобы управлять своим домом. Этот контроллер не предлагает ничего лишнего для удаленной адаптации
Код
- ProjectCV.ino
- Devices.h
ProjectCV.ino C / C ++
/ * * Контроллер обогрева пола для нескольких комнат / зон v1.0 * * Авторские права:Стандартная общественная лицензия GNU версии 3 (GPL-3.0), Эрик Кройвелс, 2017 * Авторы:Питер Кройвелс за определение всех вариантов использования это необходимо учитывать * * Хотя эта установка уже работает более года на моем первом этаже, я не несу ответственности за какие-либо ошибки в коде * Ее можно использовать в качестве хорошей основы для ваших собственных нужд, и ее следует протестировано перед использованием * * Особенности / Особенности:* - Вам нужно только настроить закрепление и количество зон * - Простой Arduino Uno может управлять до 5 зонами этажных модулей * - С Arduino Mega количество зон практически не ограничено * - Предоставленная программа управляет:* - Насосом напольного агрегата * - Агрегирует все ваши зоны как один термостат для нагревателя CV * - Клапаны для открытия / закрытия зон * - Позволяет индивидуальный обогрев для каждой зоны; * - Для каждой зоны термостат для определения запроса на обогрев * - Для каждой зоны реле для управления одним или несколькими клапанами для открытия / закрытия групп напольных агрегатов этой зоны * - Помещение с несколькими группами напольных агрегатов можно рассматривать как одно отопление Зона (подключайте клапаны параллельно зонному реле) * - Это не только удобнее, но и экономит энергию, так как в комнатах больше не становится слишком жарко * - Управляет насосом напольного блока * - В основном он запускает насос только тогда, когда нужен для отопления. Это уже экономит вам 100-200 евро электроэнергии в год * по сравнению с тем же насосом, работающим круглосуточно и без выходных (80 Вт - 2 кВт в час =0,50 евро в день) * - Насос напольного агрегата активируется не реже одного раза в 36 часов, в течение 8 минут, если не было запроса на отопление (Лето) * - Предотвращает запуск насоса без предварительного открытия клапанов; С учетом этих клапанов требуется 3-5 минут * - По желанию вы можете контролировать и остальную часть вашего дома (комнаты без подогрева пола) * - Здесь у вас обычно есть ручки термостата на ваших радиаторах; поэтому будут нагреваться только холодные комнаты * - Просто установите термостат в комнату (комнаты), которыми вы хотите управлять. Подключите эти термостаты параллельно ко входу No_Zone * - Заключительные примечания:* - Не все зоны требуют управления; только зоны, которые нагреваются или остаются слишком холодными с * ручками с ручным регулированием на напольном блоке * / # include// для Watchdog // ПРЕДУПРЕЖДЕНИЕ:FAST_MODE предназначен для целей тестирования / оценки / отладки ( цикл работает в 50 раз быстрее) // Будьте осторожны при использовании FAST_MODE с реальным напольным насосом, так как он может быть поврежден при закрытых клапанах // Для открытия клапанов требуется минимум 3 минуты. В FAST_MODE программа не ждет достаточно долго перед запуском насоса // #define FAST_MODE // выполнение в 50 раз быстрее; подумайте о том, чтобы отключить ваш реальный CV / насос! // В нормальном режиме цикл работает 10 раз в секунду; так 10 отсчетов в секунду (600 соответствует 1 минуте) #define VALVE_TIME 3000L // 5 минут на открытие / закрытие клапана (на безопасном участке; обычно занимает от 3 до 5 минут) #ifdef FAST_MODE # define PUMP_MAINTENANCE_TIME 108000L // Для оценки , активирует профилактический запуск насоса напольного агрегата один раз в 4 минуты (отметка времени 3 часа) # else # define PUMP_MAINTENANCE_TIME 1300000L // Активирует профилактический запуск насоса напольного агрегата один раз в 36 часов. Необходимо для поддержания работы насоса # endif # define PUMP_ACTIVATION_TIME 5000L // Активирует насос примерно на 8 минут (10 секунд в тестовом режиме) #define COOLDOWN_TIME 18000L // Когда нагрев завершен, продолжайте циркуляцию воды еще 30 минут (40 секунд в тесте mode) // Это позволяет отводить тепло в пол (обычно это занимает от 15 до 30 минут) #include "./Devices.h" // клапаны, насосы, классы термостатов (используйте константы, определенные выше) struct Zone {String name; Клапан клапана; Термостат термостат;}; ///////////////////////////////////////////// ///////// КОНФИГУРАЦИОННЫЙ БЛОК // Настройте / измените порядок закрепления по своему усмотрению (это моя проводка на Arduino Uno); // Примечание:контакты 1 и 2 по-прежнему свободны для добавления дополнительной зоны # define HEATER_PIN 4 // выход на реле, которое подключено к входу термостата вашей системы отопления # define FU_PUMP_PIN 5 // выход на реле, которое переключает Насос напольного блока #define LIVING_VALVE 7 // Зона 1:выход на реле, которое управляет клапаном (ами) #define KITCHEN_VALVE 6 // Зона 2:выход на реле, которое управляет клапаном (ами) #define DINING_VALVE 3 // Зона 3:выход на реле, которое управляет клапаном (ами) #define LIVING_THERMO 8 // Зона 1; вход подключен к термостату в жилом #define KITCHEN_THERMO 9 // Зона 2; вход подключен к термостату на кухне # define DINING_THERMO 11 // Зона 3; вход подключен к термостату в столовой # define NO_ZONE_THERMO 10 // Опционально:термостаты в комнатах без подогрева пола # define HEATING_LED 12 // горит при обогреве, чередуется во время охлаждения, не горит в режиме ожидания # define INDICATION_LED 13 // чередует включение светодиод платы для индикации работы платы; может быть легко удален, чтобы освободить дополнительный контакт ввода-вывода !! // Настроить зоны / комнаты этажного блока. Каждой зоне / комнате присвоено имя, клапан и термостат:#define NR_ZONES 3Zone Zones [NR_ZONES] ={{"Гостиная", клапан (LIVING_VALVE, "Living Valve"), термостат (LIVING_THERMO, "Living Thermostat")}, { «Кухонная зона», клапан (KITCHEN_VALVE, «Кухонный клапан»), термостат (KITCHEN_THERMO, «Кухонный термостат»)}, {«Столовая», клапан (DINING_VALVE, «Обеденный клапан»), термостат (DINING_THERMO, «Обеденный термостат» )}}; // КОНЕЦ БЛОКА КОНФИГУРАЦИИ /////////////////////////////////////////// /////////// Некоторые фиксированные устройства:LED iLED (INDICATION_LED, «Индикатор LED»); // может быть удален, если у вас закончились светодиоды ввода-вывода hLED (HEATING_LED, «Светодиод нагрева»); Манипулятор CV (HEATER_PIN, «Нагреватель CV»); Насос FUPump (FU_PUMP_PIN, «Насос напольного блока»); Термостат ZonelessThermo (NO_ZONE_THERMO , «Беззонный термостат»); // Для остальной части дома, не связанной с блоком этажа zonevoid printConfiguration () {Serial.println ("------ Конфигурация платы:---------"); iLED.Print (); hLED.Print (); CV.Print (); FUPump.Print (); ZonelessThermo.Print (); для (int я =0; я 0) {cooldownCount--; } return checkCoolDownNeeded (); } bool checkCoolDownNeeded () {return (cooldownCount> 0); } void Print () {переключатель (_State) {case idle:Serial.print ("idle"); ломать; case on:Serial.print ("вкл"); ломать; время восстановления кейса:Serial.print ("время восстановления"); ломать; }}}; // Глобальное состояние машины Состояние CVState; void setup () {// инициализация Serial.begin (115200); printTimeStamp (); Serial.print (":"); # ifdef FAST_MODE Serial.println ("Контроллер зоны CV запущен в режиме TestMode! \ N" "- время платы работает примерно в 50 раз быстрее \ n" "- Цикл обслуживания насоса выполняется каждые 3 часа вместо одного раза за 36 часов "); # else Serial.println (" Контроллер зоны CV запущен. Отметки времени (dd:hh:mm:ss) "); # endif Serial.println (" - Формат отметок времени (dd:hh:mm:SS)"); printConfiguration (); wdt_enable (WDTO_1S); // Сторожевой таймер:сбросить плату через одну секунду, если не получено "погладить собаку"} void loop () {#ifdef FAST_MODE delay (2); // в 50 раз быстрее, поэтому минуты становятся примерно секундами для целей отладки; поэтому каждый счет времени восстановления или простоя составляет 0,002 секунды # else delay (100); // Нормальная работа:цикл примерно 10 раз в секунду; таким образом, каждый счетчик перезарядки или простоя составляет 0,1 секунды # endif // Используйте индикатор, чтобы показать, что плата жива iLED.Alternate (); // один раз за цикл () насос и клапаны должны обновить свою администрацию FUPump.Update (); for (int i =0; i оставаться в этом состоянии, если (FloorPumpingAllowed ()) {FUPump.On (); } еще {FUPump.Off (); }} else if (CVState.checkCoolDownNeeded ()) {// Продолжаем охлаждение, чтобы помпа продолжала работать некоторое время CVState (State ::cooldown); } else {// пропустить перезарядку модуля этажа, вернуться в режим ожидания CVState (State ::idle); }} void coolDownProcessing () {hLED.Alternate (); if (HeatingRequested ()) {// возвращает истину, когда один из термостатов закрыт CVState (State ::on); } else {если (CVState. whileCoolDownNeeded ()) {если (FloorPumpingAllowed ()) {FUPump.On (); } еще {FUPump.Off (); }} else {CVState (State ::idle); }}} void idleProcessing () {if (HeatingRequested ()) {// возвращает истину, когда один из термостатов закрыт CVState (State ::on); } else {// Во время простоя эта проверка активирует насос напольного агрегата на 8 минут каждые 36 часов, чтобы они оставались работоспособными if (FUPump.doMain maintenanceRun ()) {if (FUPump.IsOff ()) {if (allValvesOpen () ==false) {// запускаем открытие только один раз printTimeStamp (); Serial.println (":запуск суточного цикла для напольного насоса; открытые клапаны:"); allValvesOn (); } if (FloorPumpingAllowed ()) {// это занимает около 5 минут после активации клапанов (6 секунд в тестовом режиме) printTimeStamp (); Serial.println (":запуск суточного цикла для напольного насоса; запуск насоса"); FUPump.On (); }}} else if (FUPump.IsOn ()) {// Обслуживание не требуется. Поэтому остановите насос, если printTimeStamp () все еще работает; Serial.println (":остановить суточный цикл для напольного насоса; остановить насос и закрыть клапаны"); FUPump.Off (); allValvesOff (); }}} /////////////////////////////////////////////// /////////////////////// Вспомогательные методы, используемые обработчиками состояния //////////////////// ///////////////////// void allValvesOff () {for (int i =0; i Devices.h C / C ++
// Вспомогательные классы для IO devicesextern void printTimeStamp (); // определен в основном ino-файле // IODevice:базовый класс для всех устройств ввода-вывода; требуется класс специализации IODevice {// vars protected:bool _IsOn; int _Pin; String _Name; // общедоступный конструктор:IODevice (int pin, String name) {_IsOn =false; _Pin =штифт; _Name =имя; } // методы virtual bool IsOn () =0; // абстрактный виртуальный bool IsOff () {// по умолчанию для всех return! IsOn (); } void DebugPrint () {printTimeStamp (); Serial.print (":"); Распечатать(); } void Print () {Serial.print (_Name); Serial.print ("на контакте ("); Serial.print (_Pin); if (_IsOn) Serial.println (") =On"); иначе Serial.println (") =Выкл"); }}; // Термостат:считывает цифровой вход, добавляя некоторый класс герметичности Thermostat:public IODevice {// vars private:int _Counter; // используется для предотвращения чтения прерывистого переключения (dender) // конструктор public:Thermostat (int pin, String name):IODevice (pin, name) {_Counter =0; pinMode (_Pin, INPUT_PULLUP); } // методы virtual bool IsOn () {if (digitalRead (_Pin) ==HIGH &&_IsOn ==true) // открывать контакт при включении {if (_Counter ++> 5) // действовать только после 5-кратного одинакового считывания { _IsOn =false; DebugPrint (); _Counter =0; }} else if (digitalRead (_Pin) ==LOW &&_IsOn ==false) // закрытый контакт при выключенном состоянии {if (_Counter ++> 5) // действовать только после 5-кратного одинакового считывания {_IsOn =true; DebugPrint (); _Counter =0; }} еще {_Counter =0; } return _IsOn; }}; // Манипулятор:самое простое рабочее устройство в классе цифрового вывода Manipulator:public IODevice {// vars private:// constructor public:Manipulator (int pin, String name):IODevice (pin, name) {pinMode ( _Pin, ВЫХОД); digitalWrite (_Pin, HIGH); } // методы void On () {if (_IsOn ==false) {_IsOn =true; digitalWrite (_Pin, LOW); onSwitch (); }} void Off () {если (_IsOn ==true) {_IsOn =false; digitalWrite (_Pin, HIGH); onSwitch (); }} virtual void onSwitch () {// триггер для дочерних классов; изменение состояния включения / выключения DebugPrint (); } виртуальный логический объект IsOn () {return _IsOn; }}; // Клапан:управляет статическими клапанами на цифровом выходе. // Эти клапаны реагируют медленно (3-5 минут), поэтому этот класс добавляет эту информацию о переходе // loop () должен вызывать Update (), чтобы отслеживать, полностью открыт или закрыт клапанclass Valve:public Manipulator {private:long transitionCount; // общедоступный конструктор:Valve (int pin, String name):Manipulator (pin, name) {transitionCount =0; } bool ValveIsOpen () {return (IsOn () &&(transitionCount> =VALVE_TIME)); // хотя бы 5 минут во включенном состоянии} // Выполняется один раз за проход в цикле скетча () !!! void Update () {if (IsOn ()) {if (transitionCount0) transitionCount--; }}}; // Насос:насос нужно активировать несколько раз в неделю, чтобы они продолжали работать. // loop () должен вызывать Update (), чтобы отслеживать, когда требуется активация обслуживания class Pump:public Manipulator {// клапаны реагируют медленно (3-5 минут), поэтому этот класс добавляет эту информацию о переходе private:long counter; bool doMain maintenance; // общедоступный конструктор:Pump (int pin, String name):Manipulator (pin, name) {counter =0; doMain maintenance =false; } bool doMain maintenanceRun () {return doMain maintenance; } virtual void onSwitch () {// изменение состояния включения / выключения Manipulator ::onSwitch (); счетчик =0; } // запускаем этот метод каждый проход в loop () void Update () {if (IsOn ()) {if (counter 250) #else if (counter ++> 5) #endif {/ / переключить светодиодный счетчик =0; если (IsOn ()) Off (); else On (); }}};
Схема
Детальная разводка периферийных устройств (насос, клапаны, термостаты, светодиоды)


Производственный процесс
- Контроллер мощности ШИМ
- Солнечная система отопления
- Мониторинг моего котла центрального отопления
- Обслуживание скребка для пола
- Веб-контроллер DMX
- Устройство автоматизации задач видеоигры
- Игровой контроллер Arduino
- Unopad - MIDI-контроллер Arduino с Ableton
- Контроллер вакуумного люминесцентного дисплея
- Подключите центральное отопление к Arduino