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

logo4

Недавно на Geektimes был обзор про модули ITEAD TH10. Хочу поделиться опытом разработки собственной прошивки для этих устройств.

SONOFF — серия выключателей, розеток и других приборов категории «Интернета вещей» от компании ITEAD. Их характеризует довольно низкая цена, использование «народного WiFi модуля» ESP8266 и работа в собственном сервисе, расположенном в облаке Amazon AWS global server.

Для этих модулей есть сторонние прошивки. Например, MQTT OTA, собираемой с ESP SDK илитоже самое но в среде Arduino IDE

Я хочу поделиться опытом создания собственной прошивки на Sonoff TH10 в среде Ardiono IDE.

Модули Sonoff мне понравились сразу. Начиная от упаковки:

000

Внешнего вида:

101

100

Качественной сборки и пайки:

102 104

И заканчивая проработанной схемотехникой, в которой явно не пожалели транзисторов для управления нагрузкой, подтягивающих и согласующих резисторов и кондеров.

page1 page2

Поддержкой же и документацией своих устройств компания ITEAD может заткнуть за пояс многих именитых производителей, не утруждающих себя публикацией технических подробностей на свои железки. Да и список продуктов компании ITEAD вполне впечатляет

По сути своей Sonoof TH10/16 — это ESP8266 с сетевым блоком питания, периферией в виде реле, светодиодов, датчиков температуры и влажности, с колодкой подключения и в приличном корпусе.

300

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

Для этого нужно впаять 4-х штырьковый разъем для подключение к USB/TTL конвертеру.

103

Имея негативный опыт перепрошивки Sonoff POW, очень рекомендую все работы по программированию проводить с отключенной силовой частью Sonoff и питанием через штырек 3.3В.

Последний USB/TTL у меня героически погиб вместе с модулем Sonoff POW, поэтому использую для подключения Arduino UNO с RESETот подтянутым к земле. 3.3-вольтовый стабилизатор Уны отлично справляется с нагрузкой в виде ESP8266 и всей периферии модуля.

200

Как среду разработки буду использовать Arduino IDE и за легкости установки и обилия готовых библиотек и примеров, хотя как программист со стажем по прежнему считаю, что для разработки программ любой сложности вполне достаточно VI и make ))).

Как устанавливать ESP8266 Core for Arduiono IDE я уже писал. От себя хочу рекомендовать версию Arduino IDE 1.6.5, как имеющую меньше всего глюков при работе с ESP.

arduino-ide-1

 

Так как на плате установлена микросхема памяти на 1Мбайт, выбираем соответствующую конфигурацию при загрузке в Board Manager:

arduino-ide-4

Теперь достаточно нажать кнопку контроллера Sonoff и передернуть питание, устройство переходит в режим загрузки прошивки.

arduino-ide-5

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

Итак, что мы имеем:

GPIO0 — кнопка (это понятно, когда мы включали бутлоадер)
GPIO12 — красный светодиод и реле
GPIO13 — синий светодиод
GPIO14 и GPIO4 выведены на разъем подключения датчиков.

Причем оба датчика однопроводные и используют GPIO14. GPIO4 еще нужно включить перемычкой на плате.

Да. Не густо, хотя и больше чем у ESP01.

GPIO2 и GPIO15 имеют подтягивающие резисторы на плате, можно подпаяться к ним. GPIO5 и ADC вообще никуда не распаяны и нужно подключаться прямо к микросхеме ESP. Оставим эти четыре вывода в покое и приступим к программированию.

Скетч мигания светодиодами Sonoff

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

На кнопке я подробно останавливаться не буду. Да управления кнопками я написал удобную библиотеку, которая отлавливает длинное и короткое нажатие, автоповторение при длинном нажатии и давит дребезг контактов. Все это я подробно описал в своем блоге.

Теперь сенсоры. Мне прислали датчик температуры/влажности AM2301 и датчик температуры DS18B20 в водонепроницаемом исполнении.

301

AM2301 совместим с сенсором DHT21. Для его работы нужна библиотека DHT. Форков библиотеки DHT существует великое множество, я рекомендую брать версию от Adafruit в которой есть автонастройка на частоту контроллера и которая корректно работает на ESP8266.

Скетч работы с сенсором AM2301

302

Для подключения DS18B20 нужна библиотека OneWire. Полностью совместима с ESP мультиплатформенная версия этой библиотеки

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

