Авторизация
Зарегистрироваться

avatar RSS блога Подписка

Делаем свою прошивку для 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 Правил сайта.
Планирую купить +55 Добавить в избранное +56 +111
свернуть развернуть
Комментарии (21)
RSS
+
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
0
Обновилась прошивка до 2.0.2. Теперь все нормально.

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.