Домашняя метеостанция на esp8266
С появлением esp8266 пару лет назад, у меня возникла мысль создать на базе этого контроллера что-нибудь полезное, что будет нужным в доме, и чем будет удобно пользоваться всем. Возможность подключения по wi-fi, небольшие габариты, достаточное количество контактов ввода-вывода, легкость программирования сделали возможным собирать на базе этой платы множество устройств, и одно из них — система мониторинга погоды.
Изначальные требования к системе:
- Удаленный просмотр измеряемых данных
- Возможность удаленного управления устройством
- Наличие дисплея для просмотра данных «прямо сейчас»
- Простота подключения и питания (питание от обычной USB-зарядки)
- Передача данных на домашний сервер для сбора статистики, просмотра графиков и т.п.
- Возможность увеличения количества подключенных сенсоров
- Возможность использования множества метеодатчиков одновременно
Для начала решил отыскать существующие системы, которые можно было бы взять в качестве прототипа. Нашлась одна, подходящая по возможностям — wifi-iot.com, но она была отвергнута из-за закрытого кода и необходимости покупки лицензии для активации полного списка возможностей. Поэтому решил создать свой велосипед.
Для реализации надо было воплотить в жизнь железячную и программную части.
На Ебее были закуплены следующие компоненты:
- NodeMCU board — 350р.
- LCD TFT Display 320х240 на базе чипа ILI9340C — 370р.
- Датчик DHT22 — 130р.
- Датчик BMP180 — 115р.
- Макетная плата 5х7 см — 30р. (при покупке 5 штук)
- Плата с micro USB разъемом — 10р.
На местном рынке был куплен корпус — Gianta G403 за 70р.
Итого — 1000р на компоненты (цены на момент публикации, по курсу — 15 вечнозеленых).
Для программной части была выбрана элементарная связка PHP+MySQL, развернутая на домашнем сервере на базе малинки. Преимущество перед облачными сервисами — при пропаже интернета система продолжает успешно работать и не накрывается медным тазом. Минус — необходимость написать серверную часть системы для хранения и обработки данных, но это было интересно сделать и самому.
Для программирования была выбрана среда Arduino IDE, с подключенным модулем для разработки на esp8266. Как это сделать — подробно описано тут — github.com/esp8266/Arduino
Поначалу было желание попробовать писать все на lua, ипользуя прошивку nodemcu, но быстро отказался от этой идеи, т.к. во время заливки скетчей постоянно вываливались ошибки о недостатке памяти и т.п.
Для обмена данными между метеостанцией и малинкой был выбран формат данных JSON.
Схемы подключения сенсоров к модулю — были использованы стандартные, библиотеки можно найти здесь:
Так же понадобилась следующая библиотека — github.com/bblanchon/ArduinoJson
Помимо вышеназванных к системе можно подключить и настроить полученные данных со следующих сенсоров:
- Модуль измерения освещенности — BH1750 — github.com/kmaximv/BH1750
- Модуль реального времени — RTC DS1307 — github.com/adafruit/RTClib
- Цифровой датчик влажности и температуры — SHT21 — github.com/enjoyneering/HTU21D
Сейчас жду посылку с датчиком CO2 на базе MH-Z19, чтобы мониторить наличие углекислого газа в воздухе. Как только придет — соберу модуль с ним, чтобы расширить перечень измеряемых параметров погоды в доме.
Итак, после получения всех посылок, множества итераций по отладке кода и сборок на макетке, пришло время собрать готовое устройство.
В корпусе дремелем было проделано отверстие для экрана:
После этого внутри был закреплен сам экран, бутерброд из платы с модулем, и датчики. Так же не была забыта кнопка сброса 🙂
В торцевых пластинах корпуса были проделаны отверстия для вентиляции сенсоров, и для разъема питания. После подключения — информация на экране:
В прошивке модуля реализовано удаленное управление — поднят веб-сервер, используя который можно произвести начальную настройку (указать используемую wifi-сеть, указать используемые датчики, настроить модуль реального времени, посмотреть данные с подключенных сенсоров, перезагрузить модуль). Когда писал странички, уделил внимание тому, что настройки может производиться с мобильного — поэтому Привет, адаптивный дизайн! 🙂
Никаких внешних зависимостей встроенные странички не имеют, все стили и скрипты — хранятся в памяти модулей.
Для просмотра списка подключенных модулей, удобного просмотра получаемых данных, просмотра графиков — был написан небольшой сайтик, развернутый на малинке.
Что планируется реализовать еще:
- Синхронизация времени по NTP
- Накопление данных в модуле в случае потери сети
- Реализация авторизации на сервере просмотра данных
- Привязка датчиков к опреденным пользователям
- Настройка данных, отображаемых на экране датчика
- Создание outdoor-версии датчика (буду рад советам, как это лучше сделать)
- Возможность управления реле
- Возможность получения данных с датчиков открытия окон-дверей (например герконов)
- Введение поправок к получаемым данным для учета внутрикорпусного размещения сенсоров
Буду раз любой конструктивной критике и комментариям.
Для всех библиотек к модулям, подключаемых по 1-wire шине, требуется заменить инциализацию wire-протокола с Wire.begin() на Wire.begin(0, 2), т.к. стандартные пины заняты экраном.