Включаем отопление на даче удаленно
Начитавшись чужих статей по умному дому я тоже захотел сделать свою дачу немного умней. Начал с того, что собрал на iboard и ds18b20 температурный датчик и всегда мог узнать какая температура на даче и даже получить СМС, если она опустилась ниже 5 градусов (могут замерзнуть трубы) или поднялась выше 30 (либо посреди зимы настало лето, либо у меня сейчас будет пожар). Но от того, что я знал какой дубарь сейчас на даче теплее мне не становилось. И следующим шагом я решил сделать возможность удаленно включать насос теплых полов, чтобы, утром нажав кнопку на телефоне обеспечивать по приезду на дачу комфортную температуру в доме. Можно было бы добавить к iboard реле, но, во-первых, эзернета у меня в котельной нет, во-вторых хотелось попробовать чего-то проще и желательно дешевле (с iboard я потратил несколько вечеров на программирование, да и бюджет вышел не самый низкий).
Полазив по интернетам выбрал самое простое, на мой взгляд, решение - Sonoff. В общем-то эта штука умеет все что мне надо и осталось только подключить к ее входу вилку, а к выходу – розетку. Установив на телефон приложение EWeLink из Play маркета я подружил его со своим Sonoff и имел возможность нажимая на кнопку включать-выключать нагрузку.
На этом рассказ можно было бы закончить - одно недорогое устройство полностью решило мою задачу и можно было бы приниматься за следующие шаги по автоматизации, если бы не одно НО: приложение управляет устройством не напрямую и даже не через локальную сеть, а через облачный сервис производителя и если у них какие-то проблемы с серверами, то управлять устройством уже не получится. Сначала я решил закрыть на это глаза, но однажды, собираясь уезжать с дачи, я обнаружил в приложении надпись Network unavailable. Попытки выключить теплый пол ни к чему не привели. Можно было бы конечно поехать домой и попробовать выключить мой Sonoff позже, когда они починят свое облако, но что будет если у них серьезные проблемы и сервис не поднимется в течение нескольких дней? За неделю газу нагорит на несколько таких Sooff-ов, не ехать же специально на дачу среди недели, чтобы выключить то, что должно было выключаться удаленно? Пришлось отключить устройство и забрать его домой на переделку. Попробуем отказаться от сторонних сервисов, а заодно попробуем немного улучшить функционал добавив к нему датчик влажности и температуры, чтобы знать какая температура в котельной.
Начал я с разбора модуля и подпайки разъемов для прошивки. Поскольку это проект с открытым исходным кодом (по крайней мере аппаратная часть, на счет программной не уверен), то есть и принципиальная схема, по которой можно разобраться какие выводы куда выведены. Пять отверстий поперек платы это интерфейс для перепрошивки модуля (обведен на фото красным овалом) и свободный GPIO14, который можно использовать под свои нужды (обведен фиолетовым). К последнему я подключу датчик температуры и влажности DHT22. Так же, можно откусить светодиод и кнопку, тогда появится еще два свободных GPIO, например для подключения еще двух реле.
Само-собой перед разборкой надо отключить устройство от сети 220В.
Вот распиновка разъема для программирования.
Я использую USB-UART преобразователь Foca, во-первых его делает та же компания, которая выпускает Sonoff и его распиновка полностью подходит, во-вторых потому, что на нем есть переключатель 3.3 – 5В, что очень удобно, т.к. к примеру, тот же ESP8266 сгорит от подачи 5В, а какая-нибудь Ардуина не заведется от 3.3В). Теперь настало время стереть стоковую прошивку и влить что-то свое.
Вариантов альтернативных прошивок для модуля ESP8266 на котором построен Sonoff достаточно много, но мне хотелось иметь возможность управлять не только через браузер, а и через приложение на телефоне. Писать программы под Android я не умею, поэтому решил воспользоваться сервисом Blynk.cc, который предоставлял и прошивку (кстати, не только к ESP8266, а и к куче разновидностей Arduino и других плат, о которых я даже не слыхал) и позволял в несколько кликов сделать свое приложение для Android или iOS.
Вообще простота работы с blynk просто поражает – ставим приложение, создаем в нем новый проект, выбираем какую плату мы используем (в случае с Sonoff это ESP8266), получаем ключ устройства (Auth token). Теперь открываем Arduino IDE, подключаем к нему библиотеку Blynk и прошиваем в наше устройство самый простой пример, чтобы подтвердить, что он действительно простой я приведу его код здесь:
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <esp8266wifi.h> #include <blynksimpleesp8266.h>
char auth[] = "1234567890abcdef1234567890abcdef "; //токен, сгенерированный приложением
char ssid[] = "MyWifi";//имя моей точки доступа
char pass[] = "MyWifiPassword"; //пароль от нее
Serial.begin(9600);//инициируем последовательный интерфейс для дебага. Сюда будут выводиться служебные сообщения
Blynk.begin(auth, ssid, pass);//подключаемся к серверу blynk
Заливаем его в Sonoff и всё - для удовлетворения большинства моих запросов больше ничего программировать не надо, остальное будем делать в приложении. Но мы ведь не указали, какие выводы у нас будут использоваться, что из них будет выходом, а что входом, использовать ли подтяжки, куда слать данные и как реагировать на запросы из вне, скажете вы. А это все уместилось в одной строчке
Основной функционал может набиваться в приложении – какой пин дернуть по нажатии на кнопку, как изменить вывод сигнала PWM при изменении положения слайдера, и много другое. Конечно для реализации специфических фич, код прошивки надо будет модифицировать, но все равно по сравнению со скетчем для iboard, с blynk все гораздо проще.
Правда тут есть одно НО: я ушел от облачного сервиса Itead, что бы ни от кого не зависеть и перешел… на облачный сервис Blynk.cc. Это правда, но нюанс в том, что Blynk позволяет запустить свой собственный сервер - хоть у себя в локалке на Raspberry Pi. Не буду подробно на этом останавливаться, инструкция по развертыванию есть в документации и там все тоже не сложно.
Вернемся к приложению. Начал я с того, что добавил кнопку и задал ей управление выходом GPIO12 (это зеленый светодиод на Sonoff). Перешел в режим просмотра (кнопочка Play в верхнем правом углу) и смог ею включать/выключать светодиод! Если поменять GPIO с 12, на 13, то я буду управлять встроенным реле. Неплохо за полчаса работы? Пойдем дальше – добавим слайдер и привяжем его к тому же светодиоду – теперь двигая слайдер я могу изменять яркость свечения светодиода. Таким образом подсоединив этот выход к диммеру я смогу регулировать освещение с телефона. Вообще возможности интерфейса blynk можно описывать долго, остановлюсь только кратко на некоторых
- Таймер, позволяет задать действия, привязанные к временным интервалам. Хранятся на сервере и запустят событие на устройстве, даже, если ваш телефон выключен
- Уведомления о событиях в твитер, на e-mail, смартфон
- GPS триггер – посылает событие на устройство, если телефон прибыл или вышел из указанной зоны
- Привязка событий к другим датчикам телефона, например, к акселерометру
- Удобный конструктор отображения информации - графики, менюшки, окошки, таблицы и даже консоль, для любителей командной строки
С реле разобрались, можно ковырять дальше. Но для начала хотелось бы избавиться от необходимости регулярного подключения устройства к компьютеру для обновления прошивки. Для этого уже есть написанные примеры, которые позволяют прошивать устройство прямо из Arduino IDE по воздуху. Реализуется библиотекой ArduinoOTA (ну куда ж без ардуины). Правда, в документации сказано, что для этого устройство должно быть в той же локальной сети, но я думаю, что пробросив порт через роутер (по умолчанию порт 8266) это ограничение можно обойти.
Теперь можно начать экспериментировать с датчиком температуры и влажности. Я выбрал DHT22, он хоть дороже, но зато точнее – плюс-минус 0.1 градус, в отличии от DHT11 у которого плюс-минус 1 градус. На плате есть дублирующие выводы питания, чтобы не трогать гребенку для программирования подпаялся к ним, а вывод данных подпаял к GPIO14. Датчик вынес на несколько сантиметров в бок, т.к. сам Sonoff немного греется и это может повлиять на показания. Немного модифицировал скетч, установив отправку данных на сервер раз в секунду (кстати, если нужно, то можно указать отдавать данные с датчика только по запросу с сервера, а не бомбить его раз в секунду). Для работы с данными датчиков в Blynk есть т.н. виртуальные пины. Я определяю в скетче, что влажность будет отправляться на виртуальный пин5, а температура на виртуальный пин 6, потом в приложении привязываю эти виртуальные пины к необходимому виджету - я сделал Label для отображения текущих данных и History для графика изменения. В общем-то все, миссия выполнена. Вот видео работы и код итогового скетча (включение/віключение чайника):
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space