Мобильная версия Форум Arduino Документация Гарантийные условия 0 0
UA RU
График работы магазина:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Вс: выходной
Каталог
Напиши статью и получи скидку!

Включаем отопление на даче удаленно

2016-12-01

Все статьи →

Начитавшись чужих статей по умному дому я тоже захотел сделать свою дачу немного умней. Начал с того, что собрал на iboard и ds18b20 температурный датчик и всегда мог узнать какая температура на даче и даже получить СМС, если она опустилась ниже 5 градусов (могут замерзнуть трубы) или поднялась выше 30 (либо посреди зимы настало лето, либо у меня сейчас будет пожар). Но от того, что я знал какой дубарь сейчас на даче теплее мне не становилось. И следующим шагом я решил сделать возможность удаленно включать насос теплых полов, чтобы, утром нажав кнопку на телефоне обеспечивать по приезду на дачу комфортную температуру в доме. Можно было бы добавить к iboard реле, но, во-первых, эзернета у меня в котельной нет, во-вторых хотелось попробовать чего-то проще и желательно дешевле (с iboard я потратил несколько вечеров на программирование, да и бюджет вышел не самый низкий).

Полазив по интернетам выбрал самое простое, на мой взгляд, решение - Sonoff. В общем-то эта штука умеет все что мне надо и осталось только подключить к ее входу вилку, а к выходу – розетку. Установив на телефон приложение EWeLink из Play маркета я подружил его со своим Sonoff и имел возможность нажимая на кнопку включать-выключать нагрузку.

На этом рассказ можно было бы закончить - одно недорогое устройство полностью решило мою задачу и можно было бы приниматься за следующие шаги по автоматизации, если бы не одно НО: приложение управляет устройством не напрямую и даже не через локальную сеть, а через облачный сервис производителя и если у них какие-то проблемы с серверами, то управлять устройством уже не получится. Сначала я решил закрыть на это глаза, но однажды, собираясь уезжать с дачи, я обнаружил в приложении надпись Network unavailable. Попытки выключить теплый пол ни к чему не привели. Можно было бы конечно поехать домой и попробовать выключить мой Sonoff позже, когда они починят свое облако, но что будет если у них серьезные проблемы и сервис не поднимется в течение нескольких дней? За неделю газу нагорит на несколько таких Sooff-ов, не ехать же специально на дачу среди недели, чтобы выключить то, что должно было выключаться удаленно? Пришлось отключить устройство и забрать его домой на переделку. Попробуем отказаться от сторонних сервисов, а заодно попробуем немного улучшить функционал добавив к нему датчик влажности и температуры, чтобы знать какая температура в котельной.

Начал я с разбора модуля и подпайки разъемов для прошивки. Поскольку это проект с открытым исходным кодом (по крайней мере аппаратная часть, на счет программной не уверен), то есть и принципиальная схема, по которой можно разобраться какие выводы куда выведены. Пять отверстий поперек платы это интерфейс для перепрошивки модуля (обведен на фото красным овалом) и свободный GPIO14, который можно использовать под свои нужды (обведен фиолетовым). К последнему я подключу датчик температуры и влажности DHT22. Так же, можно откусить светодиод и кнопку, тогда появится еще два свободных GPIO, например для подключения еще двух реле.

Само-собой перед разборкой надо отключить устройство от сети 220В.

Вот распиновка разъема для программирования.

Sonoff-pinout

Я использую 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"; //пароль от нее

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 можно описывать долго, остановлюсь только кратко на некоторых

  • Таймер, позволяет задать действия, привязанные к временным интервалам. Хранятся на сервере и запустят событие на устройстве, даже, если ваш телефон выключен
  • Уведомления о событиях в твитер, на e-mail, смартфон
  • GPS триггер – посылает событие на устройство, если телефон прибыл или вышел из указанной зоны
  • Привязка событий к другим датчикам телефона, например, к акселерометру
  • Удобный конструктор отображения информации - графики, менюшки, окошки, таблицы и даже консоль, для любителей командной строки

С реле разобрались, можно ковырять дальше. Но для начала хотелось бы избавиться от необходимости регулярного подключения устройства к компьютеру для обновления прошивки. Для этого уже есть написанные примеры, которые позволяют прошивать устройство прямо из Arduino IDE по воздуху. Реализуется библиотекой ArduinoOTA (ну куда ж без ардуины). Правда, в документации сказано, что для этого устройство должно быть в той же локальной сети, но я думаю, что пробросив порт через роутер (по умолчанию порт 8266) это ограничение можно обойти.

Теперь можно начать экспериментировать с датчиком температуры и влажности. Я выбрал DHT22, он хоть дороже, но зато точнее – плюс-минус 0.1 градус, в отличии от DHT11 у которого плюс-минус 1 градус. На плате есть дублирующие выводы питания, чтобы не трогать гребенку для программирования подпаялся к ним, а вывод данных подпаял к GPIO14. Датчик вынес на несколько сантиметров в бок, т.к. сам Sonoff немного греется и это может повлиять на показания. Немного модифицировал скетч, установив отправку данных на сервер раз в секунду (кстати, если нужно, то можно указать отдавать данные с датчика только по запросу с сервера, а не бомбить его раз в секунду). Для работы с данными датчиков в Blynk есть т.н. виртуальные пины. Я определяю в скетче, что влажность будет отправляться на виртуальный пин5, а температура на виртуальный пин 6, потом в приложении привязываю эти виртуальные пины к необходимому виджету - я сделал Label для отображения текущих данных и History для графика изменения. В общем-то все, миссия выполнена. Вот видео работы и код итогового скетча (включение/віключение чайника):

HVAC

#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();

}

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Общая оценка:

Оценка "Включаем отопление на даче удаленно"
5 из 5
сделана на основе 5 оценок 5 клиентских отзывов.

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
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
оплата картами Visa и MasterCard