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

Многозонный контроллер отопления

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

Arduino UNO
Используйте Mega, если вам нужно контролировать более 5 зон (включая дополнительную зону для остальных Ваш дом без теплого пола)
× 1
Keyes 8-канальная плата реле 5 Вольт
Вам понадобится плата с 4 реле для управления 2 зонами этажа (1 насос, 1 CV, 2 клапана ), Требуется одно дополнительное реле для каждой дополнительной зоны этажа
× 1
Малый линейный термоэлектрический привод Honeywell MT8-230-NC (230 В переменного тока )
Это лишь один из многих возможных доступных приводов; Вам нужен 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 (transitionCount  0) 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 (); }}}; 

Схема

Детальная разводка периферийных устройств (насос, клапаны, термостаты, светодиоды) Пример подключения нескольких «каскадных» контроллеров. Один контроллер на каждый этаж Немного реального ведения журнала Serial Monitor, чтобы понять его функциональность. Отметки времени показывают, например, задержка в 5 минут между открытием клапанов и фактическим запуском насоса напольного агрегата. logexample_fTczkAa0tf.txtВдохновляющий

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

  1. Контроллер мощности ШИМ
  2. Солнечная система отопления
  3. Мониторинг моего котла центрального отопления
  4. Обслуживание скребка для пола
  5. Веб-контроллер DMX
  6. Устройство автоматизации задач видеоигры
  7. Игровой контроллер Arduino
  8. Unopad - MIDI-контроллер Arduino с Ableton
  9. Контроллер вакуумного люминесцентного дисплея
  10. Подключите центральное отопление к Arduino