![image](https://habrastorage.org/getpro/geektimes/post_images/3a1/a88/611/3a1a8861166cf7da5704db22042179b4.jpg)
Почти два года прошло с изготовления контроллера управления влажностью для ванной комнаты. Все это время контроллер служил верой правдой без глюков и зависаний, как и положено хорошему устройству и даже обзавелся с легкой руки моей супруги гламурным корпусом ручной работы.
![image](https://habrastorage.org/getpro/geektimes/post_images/c86/ff9/d8d/c86ff9d8d569c42c9d7cf7569b012272.jpg)
Но технический прогресс неумолимо бежит вперед и новые веяния опять не давали мне покоя. Давно вынашивал идею реализации концепции умного дома на WiFi модулях ESP8266. Некоторое время экспериментировал с этими модулями и теперь решил свой «умный дом» на них перевезти.
Основной целью проекта поставил реализацию новых возможностей, которые в дальнейшем буду применять в других устройствах.
Итак, что мне даст модернизация контроллера вентилятора на ESP8266?
Новые возможности
- Просмотр всех показателей по WiFi с компьютера/планшета/телефона.
- Обработка дополнительных параметров — время наработки вентилятора и время горения лампы в ванной комнате.
- Управление вентилятором по WiFi с компьютера/планшета/телефона.
- Настройка работы контроллера по WiFi с сохранением значений в энергонезависимую память.
- Периодическая запись значений всех показателей на сервер в интернете.
- Ну и, раз все равно есть интернет, отображение времени с синхронизацией по NTP протоколу.
Все эти функции дают возможность анализа работы контроллера и, в дальнейшем, оптимизации параметров управляющего алгоритма. Ну и данный контроллер войдет в общую систему умного дома с мониторингом параметров среды ванной комнаты.
![image](https://habrastorage.org/getpro/geektimes/post_images/0aa/4eb/9af/0aa4eb9aff0949f62d03278d63b78888.jpg)
Схема не сильно изменилась от предыдущей версии:
- 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
![image](https://habrastorage.org/getpro/geektimes/post_images/5c1/97c/326/5c197c32676bae632c6c787660684342.jpg)
Сборка контроллера
Этот контроллер — прототип для будущих устройств на ESP8266, поэтому монтаж сделал на макетной плате.
![image](https://habrastorage.org/getpro/geektimes/post_images/0f4/7e5/506/0f47e5506e9cb91f6fd3f81687b7c9db.jpg)
Светофильтр под индикатор изготавливаю из папки-уголка для бумаг, купленной в магазине канцтоваров. Прозрачное окно для фоторезистора — защитная пленочка оставшаяся от какого-то телефона (заказывал когда-то с запасом, теперь валяются)
![image](https://habrastorage.org/getpro/geektimes/post_images/eb6/241/e2d/eb6241e2d359c96633d1a1ab43ed5435.jpg)
А это мой старый контроллер, проработавший в ванной два года
![image](https://habrastorage.org/getpro/geektimes/post_images/0ed/70f/3dd/0ed70f3dd2b9ecb5c0bc5211d99cee9a.jpg)
При отладке обнаружился технологический дефект — фотодиод за окошечком в корпусе получал слишком мало света и без усилителя не срабатывал при зажигании лампы в ванной комнате, пришлось его вывести наружу в сторону лампы
![image](https://habrastorage.org/getpro/geektimes/post_images/7dc/b61/e7e/7dcb61e7ec707b9669015f42bb828b5a.jpg)
![image](https://habrastorage.org/getpro/geektimes/post_images/4be/f32/079/4bef32079eac0bf243f9310fbd7f7646.jpg)
Теперь расскажу об особенностях программы, алгоритмах управления и настройках этого контроллера.
ESP8266, в отличие от Atmega328, на которой была реализована предыдущая версия, имеет гораздо больше памяти (ОЗУ, ПЗУ. EEPROM), что позволило вкупе со встроенным WiFi реализовать функции встроенного WEB-сервера, не экономя память для текстовых строк.
А вот с GPIO у ESP8266 довольно плоховато, поэтому, такая роскошь, как управления семисегментным индикатором напрямую ему не доступна. Поэтому и выбран индикатор на микросхеме TM1637, требующий для подключения всего два вывода.
Среда разработки
Я достаточно наигрался с различными прошивками ESP8266 позволяющими писать программы на встроенных интерпретаторах LUA, JC и вообще программировать через WEB. Пробовал писать на одном SDK. Остановился на компромиссном варианте — программировании в Arduino IDE.
Довольно простая установка, программирования и огромное количество готовых библиотек, которые, в большинстве своем, работают на ESP-шке. Эта среда позволила использовать много старого кода, обеспечивающего основную логику работы контроллера управления вентилятором сохранилось с предыдущей версии.
В основном интересно было перенести хорошо зарекомендовавший себя алгоритм, реализующий конечный детерменированный автомат состояний, описанный в таблице переходов состояний:
![image](https://habrastorage.org/getpro/geektimes/post_images/0b4/084/954/0b4084954c75e341cc80122c1b48c6b9.jpg)
Подошли без проблем и ардуиновские библиотеки 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-сервера показывает основные параметры контроллера и позволяет вручную включить/выключить контроллер (аналог нажатия кнопки ручного управления)
![image](https://habrastorage.org/getpro/geektimes/post_images/cf8/ebe/af6/cf8ebeaf6be714e3ef08094effc831c0.jpg)
Здесь же можно перейти на страницу сетевых настроек
![image](https://habrastorage.org/getpro/geektimes/post_images/798/18e/6d0/79818e6d0e5302d38efcdde24130753b.jpg)
и страницу настроек алгоритма работы контроллера
![image](https://habrastorage.org/getpro/geektimes/post_images/b50/f14/58b/b50f1458b47bfae1545c36fd2928c9fa.jpg)
С этих двух страничек можно выполнить перезагрузку контроллера и сброс всех настроек «по умолчанию».
«Наводить красоту» на интерфейс я еще планирую в будущем, когда концепция умного дома на WiFi более менее устаканится у меня в голове.
Еще одна функция, реализованная в этой программе — часы реального времени, синхронизирующиеся по NTP протоколу в интернете. (Файлы WC_NTP.h и WC_NTP.cpp)
Описание основного алгоритма описывать не буду, логика работы себя хорошо зарекомендовала и осталось прежней, почитать про нее можно в предыдущей статье. Основные изменения коснулись дисплея. Хочу обратить внимания на одну «фичу» — функцию DisplaySpecialChar(), которая позволяет по битовой маске вывести любой символ, который можно придумать для отображения на семисегментном индикаторе. Я придумал вот такой символ «процентов» в отображении влажности
![image](https://habrastorage.org/getpro/geektimes/post_images/de2/393/0a5/de23930a598bc88b2f76712ebaa4219a.jpg)
и символ «градусов» при отображении температуры
![image](https://habrastorage.org/getpro/geektimes/post_images/62d/330/3aa/62d3303aa4f387f9a41326d0926529d2.jpg)
Биты в битовой маске соответствуют сегментам индикатора.
Ну и последняя из новых функций — сохранение параметров на сервер в интернете для отображения и последующего анализа. Сохраняются значения влажности, температуры, аналогового порта с фоторезистором для подстройки порога срабатывания освещения, время работы вентилятора, время горения света и UPTIME-время работы контроллера от последней перезагрузки.
Запись на сервер происходит в двух режимах. С большей периодичностью записываются параметры, когда в ванной «что-то происходит», в это время либо горит свет, либо работает вентилятор. Все таймауты настраиваются через WEB-интерфейс.
Сохраняются данные на мой сервер в интернете. Адрес сервера можно настроить, а вот формат записи пока зашит в программу. Опять до лучших времен устаканивании концепции ))). Сейчас параметры сохраняются простейших PHP-скриптом в таблицу с простейшей структурой.
![image](https://habrastorage.org/getpro/geektimes/post_images/ead/95d/d8e/ead95dd8e903225e298e4dfa1dcbfe89.jpg)
Довольно просто перенастроить сохранения параметров на тот же «народный мониторинг». Лично меня это сервер не устраивает ограничениями в периодичности сохранения данных и глубине архива.
Оптимизация настроек контроллера
После «опытной эксплуатации» можно определить, правильно ли установлены пороги срабатывания освещения и влажности, а также таймауты различных событий. В прошлой реализации я установил время срабатывания 20 минут, сидя в ванной с секундомером. Понаблюдав за графиком параметров во время нескольких принятий душа я увидел следующее:
![image](https://habrastorage.org/getpro/geektimes/post_images/25b/d3b/aed/25bd3baed056cad736524d82f429043b.jpg)
- Влажность в зимнее время меняется на 35-40%
- Время нормализации влажности при естественной вентиляции 20-25 минут
- Время нормализации влажности с работающим вентилятором 10-12 мин
- Вентилятор повышает эффективность проветривания вдвое
Исходя из этого можно смело снизить время работы вентилятора до 12 мин, тем самым продлив время его службы и чуточку сэкономив электроэнергию. Подобный анализ можно провести для других времен года, когда влажность в квартире совсем другая.
Теперь, после проведения анализа можно увеличить период записи параметров на сервер.
Выводы
- Контроллер на ESP8266 работает стабильно, функции свои выполняет.
- Функциональность его расширилась, теперь им легко управлять и он нормально интегрируется в систему Умного дома
- Некоторые вещи требуют доработки, например, WEB-интерфейс, авторизация доступа, серверная часть и некоторые неточности в расчете времени работы вентилятора и света. Может быть выявятся и другие хотелки по улучшению.
- Пилотный проект по Умному дому на WiFi можно признать успешным ;)
Скетч можно скачать здесь. Буду очень признателен, если сообщите о найденных ошибках.
Скетч контроллера вентилятора на WiFi
Затраченное на проект время — два выходных дня
P.S. Сразу отвечаю на вопрос, зачем так сложно? Можно посадить параллельно выключателю или на таймер?
— Да можно. Но включение по таймеру и свету меня не устроили. К тому же это хобби, реализация некоторых идей, который применяются в других проектах.
Хаброхранилище опять глючило, поэтому картинки с моего блога. Там же можно посмотреть про мои наработки по умному дому