Скетч работы с сенсором DS18B20

  • 303

    Ну вот, периферия работает. Дальше я использую существующие свои наработки. Полностью всю прошивку можно взять отсюда

    Особенности прошивки:

    • Автоматическое определение сенсоров AM2301 и DS18B20
    • Длинное нажатие кнопки — вкл/откл режима точки доступа
    • Короткое нажатие кнопки — вкл/откл реле
    • Синий светодиод горит — соединение установлено, двойная вспышка — нет подключения, одинарное мигание — режим точки доступа
    • Локальный WEB-сервер в режиме точки доступа 192.168.4.1
    • при подключении к WiFi по тому IP адресу который настроен
    • Авторизация доступа по паролю. По умолчанию admin/12345
    • Сохранение параметров на сервер в интернете обычным HTTP запросом. Можно настроить любой сервер, например, народный мониторинг. А можно и локальный без всякого интернета.
    • Сохранение настроек в EEPROM
    • При подключении к интернету установка времени по NTP

    config root

    Итог

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

    Тем кто знаком с ESP8266 — Sonoff это экономия на сборке, пайке и деталях, при условии, что вам нужна именно такая конфигурация устройства, как заложена в конкретном модуле Sonoff.

    Самый большой недостаток данных модулей то, что часть GPIO не разведены на разъемы. Ну что стоит сделать компании ITEAD гребенку с 8 pin и завести туда все свободные GPIO от ESP. Я думаю, популярность бы таких модулей при существующей цене сильно бы выросла.

    Для себя я нашел такие сферы приложения данного проекта:

    Контроллер управление вентилятором в ванной. . Правда датчик освещенности придется заменить на цифровой с компаратором, а от дисплея отказаться.

  • Управление фитолампами по расписанию с мониторингом температуры, и датчиком влажности почвы, выдающим частоту на порт GPIO4
  • Сторожевой таймер для роутера DIR320, который я использую для подключения всех ESP у себя дома и который имеет неприятную особенность раз в месяц подвисать не зависимо от прошивки. Заодно мониторить температуру процесора этого роутера

c01

Вы можете оставить отзыв или трекбек со своего сайта.

