Каталог
|
Включаем отопление на даче удаленно2016-12-01 Все статьи →Начитавшись чужих статей по умному дому я тоже захотел сделать свою дачу немного умней. Начал с того, что собрал на 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 char auth[] = "1234567890abcdef1234567890abcdef "; //токен, сгенерированный приложением char ssid[] = "MyWifi";//имя моей точки доступа char pass[] = "MyWifiPassword"; //пароль от нее
void setup() { Serial.begin(9600);//инициируем последовательный интерфейс для дебага. Сюда будут выводиться служебные сообщения Blynk.begin(auth, ssid, pass);//подключаемся к серверу blynk } void loop() { Blynk.run(); //вся магия в одной строчке } Заливаем его в Sonoff и всё - для удовлетворения большинства моих запросов больше ничего программировать не надо, остальное будем делать в приложении. Но мы ведь не указали, какие выводы у нас будут использоваться, что из них будет выходом, а что входом, использовать ли подтяжки, куда слать данные и как реагировать на запросы из вне, скажете вы. А это все уместилось в одной строчке Blynk.run(); Основной функционал может набиваться в приложении – какой пин дернуть по нажатии на кнопку, как изменить вывод сигнала PWM при изменении положения слайдера, и много другое. Конечно для реализации специфических фич, код прошивки надо будет модифицировать, но все равно по сравнению со скетчем для iboard, с blynk все гораздо проще. Правда тут есть одно НО: я ушел от облачного сервиса Itead, что бы ни от кого не зависеть и перешел… на облачный сервис Blynk.cc. Это правда, но нюанс в том, что Blynk позволяет запустить свой собственный сервер - хоть у себя в локалке на Raspberry Pi. Не буду подробно на этом останавливаться, инструкция по развертыванию есть в документации и там все тоже не сложно. Вернемся к приложению. Начал я с того, что добавил кнопку и задал ей управление выходом GPIO12 (это зеленый светодиод на Sonoff). Перешел в режим просмотра (кнопочка Play в верхнем правом углу) и смог ею включать/выключать светодиод! Если поменять GPIO с 12, на 13, то я буду управлять встроенным реле. Неплохо за полчаса работы? Пойдем дальше – добавим слайдер и привяжем его к тому же светодиоду – теперь двигая слайдер я могу изменять яркость свечения светодиода. Таким образом подсоединив этот выход к диммеру я смогу регулировать освещение с телефона. Вообще возможности интерфейса blynk можно описывать долго, остановлюсь только кратко на некоторых
С реле разобрались, можно ковырять дальше. Но для начала хотелось бы избавиться от необходимости регулярного подключения устройства к компьютеру для обновления прошивки. Для этого уже есть написанные примеры, которые позволяют прошивать устройство прямо из 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 #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <ArduinoOTA.h> #include <SimpleTimer.h> #include <DHT.h>
#define DHTPIN 14 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); SimpleTimer timer; // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "yourToken";
// Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "mySSID"; char pass[] = "myPass"; IPAddress device_ip (192, 168, 1, 203);//я предпочитаю указывать IP статически без DHCP IPAddress gw (192, 168, 1, 1);
void sendSensor(){ float h = dht.readHumidity(); float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit
if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } // You can send any value at any time. // Please don't send more that 10 values per second. Blynk.virtualWrite(V5, h); Blynk.virtualWrite(V6, t); } void setup(){ Serial.begin(9600); WiFi.config(device_ip,gw,gw); WiFi.begin(ssid, pass); Blynk.config(auth); while (Blynk.connect() == false) { } ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); dht.begin(); timer.setInterval(1000L, sendSensor); } BLYNK_CONNECTED() { Blynk.syncAll(); } void loop() { ArduinoOTA.handle(); Blynk.run(); timer.run(); }
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Oleg
04.02.2023 13:05:56
Blynk запретил делать локальный сервер, но форковый проект работает.
Володимир
08.12.2022 19:38:22
Cool !
Vlad
08.04.2020 02:17:18
Хорошая, интересная статья.
Анатолий
13.04.2019 19:57:46
Блинк тоже облачный сервис
Сергей
18.01.2019 08:31:09
Отличная статья, все подробно про чайник и для чайников! отличная для понимания как работает и скетч и blynk
|