Делаем свою прошивку для SONOFF TH10/16


Недавно делал обзор на Sonoff POW с печальным концом где в комментариях задавались много вопросов, на которые попытаюсь ответить в этом обзоре.
Итак, представляю обзор на «умный» выключатель с датчиками влажности и температуры Sonoff TH10 c разработкой собственной прошивки для него.

Модули Sonoff TH10/16 с подключаемыми датчиками DS18B20 и AM2301 уже неоднократно обозревались на этом сайте. На мой взгляд, хорошо раскрывают их возможности этот и этот обзоры, где описывается использование альтернативных прошивок с доступом к MQTT серверу.
Я хочу предложить еще один подход к использованию устройств Sonoff — разработка собственной прошивки в среде Arduino IDE.

Sonoff мне понравились как законченное устройство на ESP8266, начиная от упаковки

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


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


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

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

Сравнивать Sonoff с модулями ESP8266 не совсем корректно, так как к этим модулям нужно еще массу всего в совокупности с прямыми руками для получения конечных устройств

лично у меня внутренностям многих моих контроллеров есть куда улучшаться )))


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

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

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

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


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

Так как многие долго мучаются с прошивкой ESP8266 опишу этот этап подробно
Настройка Arduino IDE для работы с ESP
Очень рекомендую установить Arduino IDE 1.6.5, так как в более поздних версиях много глюков с Core ESP8266.

Для установки Core ESP8266 for Arduino запустите среду разработки.
Файл -> Настройки
и пропишите URL поддержки плат ESP: arduino.esp8266.com/package_esp8266com_index.json


После этого в менеджере плат
Инструменты -> Плата -> Board Manager
появится поддержка ESP8266. Можно выбрать последнюю версию и нажать INSTALL

В списке контроллеров должен появиться ESP8266. Sonoff используют 1Мбайт флэша, поэтому нужно установить этот размер в настройках


Если Sonoff у вас подключен к USB/TTL, порт настроен, откройте
Инструменты -> Монитор последовательного порта
на скорости 115200
нажмите кнопку 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);    
}

void loop() {
  digitalWrite(PIN_RELAY,HIGH);
  digitalWrite(PIN_LED2, HIGH);
  delay(500);
  digitalWrite(PIN_RELAY,LOW);
  digitalWrite(PIN_LED2, LOW);
  delay(500);
}



Светодиоды работают в противофазе. Синий загорается, когда на нем низкий уровень. Реле срабатывать не должно из за отсутствия питания 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 /li>
  • Для любителей MQTT легко прикручивается готовая библиотека. Но это уже за пределами данного обзора
    Небольшой лайфхак - превращаем Sonoff TH10 в TH16
    После того, как у меня сгорел Sonoff POW, среди целых деталей осталось реле на 16А. Поэтому легким движением паяльника я превращаю TH10 в TH16. Блвго — реле полностью совместимы по цоколю.


    Предохранитель можно не менять, в обоих модулях он на 20А.

    Подведем итог.

    SONOFF — это удобная платформа в первую очередь для тех, кто может самостоятельно разрабатывать и дорабатывать управляющие программы. Тем кто знаком с ESP8266 — Sonoff это экономия на сборке, пайке и деталях, при условии, что вам нужна именно такая конфигурация устройства, как заложена в конкретном модуле SonoffСамый большой недостаток данных модулей то, что часть GPIO не разведены на разъемы. Ну что стоит сделать компании ITEAD гребенку с 8 pin и завести туда все свободные GPIO от ESP. Я думаю, популярность бы таких модулей при существующей цене сильно бы выросла.Для себя я нашел три актуальных сферы приложения данного проекта:
    • Контроллер управление вентилятором в ванной. Правда датчик освещенности придется заменить на цифровой с компаратором, а от дисплея отказаться.
    • Управление фитолампами по расписанию с мониторингом температуры, и датчиком влажности почвы, выдающим частоту на порт GPIO4
    • Сторожевой таймер для роутера DIR320, который я использую для подключения всех ESP у себя дома и который имеет неприятную особенность раз в месяц подвисать не зависимо от прошивки. Заодно мониторить температуру процесора этого роутера
    Компании ITEAD я свои пожелания написал. Посмотрим, какими будут следующие устройства Sonoff.
    Всем самодельщикам - успехов



Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Планирую купить +73 Добавить в избранное +57 +113
+
avatar
+5
К обзорам по п.18 отношусь настороженно, но здесь сказать нечего, МОЛОДЕЦ!
+
avatar
  • warik
  • 17 октября 2016, 00:54
+3
Самопал (sav13) всегда писал качественные обзоры на Муське и отличные статьи на своём сайте, независимо от п. 18. Такой уж человек, по всей видимости.
+
avatar
  • Z2K
  • 18 октября 2016, 01:17
0
Такой уж человек, по всей видимости.
— да уж, та еще редиска. :)))) {irony}
+
avatar
  • SNB
  • 16 октября 2016, 13:26
+1
По больше бы таких обзоров. Колхоз реально помогает делать то, что не получается купить!
+
avatar
  • Omega
  • 16 октября 2016, 13:29
