Недавно делал обзор на
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;
}
Ну вот, периферия работает. Дальше я использую существующие свои наработки.
Полностью всю прошивку можно взять отсюда
Особенности прошивки:
Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Классный обзор. Как раз собираю материалы подобный этому — нужно родителям в теплицу сделать контроллер. Ну по сути на первых этапах только влажность и температуру показывать в браузере. Далее каким то образом управлять отоплением теплицы посредством газа (контроль поджига, затухания пламени ит.д) хз как, но надо :-)
Много интересных наработок.
:)
Но я так и не понял Sonoff TH 10A/16A — идет с датчиками? Или датчики у них отдельной позицией?
$4.3 AM2301 с проводом
$3.5 DS18B20 с проводом водонепоницаемый
+ доставка
Из плюсов Sonoff — корпус. Цена в принципе такая же.
По поводу кучи GPIO — у ESP их в принципе мало. Но согласен, три GPIO на моем модуле производитель «закроил». Если они в вашем разведены, то это безусловно плюс.
По поводу цены — доставка сколько обойдется?
Единственный минус — реле слабей(5А и тонкие дорожки до реле), чем в Sonoff. Для мощной нагрузки понадобится контактор.
Теперь показывает через раз, но правильно )))
(sprintf(str,«Tемпература: %02d °C…
»,(int)Temp1)
убрать (int), или поменять на (float)- выдаёт нули…
А можно сделать, чтобы главная страница сама обновлялась через каждые 10 секунд?
Подключен датчик DS18B20. Не показывает отрицательную температуру. То есть он показывает ее, но без знака -(минус).
Что +5, что -5 показывает просто 5. Меряет точно, но без знака -(минус).
Из-за этого проблемы с автоматическим режимом.
Firmware 2.0.1, версия ПО 2.2.5.
В фаренгейтах показывает что плюс, видимо берет градус цельсия и пересчитывает по формуле.
При переносе датчика из тепла в холод и обратно, переходит через 0(32 по фаренгейту).
Подскажите, в чем дело?