Мобильная версия
Вход в магазин
Регистрация
Напомнить пароль
Список желаний
(098) 067-12-26 Киевстар (098) 067-12-26   Киевстар
(066) 142-24-48 Vodafone (066) 142-24-48   Vodafone
(098) 067-12-26 Lifecell (063) 642-36-59   Lifecell

График работы магазина:

Пн-Пт: 10.00 - 19.00

Сб-Вс: выходные

Киев, пр-кт Голосеевский, 97-А
р-н метро "Выставочный центр"

Каталог

Блочное шифрование в IoT

Исторически сложилось, что для IoT (Internet of Things) на базе ZigBee сетей в первую очередь стояла цель минимизировать энергопотребление, потому вопрос безопасности остался без внимания. В данной статье предлагается пример безопасной IoT системы с

Комплекс домашней автоматизации (Часть 2)

Следующим этапом разработки комплекса домашней автоматизации стал проект уличной метеостанции.

Генератор радиошума в диапазоне 2.4 ГГц

Генераторы шума обычно используются для научных экспериментов и для тестирования приемо-передающего или антенного оборудования, но еще с помощью них, можно улучшить уже существующую беспроводную инфраструктуру.

Комплекс домашней автоматизации (Часть 1)

Комнатная метеостанция. Основная функция устройства – это сигнализация об аварийных ситуациях, но поскольку на плате установлен микроконтроллер ATmega328p, я решил добавить несколько датчиков для автономности и организации обратной связи.

Роутер на Raspberry Pi 3 с дисплеем

В проекте используются Raspberry Pi 3 и OLED (SSD1306 128x64 I2C или SPI). Для корпуса используется акриловый «сэндвич», так как так наглядней, и обычный 5-вольтовый источник питания силой тока около 0,5 А (этого вполне достаточно: устройство потребляет
Напиши статью и получи скидку!

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

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, потому что на нем есть переключатель 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();
}
 
оплата картами Visa и MasterCard