Недавно на 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
/**
* Прошивка 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.

Скетч работы с сенсором AM2301
/**
* Прошивка 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 мультиплатформенная версия этой библиотеки

Алгоритм опроса датчика берем из примера:

Скетч работы с сенсором DS18B20
/**
* Прошивка 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)


  1. prostosergik
    17.10.2016 17:47

    Первый контроллер на ЕСП-шке, который я готов купить. Спасибо за статью!


    1. Sleuthhound
      17.10.2016 21:19
      +1

      Первый и наверно единственный. Производители не стали делать массово IoT устройства на ESP8266 из-за глюкавой SDK, вся надежда на ESP32.


      1. shadson
        18.10.2016 05:04
        +1

        а есть какие-то новости про esp32?
        А эту штуку закажу на неделе, автору спасибо!


        1. sav13
          18.10.2016 05:17

          esp32 появился на алиэксперссе. Цена пока не очень
          Появился сайт с форумом
          Я думаю еще год в его сторону можно не смотреть, пока цены урегулируются, пока SDK несколько версий обновиться более менее безглючных


        1. ElectricFromUfa
          18.10.2016 06:19

          Распроданы первые 600 модулей
          Обещают в ноябре ещё 3000

          По поводу безглючного (скорее не глючного, а плохо документированного) SDK для ESP32 — сильно сомневаюсь


          1. sav13
            18.10.2016 06:33

            Похоже, что первые модули достались не разработчикам, а барыгам Али и те теперь во всю наживаются. С Raspberry PI Zero та же история была.

            Я вот решил, пока ESP32 доходит — поковырять в сторону RT8710.


            1. ElectricFromUfa
              18.10.2016 06:49
              +1

              Скорее всего у барыг на али этих модулей тоже нет. После заказа они скорее всего начнут вату катать (некоторые сразу в лоте пишут что это предзаказ)
              В общем надо переждать ажиотаж. А пока для реальных применений и esp8266 неплох


              1. Celtis
                18.10.2016 12:48

                На Али на ESP32 только предзаказ с неопределенными перспективами.
                Никто не пишет, что модули у них есть в наличии.


    1. LiguidCool
      17.10.2016 21:42

      Я не понимаю почему их сразу такие не сделали, ведь это чуть ли не первое что в голову приходит.


    1. avp-avp
      20.10.2016 12:35

      Есть еще вполне прилично сделанные 5-ти канальные диммеры для LED (RGB+W/wW). Там ESP с 5-ти канальным ШИМ диммером и полноценно разведенным портом для перепрошивки.

      image


      1. sav13
        20.10.2016 12:37

        Цена?
        С учетом того что питания 220В нет и корпуса, должно не дороже $5 стоить


      1. webself
        20.10.2016 12:39

        а дайте ссылку на страницу продавца? интересен ценник


        1. avp-avp
          20.10.2016 13:04

          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$


          1. sav13
            20.10.2016 14:29

            Ну хоть в корпусе


            1. avp-avp
              20.10.2016 14:31

              Он живьем выглядит очень пристойно. Могу прислать фотки. Я пока не разбирать его и не пытался перепрошивать.


  1. praeivis
    17.10.2016 21:42

    А есть аналоги Sonoff TH10 но с твердотельными реле типа SSR-25DA?


    1. sav13
      17.10.2016 21:44

      Симистор и симистор. Ничего особенного в этом реле.
      Но Sonoff ставит обычные реле на 10А и 16А. Видимо для экономии места. Ведь 10А симистор нужно уже на ражиатор ставить


      1. Celtis
        17.10.2016 23:58

        Обеспечить пристойный теплоотвод с SSR даже на 10А в маленьком закрытом корпусе — задача для сильных духом.


        1. sav13
          18.10.2016 05:18

          Всю нижнюю часть корпуса из алюминия на котором реле сидит. И весь корпус на радиатор.


          1. Celtis
            18.10.2016 12:49

            Нижнюю — это которую к стенке крепить?


            1. sav13
              18.10.2016 14:08

              Да. Вместе в фазой )))


      1. praeivis
        18.10.2016 11:11

        У меня уже стоит реле в обогревателе, и оно очень раздражает, поэтому и хочется бесшумный вариант.


        1. sav13
          18.10.2016 11:13

          Ну реле можно выпаять и вместо обмотки поставить вход SSR-ки. Там все равно оптрон.
          Но это уже доработка получается конструкции.
          А вообще никто не будет делать твердотельные реле в копеечных котроллерах


    1. webself
      17.10.2016 21:55

      Сделайте сами такой «аналог». SSR-25DA ведь отдельный будет все равно использоваться.
      Только имейте в виду, что китайские ссрки с сурпризами внутри идут.
      Если берете «очень не дорого», то имеете все шансы совсем не 25А реальных получить.


      1. praeivis
        18.10.2016 11:13

        Я в курсе про поделки, поэтому и хочется готовое устройство от хоть мало известной компании чтобы поставит и не морочится.


  1. SegreyBorovkov
    18.10.2016 05:04

    А не думали взять прошивку с wifi-iot.com? Очень крутая идея в техническом плане, но думаю, что владельцу даже на еду от этого проекта не хватит.

    Прошивка собирается за несколько кликов, умеет обновляться через интернет без использования прошивальщика (только при изменении опций с настройками происходит что-то ужасное!).
    У меня на то, чтобы запустить esp8266 с 18b20, dht22, CO2 датчиком MH-Z19, bmp-085, ушло смешное время — долго разбирался только с тем, что и куда подключить, как прошить. Но это более-менее стандартный функционал, он пишется за пару часов. Но когда у меня ушло 10 минут на то, чтобы отправлять данные в zabbix, получить данные в json через wget, я проникся.


    1. sav13
      18.10.2016 05:30

      Я посмотрел ряд готовых прошивок под ESP
      Blynk,
      home-smart, тот же Mysensor.
      Или MQTT-OTA про которую я в начале статьи упомянул.
      wifi-iot.com не смотрел, мне сейчас не очень это интересно.

      В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью. Поэтому разработал свою заготовку в виде встроенного HTTP сервера, а остальное ручками на Си.


      1. Sleuthhound
        18.10.2016 07:07

        Есть еще SUPLA — https://www.supla.org/ru/
        Сам не смотрел, но по исходникам все на Си + LGPL — то есть опенсорсное.


  1. doom369
    18.10.2016 11:14

    В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью.


    О каких задачах речь?


    1. sav13
      18.10.2016 14:24

      В основном это нестандартная периферия:

      С ходу припомнились такие устройства.
      MAX44009,TSL2560 — датчики освещенности
      MAX7219,TM1637 — контроллеры светодиодных индикаторов
      WS2812 — диоды с пиксельной адресацией
      DS3231 — часы реального времени
      Ульразвуковой датчик дистанции
      GPS приемник по UART
      Различные расширители портов
      Аналоговые устройства

      Найти прошивку, которая из коробки все это поддерживает, да еще и с логикой типа ПИД-регулятора, достаточно тяжело.


      1. ElectricFromUfa
        18.10.2016 15:32

        nodemcu смотрели? или вам принципиально на сях писать?


        1. sav13
          18.10.2016 15:36

          Интерпретаторы в микроконтроллерах это ужас.
          Не говоря о том, что LUA жрет большую часть памяти, он еще и тормозит жутко. Прошивку с JS не смотрел, но думаю, что тоже самое.

          Си++ меня вполне устраивает.
          Можно Эклипс + SDK. Можно что-то более легкое, тот же Arduino IDE.