+2
Дочитав обзор до середины ( где фото нескольких esp) я понял кто будет автором статьи :-)
Классный обзор. Как раз собираю материалы подобный этому — нужно родителям в теплицу сделать контроллер. Ну по сути на первых этапах только влажность и температуру показывать в браузере. Далее каким то образом управлять отоплением теплицы посредством газа (контроль поджига, затухания пламени ит.д) хз как, но надо :-)
+
avatar
0
За труды: плюс в карму, плюс за обзор и просто респект!
Много интересных наработок.
+
avatar
  • SEM
  • 16 октября 2016, 15:13
+2
Комментариев под обзором так мало не потому что обзор не интересный, а потому что они излишни…
+
avatar
  • sim31r
  • 16 октября 2016, 20:50
0
Ну статья продолжение предыдущих, я вот ушел читать исходную статью, без нее не понятно. И тема весьма специфична для домашних поделок:
… использование альтернативных прошивок с доступом к MQTT серверу.
:)
+
avatar
  • Z2K
  • 18 октября 2016, 02:21
0
Семь комментов — да уж, ни унять ни добавить. Все четко.
+
avatar
  • Last_One
  • 18 октября 2016, 19:07
0
Спасибо за обзор.
Но я так и не понял Sonoff TH 10A/16A — идет с датчиками? Или датчики у них отдельной позицией?
+
avatar
  • sav13
  • 18 октября 2016, 19:28
0
Отдельной позицией
$4.3 AM2301 с проводом
$3.5 DS18B20 с проводом водонепоницаемый
+ доставка
+
avatar
+1
Мне кажется, этот модуль www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266/ намного интереснее Sonoff. Реле — 2шт и куча выведенных GPIO, а цена никакая. У меня одна такая есть, проверил — все работает. До серьезных экспериментов пока не дошел.
+
avatar
  • sav13
  • 27 октября 2016, 05:34
+1
Скоро приедет Sonoff Duo с двумя реле. Делайте обзор на свою — сравним.
Из плюсов Sonoff — корпус. Цена в принципе такая же.
По поводу кучи GPIO — у ESP их в принципе мало. Но согласен, три GPIO на моем модуле производитель «закроил». Если они в вашем разведены, то это безусловно плюс.

По поводу цены — доставка сколько обойдется?
+
avatar
+1
Корпус у этого реле тоже в наличии (на фотках он виден), доставка стоит столько же, сколько и в Sonoff. GPIO в нем вот столько:


Единственный минус — реле слабей(5А и тонкие дорожки до реле), чем в Sonoff. Для мощной нагрузки понадобится контактор.
+
avatar
  • Evgenij
  • 27 октября 2016, 01:08
0
Я залил эту прошивку. Подключил только 18В20. Почему-то температура отображается то нормально, то через раз T=2147483647. Что исправить в программе?
+
avatar
  • sav13
  • 27 октября 2016, 05:39
0
Да. Что то в примере или библиотеке накосячено. Видимо у термометра какие то регистры не сбрасываются. Разбираться не стал, так как с этим датчиком не планирую использовать, сделал проще


float t = GetDS18X20();
  if( t!= ERROR_VALUE ){
     Serial.print("Temperature=");
     Serial.print(t,1);
     Serial.println(" C");
  }

Теперь показывает через раз, но правильно )))
+
avatar
  • Evgenij
  • 28 октября 2016, 16:02
0
А как сделать, чтобы на WEB-странице температура отображалась не целым числом, а с одним знаком после запятой? Пробовал в этой строке:
(sprintf(str,«Tемпература: %02d °C…
»,(int)Temp1)

убрать (int), или поменять на (float)- выдаёт нули…
+
avatar
  • sav13
  • 28 октября 2016, 16:34
0
Float значение в Wiringе не работает. Поэтому я делаю так.
float T;
sprintf(str,"%0d.%0d C",(int)T, (int)((T*10)%10));
+
avatar
  • Evgenij
  • 29 октября 2016, 00:45
0
Спасибо, разобрался :).
А можно сделать, чтобы главная страница сама обновлялась через каждые 10 секунд?
+
avatar
  • kvadra4
  • 23 ноября 2016, 10:00
0
Извиняюсь что не по теме.
Подключен датчик DS18B20. Не показывает отрицательную температуру. То есть он показывает ее, но без знака -(минус).
Что +5, что -5 показывает просто 5. Меряет точно, но без знака -(минус).
Из-за этого проблемы с автоматическим режимом.
Firmware 2.0.1, версия ПО 2.2.5.
В фаренгейтах показывает что плюс, видимо берет градус цельсия и пересчитывает по формуле.
При переносе датчика из тепла в холод и обратно, переходит через 0(32 по фаренгейту).
Подскажите, в чем дело?
+
avatar
  • kvadra4
  • 26 ноября 2016, 09:00
+1
Обновилась прошивка до 2.0.2. Теперь все нормально.
+
avatar
0
Добрый день! Подскажите, пожалуйста, пробовал к контактам кнопки подпаять реле, всё работало хорошо, но задел провода, пришлось разбирать, ещё раз подпаять. Теперь кнопка не работает вообще. Даже базовая. Сопротивление между ногами есть, при нажатии нет, т.е. кнопка работает. Замерил напряжение между ногой кнопки и 3.3в, на ближней к катушке ноге кнопки 3.3в, на дальней — 0. При замыкании 3.3в. Но напряжение между ногами кнопки — 0в