Недавно на Geektimes был обзор про модули ITEAD TH10. Хочу поделиться опытом разработки собственной прошивки для этих устройств.
SONOFF — серия выключателей, розеток и других приборов категории «Интернета вещей» от компании ITEAD. Их характеризует довольно низкая цена, использование «народного WiFi модуля» ESP8266 и работа в собственном сервисе, расположенном в облаке Amazon AWS global server.
Для этих модулей есть сторонние прошивки. Например, MQTT OTA, собираемой с ESP SDK или тоже самое но в среде Arduino IDE
Я хочу поделиться опытом создания собственной прошивки на Sonnoff в среде Ardiono IDE.
Модули Sonoff мне понравились сразу. Начиная от упаковки:
Внешнего вида:
Качественной сборки и пайки:
И заканчивая проработанной схемотехникой, в которой явно не пожалели транзисторов для управления нагрузкой, подтягивающих и согласующих резисторов и кондеров.
Поддержкой же и документацией своих устройств компания ITEAD может заткнуть за пояс многих именитых производителей, не утруждающих себя публикацией технических подробностей на свои железки. Да и список продуктов компании ITEAD вполне впечатляет
По сути своей Sonoof TH10/16- это ESP8266 с сетевым блоком питания, периферией в виде реле, светодиодов, датчиков температуры и влажности, с колодкой подключения и в приличном корпусе.
Я опущу описание, как подключить Sonoff к облачному сервису и управлять приложением eWeLink на смартфоне. На мой взгляд, полностью неприменимо, когда управление контроллерами зависит от интернета и учетной записи в каком то облаке, пусть и на амазоновских серверах. Поэтому оставим приложение eWeLink для демонстрации возможности Sonoff и напишем свою управляющую программу.
Для этого нужно впаять 4-х штырьковый разъем для подключение к USB/TTL конвертеру.
Имея негативный опыт перепрошивки Sonoff POW, очень рекомендую все работы по программированию проводить с отключенной силовой частью Sonoff и питанием через штырек 3.3В.
Последний USB/TTL у меня героически погиб вместе с модулем Sonoff POW, поэтому использую для подключения Arduino UNO с RESETот подтянутым к земле. 3.3-вольтовый стабилизатор Уны отлично справляется с нагрузкой в виде ESP8266 и всей периферии модуля.
Как среду разработки буду использовать Arduino IDE и за легкости установки и обилия готовых библиотек и примеров, хотя как программист со стажем по прежнему считаю, что для разработки программ любой сложности вполне достаточно VI и make ))).
Как устанавливать ESP8266 Cire for Arduiono IDE посвящено много материалов в интернете. От себя хочу рекомендовать версию Arduino IDE 1.6.5, как имеющую меньше всего глюков при работе с ESP.
Так как на плате установлена микросхема памяти на 1Мбайт, выбираем соответствующую конфигурацию при загрузке в Board Manager:
Теперь достаточно нажать кнопку контроллера Sonoff и передернуть питание, устройство переходит в режим загрузки прошивки.
Для того чтобы самому программировать контроллер, нужно понимать, к каким портам что подключено. Для этого можно воспользоваться схемой на сайте ITEAD, ссылку на которую я приводил выше и тестером.
Итак, что мы имеем:
GPIO0 — кнопка (это понятно, когда мы включали бутлоадер)
GPIO12 — красный светодиод и реле
GPIO13 — синий светодиод
GPIO14 и GPIO4 выведены на разъем подключения датчиков.
Причем оба датчика однопроводные и используют GPIO14. GPIO4 еще нужно включить перемычкой на плате.
Да. Не густо, хотя и больше чем у ESP01.
GPIO2 и GPIO15 имеют подтягивающие резисторы на плате, можно подпаяться к ним. GPIO5 и ADC вообще никуда не распаяны и нужно подключаться прямо к микросхеме ESP. Оставим эти четыре вывода в покое и приступим к программированию.
/**
* Прошивка SONOFF TH10/16
* Copyright 2016 Алексей Шихарбеев
* http://samopal.pro
*/
#include <arduino.h>
uint8_t PIN_RELAY = 12;
uint8_t PIN_LED2 = 13;
void setup() {
pinMode(PIN_RELAY,OUTPUT);
pinMode(PIN_LED2, OUTPUT);
}
Светодиоды работают в противофазе. Синий загорается, когда на нем низкий уровень. Реле срабатывать не должно из за отсутствия питания 5В. В дальнейшем я буду использовать синий светодиод для отображения различных режимов. Подробно про это я написал в этой статье
На кнопке я подробно останавливаться не буду. Да управления кнопками я написал удобную библиотеку, которая отлавливает длинное и короткое нажатие, автоповторение при длинном нажатии и давит дребезг контактов. Все это я подробно описал в своем блоге.
Теперь сенсоры. Мне прислали датчик температуры/влажности AM2301 и датчик температуры DS18B20 в водонепроницаемом исполнении.
AM2301 совместим с сенсором DHT21. Для его работы нужна библиотека DHT. Форков библиотеки DHT существует великое множество, я рекомендую брать версию от Adafruit в которой есть автонастройка на частоту контроллера и которая корректно работает на ESP8266.
/**
* Прошивка SONOFF TH10/16
* Copyright 2016 Алексей Шихарбеев
* http://samopal.pro
*/
#include <arduino.h>
// DHT от Adafruit
// https://github.com/adafruit/DHT-sensor-library
#include <DHT.h>
uint8_t PIN_DHT = 14;
DHT dht(PIN_DHT, AM2301);
void setup() {
// Последовательный порт для отладки
Serial.begin(115200);
Serial.printf("DHT init ...");
dht.begin();
}
void loop() {
delay(1000);
Serial.print("Temperature=");
Serial.print(dht.readTemperature(),1);
Serial.println(" C");
Serial.print("Humidity=");
Serial.print(dht.readHumidity(),0);
Serial.println("%");
}
Для подключения DS18B20 нужна библиотека OneWire. Полностью совместима с ESP мультиплатформенная версия этой библиотеки
Алгоритм опроса датчика берем из примера:
/**
* Прошивка SONOFF TH10/16
* Copyright 2016 Алексей Шихарбеев
* http://samopal.pro
*/
#include <arduino.h>
// Мультиплатформенная библиотека
// https://github.com/PaulStoffregen/OneWire
#include <OneWire.h>
#define ERROR_VALUE 2147483647
float GetDS18X20();
uint8_t PIN_DS = 14;
OneWire ds(PIN_DS);
void setup() {
// Последовательный порт для отладки
Serial.begin(115200);
Serial.printf("DS18B20 init ...");
}
void loop() {
delay(1000);
float t = GetDS18X20();
if( t!= ERROR_VALUE ){
Serial.print("Temperature=");
Serial.print(t,1);
Serial.println(" C");
}
}
/**
* Опрос датчика температуры
*/
float GetDS18X20(){
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
// Serial.println("DS18B20: No more addresses.");
ds.reset_search();
delay(250);
return ERROR_VALUE;
}
if (OneWire::crc8(addr, 7) != addr[7]) {
// Serial.println("DS1820: CRC is not valid!");
return ERROR_VALUE;
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
// Serial.println("Device is not a DS18x20 family device.");
return ERROR_VALUE;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
return celsius;
}
Ну вот, периферия работает. Дальше я использую существующие свои наработки. Полностью всю прошивку можно взять отсюда
Особенности прошивки:
- Автоматическое определение сенсоров AM2301 и DS18B20
- Длинное нажатие кнопки — вкл/откл режима точки доступа
- Короткое нажатие кнопки — вкл/откл реле
- Синий светодиод горит — соединение установлено, двойная вспышка — нет подключения, одинарное мигание — режим точки доступа
- Локальный WEB-сервер в режиме точки доступа 192.168.4.1
- при подключении к WiFi по тому IP адресу который настроен
- Авторизация доступа по паролю. По умолчанию admin/12345
- Сохранение параметров на сервер в интернете обычным HTTP запросом. Можно настроить любой сервер, например, народный мониторинг. А можно и локальный без всякого интернета.
- Сохранение настроек в EEPROM
- При подключении к интернету установка времени по NTP
Для любителей готовых сервисов. легко прикручивается готовая библиотека MQTT, BLYNK И пр. Но это уже за пределами данной статьи.
Итог
SONOFF — это удобная платформа в первую очередь для тех, кто может самостоятельно разрабатывать и дорабатывать управляющие программы.
Тем кто знаком с ESP8266 — Sonoff это экономия на сборке, пайке и деталях, при условии, что вам нужна именно такая конфигурация устройства, как заложена в конкретном модуле Sonoff.
Самый большой недостаток данных модулей то, что часть GPIO не разведены на разъемы. Ну что стоит сделать компании ITEAD гребенку с 8 pin и завести туда все свободные GPIO от ESP. Я думаю, популярность бы таких модулей при существующей цене сильно бы выросла.
Что касается конкретных применений, такой контроллер вполне можно реализовать на модуле Sonoff TH10.
Комментарии (32)
praeivis
17.10.2016 21:42А есть аналоги Sonoff TH10 но с твердотельными реле типа SSR-25DA?
sav13
17.10.2016 21:44Симистор и симистор. Ничего особенного в этом реле.
Но Sonoff ставит обычные реле на 10А и 16А. Видимо для экономии места. Ведь 10А симистор нужно уже на ражиатор ставитьCeltis
17.10.2016 23:58Обеспечить пристойный теплоотвод с SSR даже на 10А в маленьком закрытом корпусе — задача для сильных духом.
praeivis
18.10.2016 11:11У меня уже стоит реле в обогревателе, и оно очень раздражает, поэтому и хочется бесшумный вариант.
sav13
18.10.2016 11:13Ну реле можно выпаять и вместо обмотки поставить вход SSR-ки. Там все равно оптрон.
Но это уже доработка получается конструкции.
А вообще никто не будет делать твердотельные реле в копеечных котроллерах
webself
17.10.2016 21:55Сделайте сами такой «аналог». SSR-25DA ведь отдельный будет все равно использоваться.
Только имейте в виду, что китайские ссрки с сурпризами внутри идут.
Если берете «очень не дорого», то имеете все шансы совсем не 25А реальных получить.praeivis
18.10.2016 11:13Я в курсе про поделки, поэтому и хочется готовое устройство от хоть мало известной компании чтобы поставит и не морочится.
SegreyBorovkov
18.10.2016 05:04А не думали взять прошивку с wifi-iot.com? Очень крутая идея в техническом плане, но думаю, что владельцу даже на еду от этого проекта не хватит.
Прошивка собирается за несколько кликов, умеет обновляться через интернет без использования прошивальщика (только при изменении опций с настройками происходит что-то ужасное!).
У меня на то, чтобы запустить esp8266 с 18b20, dht22, CO2 датчиком MH-Z19, bmp-085, ушло смешное время — долго разбирался только с тем, что и куда подключить, как прошить. Но это более-менее стандартный функционал, он пишется за пару часов. Но когда у меня ушло 10 минут на то, чтобы отправлять данные в zabbix, получить данные в json через wget, я проникся.sav13
18.10.2016 05:30Я посмотрел ряд готовых прошивок под ESP
Blynk,
home-smart, тот же Mysensor.
Или MQTT-OTA про которую я в начале статьи упомянул.
wifi-iot.com не смотрел, мне сейчас не очень это интересно.
В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью. Поэтому разработал свою заготовку в виде встроенного HTTP сервера, а остальное ручками на Си.Sleuthhound
18.10.2016 07:07Есть еще SUPLA — https://www.supla.org/ru/
Сам не смотрел, но по исходникам все на Си + LGPL — то есть опенсорсное.
doom369
18.10.2016 11:14В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью.
О каких задачах речь?sav13
18.10.2016 14:24В основном это нестандартная периферия:
С ходу припомнились такие устройства.
MAX44009,TSL2560 — датчики освещенности
MAX7219,TM1637 — контроллеры светодиодных индикаторов
WS2812 — диоды с пиксельной адресацией
DS3231 — часы реального времени
Ульразвуковой датчик дистанции
GPS приемник по UART
Различные расширители портов
Аналоговые устройства
Найти прошивку, которая из коробки все это поддерживает, да еще и с логикой типа ПИД-регулятора, достаточно тяжело.ElectricFromUfa
18.10.2016 15:32nodemcu смотрели? или вам принципиально на сях писать?
sav13
18.10.2016 15:36Интерпретаторы в микроконтроллерах это ужас.
Не говоря о том, что LUA жрет большую часть памяти, он еще и тормозит жутко. Прошивку с JS не смотрел, но думаю, что тоже самое.
Си++ меня вполне устраивает.
Можно Эклипс + SDK. Можно что-то более легкое, тот же Arduino IDE.
prostosergik
Первый контроллер на ЕСП-шке, который я готов купить. Спасибо за статью!
Sleuthhound
Первый и наверно единственный. Производители не стали делать массово IoT устройства на ESP8266 из-за глюкавой SDK, вся надежда на ESP32.
shadson
а есть какие-то новости про esp32?
А эту штуку закажу на неделе, автору спасибо!
sav13
esp32 появился на алиэксперссе. Цена пока не очень
Появился сайт с форумом
Я думаю еще год в его сторону можно не смотреть, пока цены урегулируются, пока SDK несколько версий обновиться более менее безглючных
ElectricFromUfa
Распроданы первые 600 модулей
Обещают в ноябре ещё 3000
По поводу безглючного (скорее не глючного, а плохо документированного) SDK для ESP32 — сильно сомневаюсь
sav13
Похоже, что первые модули достались не разработчикам, а барыгам Али и те теперь во всю наживаются. С Raspberry PI Zero та же история была.
Я вот решил, пока ESP32 доходит — поковырять в сторону RT8710.
ElectricFromUfa
Скорее всего у барыг на али этих модулей тоже нет. После заказа они скорее всего начнут вату катать (некоторые сразу в лоте пишут что это предзаказ)
В общем надо переждать ажиотаж. А пока для реальных применений и esp8266 неплох
Celtis
На Али на ESP32 только предзаказ с неопределенными перспективами.
Никто не пишет, что модули у них есть в наличии.
LiguidCool
Я не понимаю почему их сразу такие не сделали, ведь это чуть ли не первое что в голову приходит.
avp-avp
Есть еще вполне прилично сделанные 5-ти канальные диммеры для LED (RGB+W/wW). Там ESP с 5-ти канальным ШИМ диммером и полноценно разведенным портом для перепрошивки.
sav13
Цена?
С учетом того что питания 220В нет и корпуса, должно не дороже $5 стоить
webself
а дайте ссылку на страницу продавца? интересен ценник
avp-avp
https://www.aliexpress.com/item/RGBWW-Strip-WiFi-Controller-1-Port-Control-200-Lights-Communicate-with-Android-Phone-Via-WLAN-to/32502007408.html?ws_ab_test=searchweb0_0,searchweb201602_1_116_10065_117_10068_114_115_10069_113_10084_10083_10017_10080_10082_10081_10060_10061_10062_10056_10055_10054_10059_10078_10079_10073_10070_421_420_10052_10053_10050_10051,searchweb201603_1&btsid=be22327d-56bf-4134-99a6-e88c2f412667
Стоит в два раза дороже, чем озвученные 5$
sav13
Ну хоть в корпусе
avp-avp
Он живьем выглядит очень пристойно. Могу прислать фотки. Я пока не разбирать его и не пытался перепрошивать.