Пишем свою прошивку для модулей Sonoff TH10/16


    Недавно на 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.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 32

      0
      Первый контроллер на ЕСП-шке, который я готов купить. Спасибо за статью!
        +1
        Первый и наверно единственный. Производители не стали делать массово IoT устройства на ESP8266 из-за глюкавой SDK, вся надежда на ESP32.
          +1
          а есть какие-то новости про esp32?
          А эту штуку закажу на неделе, автору спасибо!
            0
            esp32 появился на алиэксперссе. Цена пока не очень
            Появился сайт с форумом
            Я думаю еще год в его сторону можно не смотреть, пока цены урегулируются, пока SDK несколько версий обновиться более менее безглючных
              0
              Распроданы первые 600 модулей
              Обещают в ноябре ещё 3000

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

                Я вот решил, пока ESP32 доходит — поковырять в сторону RT8710.
                  +1
                  Скорее всего у барыг на али этих модулей тоже нет. После заказа они скорее всего начнут вату катать (некоторые сразу в лоте пишут что это предзаказ)
                  В общем надо переждать ажиотаж. А пока для реальных применений и esp8266 неплох
                    0
                    На Али на ESP32 только предзаказ с неопределенными перспективами.
                    Никто не пишет, что модули у них есть в наличии.
            0
            Я не понимаю почему их сразу такие не сделали, ведь это чуть ли не первое что в голову приходит.
              0
              Есть еще вполне прилично сделанные 5-ти канальные диммеры для LED (RGB+W/wW). Там ESP с 5-ти канальным ШИМ диммером и полноценно разведенным портом для перепрошивки.

              image
                0
                Цена?
                С учетом того что питания 220В нет и корпуса, должно не дороже $5 стоить
                  0
                  а дайте ссылку на страницу продавца? интересен ценник
                    0
                    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$
                      0
                      Ну хоть в корпусе
                        0
                        Он живьем выглядит очень пристойно. Могу прислать фотки. Я пока не разбирать его и не пытался перепрошивать.
                0
                А есть аналоги Sonoff TH10 но с твердотельными реле типа SSR-25DA?
                  0
                  Симистор и симистор. Ничего особенного в этом реле.
                  Но Sonoff ставит обычные реле на 10А и 16А. Видимо для экономии места. Ведь 10А симистор нужно уже на ражиатор ставить
                    0
                    Обеспечить пристойный теплоотвод с SSR даже на 10А в маленьком закрытом корпусе — задача для сильных духом.
                      0
                      Всю нижнюю часть корпуса из алюминия на котором реле сидит. И весь корпус на радиатор.
                        0
                        Нижнюю — это которую к стенке крепить?
                          0
                          Да. Вместе в фазой )))
                      0
                      У меня уже стоит реле в обогревателе, и оно очень раздражает, поэтому и хочется бесшумный вариант.
                        0
                        Ну реле можно выпаять и вместо обмотки поставить вход SSR-ки. Там все равно оптрон.
                        Но это уже доработка получается конструкции.
                        А вообще никто не будет делать твердотельные реле в копеечных котроллерах
                      0
                      Сделайте сами такой «аналог». SSR-25DA ведь отдельный будет все равно использоваться.
                      Только имейте в виду, что китайские ссрки с сурпризами внутри идут.
                      Если берете «очень не дорого», то имеете все шансы совсем не 25А реальных получить.
                        0
                        Я в курсе про поделки, поэтому и хочется готовое устройство от хоть мало известной компании чтобы поставит и не морочится.
                      0
                      А не думали взять прошивку с wifi-iot.com? Очень крутая идея в техническом плане, но думаю, что владельцу даже на еду от этого проекта не хватит.

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

                        В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью. Поэтому разработал свою заготовку в виде встроенного HTTP сервера, а остальное ручками на Си.
                          0
                          Есть еще SUPLA — https://www.supla.org/ru/
                          Сам не смотрел, но по исходникам все на Си + LGPL — то есть опенсорсное.
                        0
                        В моих проектах есть ряд задач, которые в данных проектах не решаются или решаются с высокой трудоемкостью.


                        О каких задачах речь?
                          0
                          В основном это нестандартная периферия:

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

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

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

                        Only users with full accounts can post comments. Log in, please.