Почти два года прошло с изготовления контроллера управления влажностью для ванной комнаты. Все это время контроллер служил верой правдой без глюков и зависаний, как и положено хорошему устройству и даже обзавелся с легкой руки моей супруги гламурным корпусом ручной работы.
Но технический прогресс неумолимо бежит вперед и новые веяния опять не давали мне покоя. Давно вынашивал идею реализации концепции умного дома на WiFi модулях ESP8266. Некоторое время экспериментировал с этими модулями и теперь решил свой «умный дом» на них перевезти.
Основной целью проекта поставил реализацию новых возможностей, которые в дальнейшем буду применять в других устройствах.
Итак, что мне даст модернизация контроллера вентилятора на ESP8266?
Новые возможности
- Просмотр всех показателей по WiFi с компьютера/планшета/телефона.
- Обработка дополнительных параметров — время наработки вентилятора и время горения лампы в ванной комнате.
- Управление вентилятором по WiFi с компьютера/планшета/телефона.
- Настройка работы контроллера по WiFi с сохранением значений в энергонезависимую память.
- Периодическая запись значений всех показателей на сервер в интернете.
- Ну и, раз все равно есть интернет, отображение времени с синхронизацией по NTP протоколу.
Все эти функции дают возможность анализа работы контроллера и, в дальнейшем, оптимизации параметров управляющего алгоритма. Ну и данный контроллер войдет в общую систему умного дома с мониторингом параметров среды ванной комнаты.
Схема не сильно изменилась от предыдущей версии:
- Atmega328 заменена на ESP8266
- Семисегментный индикатор заменен готовый модуль дисплея на TN1637
- Симистор с оптопарой заменены твердотельным реле (то же самое, но в корпусе).
Все главные отличия в программе контроллера.
Перечень компонентов
- Модуль ESP8266 ESP07 с платой адаптером ~ $2.3
- Четырехразрядный семисегментный дисплей на микросхеме TM1637 с I2C подключением ~ $1
- Твердотельное реле OMRON G3MB-202P ~ $1
- Блок питания 220В/3.3В 600мА ~ $2.2
- Датчик температуры и влажности (точность низкая, но для моих задач достаточная) DHT11 ~ $0.7
- Приборный пластиковый корпус 110х73х34 ~ $1
- Фоторезистор, просто резисторы, макетка и провода
Итого около $9
Все детали кроме корпуса и блока питания куплена на aliexpress.com. Корпуса и БП по адекватным ценам заказываю с taobao.com
Сборка контроллера
Этот контроллер — прототип для будущих устройств на ESP8266, поэтому монтаж сделал на макетной плате.
Светофильтр под индикатор изготавливаю из папки-уголка для бумаг, купленной в магазине канцтоваров. Прозрачное окно для фоторезистора — защитная пленочка оставшаяся от какого-то телефона (заказывал когда-то с запасом, теперь валяются)
А это мой старый контроллер, проработавший в ванной два года
При отладке обнаружился технологический дефект — фотодиод за окошечком в корпусе получал слишком мало света и без усилителя не срабатывал при зажигании лампы в ванной комнате, пришлось его вывести наружу в сторону лампы
Теперь расскажу об особенностях программы, алгоритмах управления и настройках этого контроллера.
ESP8266, в отличие от Atmega328, на которой была реализована предыдущая версия, имеет гораздо больше памяти (ОЗУ, ПЗУ. EEPROM), что позволило вкупе со встроенным WiFi реализовать функции встроенного WEB-сервера, не экономя память для текстовых строк.
А вот с GPIO у ESP8266 довольно плоховато, поэтому, такая роскошь, как управления семисегментным индикатором напрямую ему не доступна. Поэтому и выбран индикатор на микросхеме TM1637, требующий для подключения всего два вывода.
Среда разработки
Я достаточно наигрался с различными прошивками ESP8266 позволяющими писать программы на встроенных интерпретаторах LUA, JC и вообще программировать через WEB. Пробовал писать на одном SDK. Остановился на компромиссном варианте — программировании в Arduino IDE.
Довольно простая установка, программирования и огромное количество готовых библиотек, которые, в большинстве своем, работают на ESP-шке. Эта среда позволила использовать много старого кода, обеспечивающего основную логику работы контроллера управления вентилятором сохранилось с предыдущей версии.
В основном интересно было перенести хорошо зарекомендовавший себя алгоритм, реализующий конечный детерменированный автомат состояний, описанный в таблице переходов состояний:
Подошли без проблем и ардуиновские библиотеки DHT для работы с датчиками влажности/температуры от Adafruit и для работы с индикатором на TM1637 DigitalTube.
Подробности использования Arduino IDE для программирования ESP8266 хорошо описаны в этой статье
Реализация новых функций
Очень неудобно делать WiFi контроллеры, в которых зашиваются параметры подключения к сети. Представляете, во что выльется смена имени точки доступа или пароля при наличии десятка таких контроллеров дома?
Поэтому в данном программе реализованы функции сохранения параметров подключения в энергонезависимую память EEPROM и настройка их по сети. Структура для сохранения параметров, а также чтение и запись ее реализованы в файлах WC_EEPROM.h и WC_EEPROM.cpp моего проекта. Верификация чтения и записи производится при помощи вычисления контрольной суммы конфигурации и сравнения ее с записанной в EEPROM.
Кроме конфигурации сети в память сохраняются также все таймауты и прочие параметры алгоритма управления вентилятора, что позволяет оптимизировать и настраивать данный контроллер прямо «по воздуху».
Отображение режимов работы, настройка конфигураций контроллера, а также непосредственное управление вентилятором реализовано при помощи встроенного WEB-сервера (фалы WC_HTTP.h и WC_НTTP.cpp)
Алгоритм настройки точки доступа следующий:
Если ESP-шка не смогла подключиться к прописанной в конфигурации EEPROM точке доступа, то она поднимает свою точку доступа и по адресу 192.168.4.1, позволяет сконфигурировать.
Ну а если подключилась, то работает в штатном режиме.
Главная страница WEB-сервера показывает основные параметры контроллера и позволяет вручную включить/выключить контроллер (аналог нажатия кнопки ручного управления)
Здесь же можно перейти на страницу сетевых настроек
и страницу настроек алгоритма работы контроллера
С этих двух страничек можно выполнить перезагрузку контроллера и сброс всех настроек «по умолчанию».
«Наводить красоту» на интерфейс я еще планирую в будущем, когда концепция умного дома на WiFi более менее устаканится у меня в голове.
Еще одна функция, реализованная в этой программе — часы реального времени, синхронизирующиеся по NTP протоколу в интернете. (Файлы WC_NTP.h и WC_NTP.cpp)
Описание основного алгоритма описывать не буду, логика работы себя хорошо зарекомендовала и осталось прежней, почитать про нее можно в предыдущей статье. Основные изменения коснулись дисплея. Хочу обратить внимания на одну «фичу» — функцию DisplaySpecialChar(), которая позволяет по битовой маске вывести любой символ, который можно придумать для отображения на семисегментном индикаторе. Я придумал вот такой символ «процентов» в отображении влажности
и символ «градусов» при отображении температуры
Биты в битовой маске соответствуют сегментам индикатора.
Ну и последняя из новых функций — сохранение параметров на сервер в интернете для отображения и последующего анализа. Сохраняются значения влажности, температуры, аналогового порта с фоторезистором для подстройки порога срабатывания освещения, время работы вентилятора, время горения света и UPTIME-время работы контроллера от последней перезагрузки.
Запись на сервер происходит в двух режимах. С большей периодичностью записываются параметры, когда в ванной «что-то происходит», в это время либо горит свет, либо работает вентилятор. Все таймауты настраиваются через WEB-интерфейс.
Сохраняются данные на мой сервер в интернете. Адрес сервера можно настроить, а вот формат записи пока зашит в программу. Опять до лучших времен устаканивании концепции ))). Сейчас параметры сохраняются простейших PHP-скриптом в таблицу с простейшей структурой.
Довольно просто перенастроить сохранения параметров на тот же «народный мониторинг». Лично меня это сервер не устраивает ограничениями в периодичности сохранения данных и глубине архива.
Оптимизация настроек контроллера
После «опытной эксплуатации» можно определить, правильно ли установлены пороги срабатывания освещения и влажности, а также таймауты различных событий. В прошлой реализации я установил время срабатывания 20 минут, сидя в ванной с секундомером. Понаблюдав за графиком параметров во время нескольких принятий душа я увидел следующее:
- Влажность в зимнее время меняется на 35-40%
- Время нормализации влажности при естественной вентиляции 20-25 минут
- Время нормализации влажности с работающим вентилятором 10-12 мин
- Вентилятор повышает эффективность проветривания вдвое
Исходя из этого можно смело снизить время работы вентилятора до 12 мин, тем самым продлив время его службы и чуточку сэкономив электроэнергию. Подобный анализ можно провести для других времен года, когда влажность в квартире совсем другая.
Теперь, после проведения анализа можно увеличить период записи параметров на сервер.
Выводы
- Контроллер на ESP8266 работает стабильно, функции свои выполняет.
- Функциональность его расширилась, теперь им легко управлять и он нормально интегрируется в систему Умного дома
- Некоторые вещи требуют доработки, например, WEB-интерфейс, авторизация доступа, серверная часть и некоторые неточности в расчете времени работы вентилятора и света. Может быть выявятся и другие хотелки по улучшению.
- Пилотный проект по Умному дому на WiFi можно признать успешным ;)
Скетч можно скачать здесь. Буду очень признателен, если сообщите о найденных ошибках.
Скетч контроллера вентилятора на WiFi
Затраченное на проект время — два выходных дня
P.S. Сразу отвечаю на вопрос, зачем так сложно? Можно посадить параллельно выключателю или на таймер?
— Да можно. Но включение по таймеру и свету меня не устроили. К тому же это хобби, реализация некоторых идей, который применяются в других проектах.
Хаброхранилище опять глючило, поэтому картинки с моего блога. Там же можно посмотреть про мои наработки по умному дому
instalator
У меня тоже организовано управление вентилятор по уровню влажности. Датчик поставил на вентиляторе, контроллер установленный в ванной передает данные влажности на сервер УД, который уже отдает команды на включение\выключение вентилятора, при достижении определенных порогов влажности.
sav13
Передается на сервер по воздуху?
instalator
Через провод по MQTT
Dmitry_Th
Расположив датчик далеко от вентилятора, достигнем более длительных интервалов работы, без «дребезга», уменьшим частоту паразитной обратной связи. Как результат — более равномерная работа вентилятора. Т.е. я бы датчик разместил там, где после душа сыро, а должно быть сухо, например, у шкафчика с порошками.
sav13
У меня и так датчик с контроллером на противоположной стене.
И еще, алгоритм не работает как PID-регулятор, а срабатывает на скорость изменения влажности
DjOnline
Так у Silent Design есть же вентиляторы со встроенным датчиком влажности. Зачем было городить огород? У меня такой стоит, всё прекрасно работает. Если душ принять быстро, то влажность не успевает сильно повыситься, и вентилятор не включается. Если долгий душ или ванна — то сам включается.
sav13
Во первых, это хобби, что то делать своими руками
Во вторых, из экономических соображений. Ваш вентилятор стоит больше 10 крублей
В в третьих, мне и моим домашним не нравится, когда вентилятор включается при принятии душа ибо дует )))
instalator
У меня в каждой комнате стоят датчики. Логика от встроенного датчика не гибкая. У меня же можно установить любой порог и любой алгоритм включения\отключения вентилятора.
22sobaki
Еще один плюс по сравнению с подключением параллельно освещению: уменьшение количества пусков вентилятора, что также благотворно скажется на его долговечности.
sav13
Мои домашние очень не любят принимать душ при работающем вентиляторе ибо «дует им»
Поэтому параллельно свету, даже по таймеру — для меня было плохо
Teemon
только я бы хотел уточнить: вроде бы считается, что нормальная влажность = 50-60%, для ванной — может быть даже еще и повыше.
Таким образом, у вас и так воздух «суховат» и только кое-как достигает нормальных значений? Либо барахлит датчик влажности?
в любом случае нужно же отталкиваться от требуемых значений, а не тех, которые были до пользования ванной.
sav13
Летом влажность в квартире выше и ванной тоже.
В любом случае я не отталкиваюсь от абсолютных показателей, а организовываю работу по скорости изменения. При таком алгоритме даже если датчик глючит — вентилятор все равно включается нормально
FGV
а почему SCL и SDA не подтянуты к питанию через резисторы?
и еще вопрос, насколько стабильно работает esp?
sav13
Когда экспериментировал с ESP, обнаружил — перезагрузка контроллера вызывается либо переполнением памяти, либо долгим выполнением какой-то функции, мешающей работать WiFi по таймеру. Тогда срабатывает его WDT.
В данной реализации все отладил. Поэтому после последней прошивки аптайм неделя, полет нормальный
KamAdm
А можно подробнее про зависание ESP и борьбу с ними. О каком переполнении памяти идет речь? Что за функции приводят зависанию?
sav13
Переполнение памяти происходит в основном из за страшной для микроконтроллера переменной типа String. Там ведь память динамически выделяется.
Когда строка, например, для выдачи страницы, формируется сперва в памяти, а потом одним оператором выводится.
Борьба же в основном ведется с внутренним таймером WDT, срабатывающим, я так понял при невозможности выполнить базовые действия контроллера (чаще всего WiFi функции), связанные с обработкой моего кода.
Причем, отключить данный таймер у меня так и не получилось.
Например, 100% срабатывание данного таймера вызывает попытка выгрузить из контроллера по WEB интерфейсу файл размером более 200к (была у меня мысль логи на карточку писать и потом их выгружать)
Во многих местах спасают дополнительные задержки 100 и более миллисекунд, позволяющие эти самые WiFi функции отработать и успокоить WDT
KamAdm
Благодарю.
bazis13
Повставлял ардуин где надо и не надо, но в ванной вентиляция сделана на двух 120мм компьютерных вентиляторах, работающих круглосуточно. Шума почти не слышно, но с влажностью справляются.
SilverHorse
Сначала не мог понять, в чем проблема с графиком, потом понял, что цвета в легенде и комментарии перепутаны (синий по легенде принадлежит безвентиляторному, а в комментарии наоборот).
kmaximv
sav13, на счет WEB-интерфейса, посмотрите как сделано здесь
Поддерживает обновление данных по Ajax.
Ещё можно добавить обновление прошивки через WEB-интерфейс.
Вот здесь еще очень интересный вариант создания веб-интерфейса на темплейтах ссылка
kmaximv
Ссылки вырезало
github.com/kmaximv/Wi-Fi-Sensor
Вот здесь еще очень интересный вариант создания веб-интерфейса на темплейтах github.com/luc-github/ESP8266
sav13
Обновление прошивки, на сколько я разобрался, получается только на модулях с 4Мб флэшем. Или маленькие скетчики заливать. У меня партия ESP07 завалялась.
kmaximv
А DHT11 нормально с ESP работает? Пробовал подключать DHT22, данные отдавал через раз, хотя с ардуинкой работал нормально.
sav13
С DHT никаких проблем. Что с 11, что с 22. В ранних адавуйтовских библиотекаках там нужно было тамаут подбирать к тактовой частоте. У ESP8266 — 15.
В последних версиях этот параметр автонастраивающийся по микросекундам
Может библиотеку сменить/обновить?
Их много разных
kmaximv
Хорошо, попробую. А по УД к OpenHab не присматривались?
sav13
Присматриваюсь.
К разным присматриваюсь.
Сейчас еще несколько проектов реализую дома — определюсь.
Супруга заказала контроль влажности растений.
Будут сенсоры на Меге 8 с радио на батарейке в каждом горшке.
И ESP-шка все это принимать и обрабатывать
kmaximv
О, я как раз такой проект задумал, с контролем влажности, автоматическим поливом и освещением. Какие сенсоры влажности собираетесь использовать?
sav13
Луженые, а в, перспективе, грифельные электроды.
Какие там еще сенсоры? Сопротивление почвы на аналоговый вход через делитель или измерительный мостик.
Питание мостика от вывода микроконтроллера, чтобы питание с батарейки не кушал в режиме сна
Еще хочу туда фоторезистор поставить и терморезистор (или далласовский датчик температуры)
Будет выдавать информацию по количеству света для каждого растения и температуре.
В общем, микроклимат целиком.
Ну и фитолампы с управлением по тому же радио.
Останется подобрать оптимальные режимы для каждого растения
kmaximv
Тоже выбрал графитовые стержни для сенсоров. Буду с интересом следить за вашим проектом.
Aquahawk
Прочтите это: oldoctober.com/ru/humidity_sensor
sav13
Купил супруге на АЛИ такой вот измеритель
Там как раз похоже ЭДС почвы и мерится
Электрод угольный и медный
Работает уже года 3. Только лучше в почве не оставлять его.
Показания стабильны и с сухостью почвы коррелируют нормально
А переменный ток подавать на измеритель, это просто. Можно с ШИМ выхода.
Aquahawk
У меня на esp8266 приточка управляемая от co2, и в планах увлажнение и обогрев. Я наоборот влажность поднимаю и комфортно для меня не менее 40 процентов, а то и 50.
sav13
Влажность должна во всей квартире быть 40-50
Летом так и происходит
А ванной получается 60-70 после принятия душа. Грибок будет на потолке развиваться
По CO2 хорошо кухню проветривать
CO2 + датчик дыма (прозрачности воздуха) + датчик газа
Тоже планирую сделать такой
Aquahawk
У вас на графиках падение влажности до 30%. Значит в квартире не выше, воздух то с квартиры зайдёт.
По CO2. Я дома мало готовлю. У меня приточка в комнате, где рабочее место и спальня. я держу не не выше 600-800 ppm. Для этого всегда когда я в комнате работает приточка. Минут через 15 включается по co2 просто от того что я пришёл. И 10 литров испарения в сутки еле еле справляются. Если холодно на улице то не справляются.
safari2012
У вас по тексту везде ESP8266, а в конце статьи таргет ссылка на ESP8255. Такой чип тоже есть в природе, но вроде как мало кто использует…
sav13
Очепятка.
Сейчас разве что ESP32 дождаться с нормальным SDK
vworld
мне вот интересно… рассыпуху всех элементов возможно поместить в стандартные круглые установочные коробки для розеток в бетонных или кирпичных стенах (выпускаются следующих размеров: диаметром 60, 68, 70 мм и глубиной от 40 до 70 мм)
sav13
Я размещал во внешней розетке.
Думаю, со встраиваемыми розетками и коробками под них тоже не должно быть проблем
vau
У Вас на схеме R2 к S2 не с той стороны подключен
sav13
Спасибо. Поправил