Практически любой современный нагреватель умеет автоматически поддерживать некую предустановленную температуру. В самом простейшем случае за это отвечает термостат, который и управляет работой нагревательного элемента. Крутишь ручку, выставляешь желаемую температуру (чаще всего — «в попугаях»), и все — обогреватель сам ее поддерживает!
Но как быть в том случае, если хочется чего-то большего? Например, поддержания разной температуры в разное время суток? Или даже — в разные дни? «Без мозгов тут никак!», подумал я, и быстренько сваял себе девайс, который и будет описан в данной заметке…
Железо
Первым делом, предлагаю вам посмотреть на принципиальную схему управляющего устройства (кликните мышью на рисунке, чтобы увеличить его):
Как видите, тут все предельно просто — пара датчиков температуры U1 и U2 подключена к процессору U3, который через оптрон U4 управляет симистором T1, включенным в разрыв сетевого провода нагревателя. Питание процессора и прочей «слаботочки» обеспечивает блок питания U5. Полагаю, что подробнее расписывать назначение каждого элемента данной схемы — не уважать читателя, ибо тут все итак «просто как дверь»!
Чем можно заменить детали, использованные в схеме. DS18B20 (U1 и U2) очень широко представлены в продаже (как в плане изготовителей, так и в плане цен), и поэтому я не вижу смысла их чем-нибудь менять. Замену оптрону U4 можно выбрать из других модельных рядов (MOC301X, MOC302X, MOC304X, MOC305X, MOC306X), имеющих такие же цоколевку и назначение. С другой стороны, у других изготовителей возможно небольшое отличие в маркировке (например у ф. Toshiba этот же оптрон будет называться TLP3063). Процессор Stamp-Pico (U3) — это малогабаритная реализация модуля на процессоре ESP32 от фирмы M5Stamp. Вы можете заменить его практически любым модулем с процессором ESP32, которых выпускается превеликое множество, но при этом, вам возможно придется внести изменения в код программы, указав номера выводов GPIO, использованные вами. Также, нужно учесть тот факт, что на данном модуле (Stamp-Pico от M5Stamp) установлен многоцветный светодиод SK6812, который используется в программе для индикации различных состояний устройства. Если у выбранного вами модуля данный светодиод отсутствует, то в программе нужно будет удалить все, что относится к его управлению (библиотека FastLED и процедуры управления светодиодом). Либо — просто установить такой же светодиод «снаружи» выбранного вами модуля. Вместо использованного мной блока питания HLK-PM01 фирмы Hi-Link, вы можете использовать любой другой, который в состоянии выдавать 5 Вольт напряжения на выходе при токе до 0,7 Ампера.
Ну и завершая с «аппаратными» вопросами, осталось сказать пару слов о печатной плате. Мною она не разрабатывалась, и все устройство (за исключением силового симистора T1, установленного на отдельном радиаторе) было смонтировано на небольшой макетной плате, вот такой:
Софт
Как и положено «черной коробочке с процессором», основным элементом конструкции является именно «прошивка» (управляющая программа, загруженная в процессор). Мной она была написана в IDE Arduino (использовалась версия 1.8.19, о причинах чего — см. ниже). Также, был использован ряд дополнительных библиотек (в коде для каждой из них указано, устанавливать ее через встроенный менеджер, или же загружать из интернета).
Далее. Если еще раз внимательно посмотреть на схему устройства, то можно заметить, что в ней нет элементов индикации (если не считать светодиод SK6812, установленный на модуле Stamp-Pico). А управление данным устройством, на самом деле — весьма «продвинутое», и одним светодиодом тут не обойтись никак, даже с поправкой на то, что он многоцветный. На самом деле, все управление данным устройством (как и положено т.н. IoT) вынесено на веб-страницу (и будет описано мною ниже).
Пару слов о причине использования «не самой свежей» версии IDE Arduino. В программе используется библиотека LittleFS (на разделе LittleFS, созданном в памяти процессора, хранятся файлы веб-страницы управления). А для записи этого раздела используется специальный плагин, устанавливаемый в раздел Инструментов Arduino IDE — ESP32 Sketch Data Upload. И вот этот плагин, увы, не совместим с версией 2.Х Arduino IDE, а поддерживает только 1.8.Х. Именно поэтому мной и была использована Arduino IDE предыдущей версии.
Сам скетч (а также, папка «data», в которой находятся файлы веб-интерфейса) доступны по ссылке:
Распаковываете архив в папку скетчей Arduino IDE, запускаете ее, проходитесь по списку подключенных библиотек, проверяете их наличие у себя, и в случае отсутствия какой-либо из них — доустанавливаете. В настройках выбираете плату «M5Stamp-Pico» (надеюсь, вы же установили в IDE поддержку плат от M5Stamp, как это описано тут), и (важно!) выбираете для параметра «Partition Scheme» значение «Minimal SPIFFS (1.9MBAPP with OTA/190KB SPIFFS)». После этого, первым делом выполняете компиляцию и заливку в процессор самой программы («скетча»), а затем — и файловой системы LittleFS. Как подключать Stamp-Pico для прошивки в него скетчей, я ранее писал тут.
Если вы при повторении конструкции будете использовать не Stamp-Pico, а другой модуль с ESP32 «на борту», или же задействуете другие «ножки» процессора для подключения термодатчиков, оптрона, кнопки прнудительного включения (о ней см. ниже) — внесите соответствующие изменения в код скетча, изменив там номера использованных выводов GPIO:
#define temperature_pin_1 18 ... #define temperature_pin_2 26 ... #define relay_control_pin 25 ... #define force_button_pin 19
До тех пор, пока вы не настроите параметры подключения к беспроводной сети, процессор будет запускать свою собственную точку доступа с SSID «Stamp_Pico» и паролем «12345678». Если вы пожелаете изменить эти значения, найдите и отредактируйте в скетче такие строки:
String ap_ssid = "Stamp_Pico"; String ap_password = "12345678";
Устройство предоставляет возможность «обновления прошивки по воздуху» (т.н. OTA). Для доступа к странице обновления необходимо будет вводить логин «firmware» и пароль «firmware». Если вы захотите изменить их, найдите в скетче и отредактируйте следующие строки:
const char* ota_username = "firmware"; const char* ota_password = "firmware";
И еще одно важное замечание по поводу использованной в программе библиотеки ElegantOTA. Ее вам нужно будет отредактировать, иначе при компиляции будет возникать ошибка. Связано это с тем, что в программе использована библиотека ESPAsyncWebServer, и как следствие — библиотеку ElegantOTA нужно тоже переключить в асинхронный режим, как это описано в ее документации. Т.е., после установки библиотеки, находите в ее папке src файл ElegantOTA.h, открываете его в редакторе и в строке:
#define ELEGANTOTA_USE_ASYNC_WEBSERVER 0
…меняете 0 на 1. После этого Arduino IDE не будет сообщать об ошибке компиляции скетча.
Настройки параметров устройства
При первом своем включении нагреватель запустит собственную точку доступа WiFi с SSID «Stamp_Pico». Вам нужно подключиться к ней, введя пароль «12345678» (естественно, если вы изменили в скетче значения параметров ap_ssid и ap_password, как было сказано выше, то имя сети и пароль используйте свои собственные). Подключившись с вашего смартфона/ноутбука/компьютера к точке доступа нагревателя, откройте браузер и введите в нем адрес http://192.168.4.1 (этот адрес процессор устройства присваивает себе, когда запускает собственную точку доступа). У вас должна открыться вот такая страница:
Обращаю ваше внимание на то, что выше показан скриншот для УЖЕ НАСТРОЕННОГО и РАБОТАЮЩЕГО нагревателя. В случае первого включения прибора ряд полей будет выглядеть иначе, но они в данный момент вас и не интересуют! Сейчас Вам нужно настроить параметры подключения нагревателя к сети WiFi. Причем, сеть нужна именно С ДОСТУПОМ К ИНТЕРНЕТУ! Это обстоятельство (гарантированная возможность доступа нагревателя к интернету) важно потому, что сведения о текущих времени и дате (равно как и о дне недели) процессор устройства получает именно из интернета (от специальных серверов по протоколу NTP). А без этих сведений, увы, работа нагревателя по расписанию невозможна! Поэтому, настройку подключения к сети нужно выполнить обязательно!
Итак, чтобы настроить подключение нагревателя к беспроводной сети, нажмите соответствующую иконку в верхнем меню (вторую справа). У вас откроется всплывающее окно, в котором вы сможете ввести нужные параметры:
Обязательными к заполнению в этом окне являются поля «SSID» и «Пароль». Укажите ваши значения и нажмите кнопку «Сохранить». После того, как вы сохраните настройки сети, УСТРОЙСТВО АВТОМАТИЧЕСКИ ПЕРЕЗАГРУЗИТСЯ!
Кроме обязательных полей в этом меню вы можете настроить еще парочку других (дополнительных и не обязательных) параметров, а именно — «Статический IP-адрес» и «Адрес внешнего Syslog-сервера».
- По поводу статического адреса — программа предоставляет вам возможность указать только лишь желаемый IP-адрес самого нагревателя! А вот адреса шлюза сети и DNS-сервера управляющая программа сформирует сама, заменив последний октет введенного вами IP-адреса нагревателя на 1. То есть, допустим, вы введете статический адрес 192.168.1.20. Тогда оба адреса (и шлюза, и DNS-сервера), которые нагреватель будет использовать при подключении к сети, будут установлены как 192.168.1.1. И последнее замечание по поводу статического IP-адреса — чтобы система использовала указанное вами значение, первый его октет ДОЛЖЕН БЫТЬ НЕ РАВЕН НУЛЮ!
- По поводу Syslog-сервера — это «чуть-чуть из мира Linux-ов». Если у вас «под рукой» есть компьютер/сервер, работающий под управлением ОС Linux, то его встроенный Syslog-сервер может быть настроен на прием сообщений, поступающих от других («внешних») устройств сети. Информации о том, как это сделать, в интернете — «вагон и маленькая тележка», поэтому именно этот аспект я тут рассматривать не буду. В итоге, если вы на Linux-машине включите логирование внешних сообщений, а в настройках нагревателя в поле «Адрес внешнего Syslog-сервера» укажете адрес такого компьютера, то сможете наблюдать в нем логи наподобие такого:
Dec 25 03:57:10 10.11.12.109 HTR-4C7525CE4B64: Загрузка системы завершена! Был получен такой IP адрес: 10.11.12.109 Dec 25 07:00:03 10.11.12.109 HTR-4C7525CE4B64: Согласно расписания режим поддержания заданной температуры ВЫКЛЮЧЕН. Текущ. темп-ра: 16.62ºC Dec 25 07:00:13 10.11.12.109 HTR-4C7525CE4B64: Согласно расписания ВКЛЮЧЕН режим поддержания заданной температуры: 19.00ºC Dec 25 07:00:13 10.11.12.109 HTR-4C7525CE4B64: Активное оборудование ВКЛЮЧЕНО, т.к. температура вышла за допустимые пределы: 16.62ºC Dec 25 09:12:03 10.11.12.109 HTR-4C7525CE4B64: Активное оборудование ВЫКЛЮЧЕНО, т.к. температура достигла требуемого значения: 19.06ºC Dec 25 10:15:03 10.11.12.109 HTR-4C7525CE4B64: Активное оборудование ВКЛЮЧЕНО, т.к. температура вышла за допустимые пределы: 17.94ºC Dec 25 11:44:23 10.11.12.109 HTR-4C7525CE4B64: Активное оборудование ВЫКЛЮЧЕНО, т.к. температура достигла требуемого значения: 19.06ºC Dec 25 12:19:43 10.11.12.109 HTR-4C7525CE4B64: Активное оборудование ВКЛЮЧЕНО, т.к. температура вышла за допустимые пределы: 18.37ºC
Далее.
После того, как вы сохраните параметры подключения к WiFi, и устройство перезагрузится, оно попробует найти указанную сеть и подключиться к ней. Если авторизационные данные были введены без ошибок, и нужная WiFi сеть находится в пределах досягаемости, нагреватель подключится к ней, после чего запустит процедуру периодического получения данных от NTP-сервера в интернете (чтобы синхронизировать дату и время со «службами точного времени»). Параллельно процессор начнет периодически опрашивать датчики температуры и в числе прочего выводить их показания на своей веб-странице (в синем прямоугольнике с подписью «Температура»).
Примечания:
- Если процессор не сможет подключиться к беспроводной сети (либо сеть с указанным SSID отсутствует, либо введенный в настройках пароль неверен), то он повторно запустит свою встроенную точку доступа WiFi. Вы сможете снова подключиться к ней, и исправить ошибки ввода. Кстати, в меню настройки параметров WiFi в самом низу присутствует еще одна кнопка — «Поиск сетей Wi-Fi». Щелкнув ее, и обождав несколько секунд, вы получите всплывающее окно со списком всех беспроводных сетей, которые процессор видит вокруг себя, с указанием уровня сигнала каждой из них.
- Второй момент касается использования сразу двух термодатчиков. Один из них используется как «рабочий» — именно по его показаниям прибор и поддерживает требуемую температуру (например, воздуха в комнате). Второй — «аварийный». Он должен быть размещен так, чтобы контролировать температуру самого нагревательного элемента и вовремя сигнализировать о его аварии (например, перегреве ТЭН-а). На веб-страницу выводятся сразу обе температуры (через дробь) — сначала «рабочая», а потом — «аварийная».
Меню базовых настроек
Данное меню вызывается щелчком по соответствующей кнопке в верхнем ряду (на ней изображены отвертка и гаечный ключ, и она — вторая слева). Выглядит это меню следующим образом:
В этом меню вы можете настроить такие параметры:
- «Имя устройства» — это т.н. «удобочитаемое» имя, которое вы можете присвоить каждому из нагревателей, чтобы отличать их друг от друга, если их у вас много.
- «Режим работы» — определяет что именно будет делать устройство. Хоть я и называл устройство «нагревателем» на протяжении всей заметки, но в реальности эта система может работать в ТРЕХ РАЗНЫХ режимах: «Нагрев», «Охлаждение» и «Расписание»! В первом случае процессор подает управляющий сигнал на открытие симистора до тех пор, пока температура, измеряемая «рабочим» датчиком не превысит установленное значение. Во втором — пока не станет ниже установленного значения. В третьем режиме показания температуры полностью игнорируются, и прибор просто управляет подачей напряжения на нагрузку согласно настроенного вами расписания. Выберите желаемый режим из выпадающего списка.
- «Гистерезис (℃)» — это разница между температурами (порогами) включения и выключения питания исполнительного устройства. Например, вы настроили, что прибор работает в режиме «Нагрев» и должен поддерживать температуру 20℃, а «Гистерезис» установлен как 2℃. В результате нагреватель будет включен до тех пор, пока температура «рабочего» датчика температуры не достигнет 20℃, после чего ТЭН будет выключен. И будет оставаться выключенным до тех пор, пока температура не опустится ниже 18℃. Тогда питание ТЭНа будет снова включено.
- «Температура принуд. режима (℃)» — данный параметр нуждается в небольшом дополнительном разъяснении. У прибора имеется возможность принудительной подачи напряжения на нагрузку без учета параметров, указанных в расписании работы. Для этого нужно либо нажать кнопку S1, показанную на принципиальной схеме выше, либо по протоколу MQTT отправить на специальный канал прибора («forceon») специальное сообщение («1»). После этого прибор принудительно включит питание ТЭНа на 2 часа. И вот именно та температура, которую устройство будет поддерживать в течение этого «принудительного режима», как раз и настраивается вами в данном параметре.
- «Температура аварийн. предела (℃)» — в этом параметре вы указываете температуру аварии нагревателя. Как только показания «аварийного» термодатчика достигнут этой величины, питание ТЭНа будет автоматически выключено. После этого процессор полностью игнорирует настройки расписания и ожидает, пока температура «аварийного» термодатчика упадет НИЖЕ ПОЛОВИНЫ значения, установленного в данном параметре! Лишь после этого нормальная работа устройства будет возобновлена.
Меню настроек MQTT
MQTT (англ. message queuing telemetry transport) — это специальный протокол, разработанный для обмена сообщениями устройств телеметрии, различных датчиков и прочих подобных девайсов. Неплохо прижился в мире IoT. Для его использования нужен специальный сервер, называемый «брокером», через который и будет осуществляться обмен сообщениями между устройствами. Сервер может быть легко установлен и настроен на компьютере, работающем под управлением ОС Linux. Информации о том, как это сделать, в интернете тоже предостаточно, посему, данный вопрос я также оставлю вам на откуп google (или иного любимого поисковика). Для подключения к серверу («брокеру») устройства-клиенты должны знать его адрес, а также имя пользователя и пароль, которые они будут использовать для авторизации. Именно эти параметры и позволяет настроить меню «Настройки подключения к серверу MQTT» (средняя кнопка в вернем ряду). Если ее щелкнуть, откроется вот такое окно:
Нагреватель использует несколько разных «подписок» (называемых еще «топиками») для публикации своих данных, и еще одну — для получения извне команды принудительного включения ТЭНа. В топик «temperature» нагреватель публикует текущее значение «рабочей» температуры, в топик «powerstate» — состояние ТЭНа (1 — включен или 0 — выключен), а в топик «logrecords» дублируются все лог-сообщения. Команду принудительного включения (1) нагреватель, как уже было сказано ранее, ожидает в топике «forceon». Приложение MQTT-клиент может быть установлено на смартфон, и в итоге у вас появится возможность дистанционно контролировать состояние устройства, а также, принудительно включать его.
Кроме трех вышеупомянутых параметров для взаимодействия с MQTT-брокером, в это меню добавлено еще одно поле для настройки дополнительного параметра — «Адрес сервера для сбора данных». Если в этом параметре указать адрес (IP или имя домена) компьютера, на котором установлен вэб-сервер, то устройство будет периодически (раз в 10 минут) отсылать в него специальный http-запрос (по методу GET) с некоторыми своими данными. Пример запроса (каким его видит вэб-сервер):
GET /termo/parse.php?devid=HTR-4C7525CE3BC8&temp=19.21&humid=0 HTTP/1.1
Как видите, в этом запросе устройство сбрасывает три параметра: «devid» с идентификатором устройства, включающим в себя аббревиатуру «HTR» и мак-адрес его WiFi-модуля, «temp» с текущей температурой и «humid» с текущим состоянием ТЭНа (0 ли 1). Естественно, в веб-сервере (в папке termo) должен быть размещен специальный скрипт-обработчик (parse.php), который будет разбирать полученные данные и предпринимать с ними нужные вам действия. Например, сохранять их в базу и в последствии выводить графики наподобие такого:
Настройка расписания
Основную (центральную) часть веб-интерфейса устройства занимает расписание его работы. Вы уже видели его ранее (на рисунке «Веб-интерфейс управления нагревателем»). Расписание позволяет вам настроить параметры для 30 различных временных интервалов, в течение которых нагреватель должен будет поддерживать указанную вами температуру. В моей программе эти интервалы названы «Заданиями». Чтобы отредактировать выбранное «Задание», вы должны щелкнуть иконку ✐ («карандашик») в строке с ним. Откроется вот такое меню:
Полагаю, особых пояснений тут не требуется, все должно быть понятно итак. Вы устанавливаете день недели (выбираете из выпадающего списка), часы и минуты старта интервала («Задания»), день недели часы и минуты его окончания, и температуру, которую устройство должно будет поддерживать в течение данного интервала времени. Чтобы устройство выполняло данное «Задание», вам также необходимо поставить «птичку» в поле «Активно» (которое было добавлено для упрощения процедуры быстрого («на время») включения и выключения заданий без необходимости их редактирования или полного удаления). И еще несколько замечаний по поводу расписания:
- Если Старт и Стоп Задания установлены на одно и то же время одного и того же дня — Задание будет проигнорировано процессором (такой себе альтернативный способ сделать задание «не активным»).
- Если Стоп задания установлен раньше чем Старт, оно будет выполняться «через выходные». То есть, рассмотрим для примера ситуацию, в которой Старт Задания установлен как «Пятница, 10:00», а Стоп — как «Среда 18:00». В таком случае нагреватель начнет поддерживать установленную в Задании температуру в 10 часов в пятницу, и будет продолжать делать это до 18 часов следующей среды (т.е. — пт,сб,вс,пн,вт,ср).
- Если устройство работает в режиме «Расписание», температуру в задании можно не устанавливать (оставить значение «0.0», которое там указано по умолчанию). В данном режиме процессор игнорирует число, указанное в поле «Температура», и просто подает питание на ТЭН в течение всего интервала времени Задания.
- Проверка процессором Расписания осуществляется двояко. В случае, когда активного Задания нет, то выполняется поиск такого Задания, чье время Старта совпадает с текущим (точнее — такого, у которого уже наступило время Старта и еще не наступило время Стопа). Этот поиск осуществляется по списку Заданий расписания «сверху вниз» (1, 2, 3 … 30). То есть, если у вас будут два разных Задания, которые должны начать выполняться в одно и то же время одного и того же дня, запустится то из них, которое будет иметь меньший номер. И совсем другой алгоритм проверки расписания, если какое-то Задание уже выполняется. В таком случае процессор просто проверяет — не пришло ли уже время его закончить (текущее Задание).
Еще парочка объектов, по которым также можно щелкнуть мышью
- Если щелкнуть по слову «Питание» (в синем прямоугольнике), появится всплывающее окно с информацией о том, сколько всего времени ТЭН устройства находился во включенном состоянии.
- Если щелкнуть строку с моим копирайтом, то будет предложено сбросить вышеуказанный «счетчик общего времени наработки».
Ошибки
В случае возникновения ошибок в работе, устройство выводит на веб-страницу информацию об этом:
Как вы можете видеть на скриншоте, сообщение об ошибке выводится вместо информации о текущем режиме работы и для привлечения дополнительного внимания выделяется красным цветом. Фактически, после слова «ОШИБКА» выводится в бинарном виде содержимое регистра флагов ошибок (errors_flags), в котором каждый бит («единица») соответствует какой-то строго определенной ошибке. Чтобы не запоминать их все наизусть, веб-интерфейс позволяет вывести справочную страницу, на которой указано, ошибку чего именно означает та или иная «единица». Для этого достаточно просто щелкнуть по красной строке со словом «ОШИБКА» и списком нулей/единиц. Справка откроется в новой вкладке браузера.