26 комментариев на «Пишем свою прошивку для модулей Sonoff TH10/16»

  1. user:

    в исходниках по ссылке https://github.com/samopal-pro/custom_th10 похоже мелкая ошибка — в файле WC_HTTP.cpp строка 336 — должно быть примерно так
    if( server.hasArg(«HTTP_PASS») ){
    if( strcmp(server.arg(«HTTP_PASS»).c_str(),»*») != 0 ){
    strcpy(EC_Config.HTTP_PASS,server.arg(«HTTP_PASS»).c_str());
    }
    }

    а не
    if( server.hasArg(«HTTP_PASS») ){
    if( strcmp(server.arg(«HTTP_PASS»).c_str(),»*») != 0 ){
    strcpy(EC_Config.HTTP_PASS,server.arg(«WEB_PASS»).c_str());
    }
    }

    см WEB_PASS

  2. Андрей:

    День добрый.
    А что надо подправить, чтобы он всегда оставался точкой доступа и после пропадании/появлении напряжения реле включалось.
    з.ы. надо для перезагрузки роутера, чтоб ночью через всех не бегать.

  3. Никита:

    Добрый день! Подскажите, есть ли какая нибудь возможность управлять этим модулем с ПК, со стандартной прошивкой?

  4. Mihail:

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

  5. Вася:

    Немного переделал Ваш скетч под себя, на sonoff th16 отлично работает, а вот на sonoff th10 ничего не происходит. Прошивка проходит удачно, но после нет никакой реакции. подскажите, что может быть?
    P.S. Раньше использовал другой скетч, там управление реле было возможно через ссылку типа http:\\ip_address\relay1\1 чтобы включить первое реле. Удобно это тем, чтобы в итоге использовать отдельный вебсервер с управлением всеми устройствами по http-запросам. Можно ли сделать что-то подобное используя ваш скетч?

    • Alexey Alexey:

      На сколько я знаю, Sonoff TH10 от TH16 только реле отличается.
      Правда есть подозрение, что там может другая микросхема EEPROM стоять. на меньший объем.

  6. Сергей:

    К сожалению на GET запросы не реагирует (для управления через GET).
    В идеале прошивку нужно такую, чтобы можно было через POST его настроить (подключение, IP, пароли). А через GET реализовать запрос данных показометра (напряжение, ток, мощность, кол-во секунд с момента включения, потребленная мощность с момента включения) и включение/выключение через GET, а так же запрос текущего состояния реле. Это было бы в идеале для сопряжения с другими системами.
    Я пишу сервер на 1С (мне так привычней), из него удобно GET запросом опрашивать устройства. К сожалению пока еще не разобрался в чем проблема в вашем скетче и как дописать ответы на GET и при этом использовать авторизацию по паролю.

  7. Сергей:

    Предыдущий отзыв относился к статье по Sonoff POW.
    Я уже разобрался со скетчем, дописал запрос мощности, напряжения и тока через GET запрос и управление реле через GET с проверкой пароля для управления.

  8. Алексей:

    Здравствуйте, Алексей!

    Не получается установить поддержку ESP8266 в Arduino IDE. Пробовал v.1.6.5, v.1.8.5 под Win10, WinXP. Во всех случаях выдает ошибку загрузки http://arduino.esp8266.com/package_esp8266com_index.json.
    Что бы это могло быть?

  9. Андрей:

    Здрраствуйте, уважаемый Автор спс вам за проделаную работу, можно ли спросить вас по поводу прошивки, во 1 может ли она работать как сервер для таких де устройств Сонофф, по поводу вайфай что б устройство при падения напряжения запоминало, состояние вайфай, и по поводу управления с компьютера невозможно, а веб морда тогда что управляет, если вам не сложно веб морду может ктото на мыло сбросить, какие там настройки есть,
    и еще можно ли прошить Вот Этим-
    Конвертор USB в TTL UART на чипе PL2303 для программирования Arduino и других устройств

  10. сергей:

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

  11. Саша:

    А можно сделать прошивку, которая позволяла бы устанавливать границу потребляемой нагрузки и при просадке, скажем на 100 ватт выключала реле и включала снова после 10 секундной задержки?

  12. Олег:

    Получаю ошибку (см.ниже)

    sketch/WC_HTTP.cpp: In function ‘void WiFi_begin()’:
    WC_HTTP.cpp:34:37: error: ambiguous overload for ‘operator!=’ (operand types are ‘IPAddress’ and ‘int’)
    if( isConnect && EC_Config.IP != 0 ){
    ^
    sketch/WC_HTTP.cpp:34:37: note: candidates are:
    sketch/WC_HTTP.cpp:34:37: note: operator!=(uint32_t {aka unsigned int}, int)
    sketch/WC_HTTP.cpp:34:37: note: operator!=(u32_t {aka long unsigned int}, int)
    sketch/WC_HTTP.cpp:34:37: note: operator!=(int, int)
    sketch/WC_HTTP.cpp:34:37: note: operator!=(const ip_addr_t* {aka const ip4_addr*}, const ip_addr_t* {aka const ip4_addr*})
    sketch/WC_HTTP.cpp:34:37: note: operator!=(ip_addr_t* {aka ip4_addr*}, ip_addr_t* {aka ip4_addr*})
    In file included from /Users/olegsmychok/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFi.h:31:0,
    from sketch/WC_HTTP.h:10,
    from sketch/WC_HTTP.cpp:8:
    /Users/olegsmychok/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/IPAddress.h:106:14: note: bool IPAddress::operator!=(const IPAddress&) const
    bool operator!=(const IPAddress& addr) const {
    ^
    /Users/olegsmychok/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/IPAddress.h:115:14: note: bool IPAddress::operator!=(uint32_t) const
    bool operator!=(uint32_t addr) const {
    ^
    /Users/olegsmychok/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/IPAddress.h:118:14: note: bool IPAddress::operator!=(u32_t) const
    bool operator!=(u32_t addr) const {
    ^
    exit status 1
    ambiguous overload for ‘operator!=’ (operand types are ‘IPAddress’ and ‘int’)

  13. Сергей:

    Доброго времени суток.
    хочу поделиться своими экспериментами

    у меня без проблем закачивается с такими параметрами:
    библиотеки Core ESP8266 fpr Arduino IDE 2.2.0,
    ардуино ide 1.8.13,
    sonoff th10/16 ver 2.1 (дата на плате 2019.08.26)

    плюс я делал делитель напряжения (2 резистора на 1КОм и 2КОм) т.к. логические уровни +5 и +3,3 разные между RX и RX (я использую мегу, c закороченным RST на землю)

    Пожалуйста подскажите как можно сделать, что бы после включения первым был режим точки доступа т.к. получается, что при обрыве напряжения все сбрасывается и нужно лезть (в моём случае в труднодоступное место) для переключения режима

Ваш отзыв на Андрей

Вы должны войти, чтобы оставлять комментарии.