Зараз закінчую ремонт у квартирі, де було кільканадцять специфічних вимог, зокрема до освітлення. Зокрема керування освітленням повинно бути як доступним як за натиском на вимикач, так і з пульта. Резервний канал – керування із смартфона із будь-якого куточка світу. При цьому це все повинно мати максимально простий та надійний інтерфейс та реалізацію.
Так дійшов до рішення, у якому живлення усіх світильників підводиться до електрощитка, де вже керується специфічним реле. Цю ідею підглянув на ютюб-каналі Great Scott!
Тоді до вимикачів можна підвести низьковольтне керування, зокрема витою парою. Це і економія проводів і простіше підключення. А от у ролі реле – щось із наявних Wi-Fi реле із контактами для фізичної кнопки. Кілька таких подібних продуктів із різним маркуванням можна знайти на AliExpress.
Саме ці модулі із контактами для додаткової кнопки досить важко знайти, навіть щоб впевнитись, що воно варте тих грошей. Проте таки знайшов трохи відгуків, що модулі непогані. А на одному французькому сайті знайшов інформацію, що контакти для кнопки просто дублюють кнопку на модулі і є дійсно низьковольтними.
Ідея можливо хороша, але…
Все було б так, як і задумано, але особиста ситуація внесла корективи і часу чекати модулі з AliExpress не залишилось, а у квартирі вже потрібно жити. Тому взявся робити тимчасове рішення “на вже”.
Враховуючи те, як розведено живлення і як підключені вимикачі, спершу подумав зробити просту аналогову latch-схему на таймері 555. Все ніби просто і надійно, не потребує програмування та мікроконтролерів, а тому за справності використаних компонентів не повинного “глючити”. В теорії, звичайно.
Принцип роботи у тому, що на керуючих контактах (2 і 6) напруга становить половину від напруги живлення (Vcc/2). У такому стані нічого не відбувається і при запуску вихід схеми має низький логічний рівень (0 В). Конденсатор на виході також розряджений. При натиску кнопки конденсатор з’єднується із керуючими контактами, створюючи короткочасне просідання напруги нижче третини напруги живлення (Vcc/3). За такого тригеру мікросхема змінює свій стан, вихід стає логічно високим і конденсатор заряджається до напруги живлення. Повторне натискання на кнопку спричиняє короткочасне зростання напруги вище двох третин напруги живлення (2/3 Vcc), чим переводить мікросхему у вимкнений стан, а тому логічний вихід стає знову низьким. І коло закривається.
Спроба №1
Все виглядає просто, тому зібрав цю схему на прототипній платі. На виході використав твердотіле реле – чудовий варіант для LED-світильників, оскільки немає звуку перемикання контактів і електроди не прикипатимуть. Так, у лабораторних умовах, все запрацювало на ура.
Вимикач вимикав чи вмикав лампочку, час натиску вимикача нічого не змінював, тільки сам факт натиску змінював стан. Встановив вечором цей пробний модуль у квартирі, спробував – все теж працює добре. Тільки от помітив, що дотик до дроту змінює стан реле. Тобто схема надзвичайно чутлива. Головне, що натиск на будь-який вимикач у квартирі робив те, що повинен був, а тому залишив все на тест у бойових умовах.
Зранку були майстри по меблях і скаржились, що світило вимикається або вмикається коли працює електроінструмент. От і велика проблема з цією схемою – за “довгих плечей” до вимикачів, вони починають працювати як антени і реєструють електромагнітні імпульси при запуску потужних споживачів, що тригерить схему. Так діло не піде.
Спроба №2
Тут виникла ідея роз’єднати фізичний вимикач і керуючі контакти. Для цього підійде та ж оптопара. Ідея – при натиску кнопки повинна відкриватись оптопара і притягувати конденсатор на виході до керуючих контактів.
Цього разу розвів схему в EasyEDA, бо так і гарніше і практичніше.
Виготовив плату у домашніх умовах, з використанням персульфату натрію, який просто чудово використовувати у квартирі без страху все забруднити і пошкодити. Для шаблону використовую старенький лазерний принтер HP P1505. І от переніс тонер, трошки поправив маркером і вже на витравленій платі замітив, що лишній раз відзеркалив шаблон, а тому все треба переробляти. Але заодно помітив, що великі полігони вийшли як решето – таки попри ідеальне перенесення тонеру, потрібно маркером ці полігони домалювати, для найкращого ефекту.
Витравив нову плату, спаяв, тестую. І щось дивне. Схема вмикалась лише, якщо рукою торкнутись до керуючого контакту. А вимикалась вже від вимикача. Але сам вимикач освітлення не вмикав.
Дебаг схеми забрав трохи часу тих вихідних, але дійшов висновку, що використання оптопари із тим принципом, який описаний вище – неможливий. Так, коли вихід високий конденсатор має змогу розрядитись і дати імпульс на керуючий контакт. Але потрібного просідання напруги не виникає і схема не може змінити свій стан назад на увімкнутий. Тобто, у мене вийшов буквально “вимикач” – схема, яка тільки вимикає освітлення.
Спроби №3 і 4
Часу не залишалось, а тому за кілька хвилин допаяв Arduino UNO, написав коротенький скечт і до комендантської години встиг поставити нову схему, яка тепер змінювала стан освітлення на натиск кнопки. Все завелось за 10 хвилин, без танців з бубном.
Так дійшов до висновку, що аналог аналогом, а треба робити на мікроконтролері. І згадалось, як мені в коментарях у моєму телеграм каналі писали і за мікроконтролери, і за ESP-01. І ось воно – найкраще рішення. Невеличка плата із Wi-Fi, яка має два вільні GPIO – якраз для кнопки і для реле.
На цю платформу зразу є готове open-source програмне рішення – ESPHome. А тут вже і робота із безліччю сенсорів, і просте налаштування одним файлом, і OTA оновлення. І ще реалізована інтеграція з Home Assistant, зокрема я зможу використати свій сервер для роботи із цим модулем віддалено.
На цьому етапі сів розводити нову схему у тому ж EasyEDA. Тепер схема потребувала регулятора живлення на 3.3 В, але загалом попередні напрацювання не потребували багато змін. Так зробив четверту ревізію вимикача. Але я був би не я, якби не допустив помилок.
Витравивши плату і спаявши все, помітив, що не можу запрограмувати ESP-01. Знову кілька годин дебагу і знайшлась проблема – обидва GPIO у ESP-01 повинні бути високого рівня або плаваючі, щоб схема запустилась. GPIO0 низького рівня при запуску переводить мікроконтролер у режим програмування, а GPIO2 низького рівня спричиняє безкінечний потік помилок у терміналі. У моїй же реалізації кнопка-вимикач була низького рівня і визначався високий рівень як тригер. Та й вихід з реле був низького рівня по-замовчуванню. Тому плата просто не запускалась. Прийшлось перерізати декілька доріжок, а ще допаяти компонентів навісним монтажем, тільки так все і прошивалось і запрацювало справно.
Спроба №5
Навісний монтаж у ламповій техніці я люблю, але не тут. Сів розводити і виготовляти нову, п’яту, ревізію плати. І, о чудо, все запрацювало з першого разу. Вимикач вимикав і вмикав реле, стан відправлявся на MQTT сервер, який слухав мій Home Assistant, а з останнього я міг не тільки спостерігати стан кнопок, а ще й керувати реле. Чудово, несу монтувати на локацію. Поставив, перевірив справність і залишив на ніч. Але зранку мене догнала ще одна проблема.
Оскільки блок живлення використаний на 12 В, через те, що наявне реле потребувало саме 12 В, то для ESP-01 знижував напругу лінійним стабілізатором LT1083. Споживання ESP-01 становить приблизно 70 мА. А оскільки лінійний стабілізатор залишкову енергію трансформує у тепло, то він генерував 0,07 А * (12 В – 3,3 В) = 0,6 Вт. Це ніби і не багато, але при роботі Wi-Fi споживання зростало до 140 мА, а з цим кількість тепла зростала до 1,2 Вт, що вже на межі можливостей корпусу TO-220. Треба радіатор, однозначно. Ну що ж, шоста ревізія так шоста.
Спроба №6
Гербер-файл доступний ТУТ. А ось тут – шаблон для домашнього виготовлення плати.
Розвів і виготовив нову плату із радіатором, а ще змінив розміщення контактів UART. Щоб запрограмувати мікроконтролер, достатньо замкнути два контакти біля оптопари – це притягне GPIO0 до землі і переведе схему у режим прошивання при запуску. Сам контакт для UART справа має наступну послідовність – GND, Tx, Rx, Vcc, RST, GND. Остання земля суто для зручності перевантаження плати. Послідовність перших чотирьох контактів така, щоб зручно було використовувати програматори із контактами послідовністю GND, Rx, Tx, Vcc. Ну і потрібно пам’ятати, що ESP-01 не толерантний до 5 В, а тому програматор повинен працювати із рівнями тільки 3.3 В.
Тут ще виникла ідея – а що якщо використовувати Tx та Rx контакти замість власне UART для чогось іншого корисного вже після прошивання. Наприклад, для сенсорів. Взявся запрограмувати сенсор BMP280 – датчик тиску із зв’язком по I2C, для якого потрібні якраз два контакти. І, на диво, все завелось з першого ж разу.
Круто, але мені значення тиску не цікаві. З наявних на руках сенсорів знайшлись DS18B20 та DHT11 – перший дає досить точне значення температури, другий дає умовно точне значення вологості і температури. А головне – кожен потребує по одному контакті для даних, а тому якраз утилізовують два доступні контакти. Запрограмував плату і все теж завелось зразу же. Вийшла можливість використовувати додаткові плати розширення, нова функція, яку явно не можуть надати вищезгадані готові китайські Wi-Fi реле!
Залізо є, тепер прошивка.
Щодо ESPHome, то конфігурація досить проста. Я вибрав шлях із використанням Docker – простий і без потреби наявності потрібного середовища на комп’ютері – просто встановив потрібний мені контейнер і працював із ним.
$ docker pull ghcr.io/esphome/esphome
Далі з допомогою помічника згенерував початкову конфігурацію. Після цього потрібно лише буде змінювати цей згенерований файл.
$ docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome wizard switch.yaml
Після генерації можна зразу спробувати прошити вашу плату на основі ESP8266/ESP32 або ж розширити можливості згідно доступного на сайті. Щоб остаточно прошити мікроконтролер потрібно виконати наступну команду:
$ docker run --rm --privileged -v "${PWD}":/config --device=/dev/ttyUSB0 -it ghcr.io/esphome/esphome run switch.yaml
Тут /dev/ttyUSB0 це адреса вашого програматора.
Якщо все пройшло успішно і логер не був відключеним, то відкриється термінал із даними з того таки логера.
Приклади моїх налаштувань далі. Спершу приклад із використанням сенсора BMP280 на контактах Rx та Tx у платі ESP-01:
esphome:
name: pym_switch
esp8266:
board: esp01
wifi:
ssid: "my_secure_wifi"
password: "cnVzbmlfcCF6ZEA="
fast_connect: true
ap:
ssid: "Switch Fallback Hotspot"
password: ""
logger:
baud_rate: 0
i2c:
sda: GPIO1 # Tx
scl: GPIO3 # Rx
scan: true
id: bus_a
captive_portal:
web_server:
port: 80
binary_sensor:
- platform: gpio
internal: false
name: "ESPHome Light Switch"
pin:
number: GPIO0
inverted: true
id: pym_input_btn
filters:
delayed_off: 100ms
on_click:
min_length: 150ms
max_length: 5s
then:
- switch.toggle: pym_output_relay
sensor:
- platform: uptime
name: "ESPHome Uptime"
- platform: wifi_signal
name: "ESPHome WiFi Signal Sensor"
- platform: bmp280
temperature:
name: "ESPHome Temperature"
oversampling: 16x
pressure:
name: "ESPHome Pressure"
address: 0x76
update_interval: 60s
switch:
- platform: gpio
internal: false
name: "ESPHome Light"
pin:
number: GPIO2
inverted: true
id: pym_output_relay
mqtt:
broker: "my.mqtt.broker.url.com"
port: 1883
username: "some_secure_login"
password: "cnVzbmlfcCF6ZEA="
А ось приклад із використанням сенсорів DS18B20 та DHT11 на тих же портах:
esphome:
name: pym_switch
esp8266:
board: esp01
wifi:
ssid: "my_secure_wifi"
password: "cnVzbmlfcCF6ZEA="
fast_connect: true
ap:
ssid: "Switch Fallback Hotspot"
password: ""
logger:
baud_rate: 0
captive_portal:
web_server:
port: 80
binary_sensor:
- platform: gpio
internal: false
name: "ESPHome Light Switch"
pin:
number: GPIO0
inverted: true
id: pym_input_btn
filters:
delayed_off: 100ms
on_click:
min_length: 150ms
max_length: 5s
then:
- switch.toggle: pym_output_relay
dallas:
- pin: GPIO1
sensor:
- platform: uptime
name: "ESPHome Uptime"
- platform: wifi_signal
name: "ESPHome WiFi Signal Sensor"
- platform: dallas
index: 0
name: "ESPHome DS18B20 Temperature"
- platform: dht
model: "DHT11"
pin: GPIO3
temperature:
name: "ESPHome DHT11 Temperature"
humidity:
name: "ESPHome DHT11 Humidity"
update_interval: 60s
switch:
- platform: gpio
internal: false
name: "ESPHome Light"
pin:
number: GPIO2
inverted: true
id: pym_output_relay
mqtt:
broker: "my.mqtt.broker.url.com"
port: 1883
username: "some_secure_login"
password: "cnVzbmlfcCF6ZEA="
Навіть коли все здавалось готове, не буває без приколів.
Вже під час тестування із навантаження стався ElectroBOOM moment – я переплутав контакти і підключив 220 В до контактів кнопки. Від цього яскраво засвітився резистор і, як вже дізнався потім, згоріла оптопара. Проте решта схеми вижила і після заміни оптопари з резистором все запрацювало.
Зараз воно працює вже декілька днів, освітлення керується що вимикачами, що з Home Assistant – все без проблем. Температура на радіаторі LT1083 досягає максимум 55 градусів. А споживання всієї схеми становить 1,2 Вт при вимкнутому реле та 2 Вт – за комутації.
Сенсори теж присилають всі показники в Home Assistant. А ще ESPHome має гарну сторінку, де можна оглянути дані із сенсорів та змінити стан реле.
Замість висновків
Тепер вирішив, що не буду купувати китайські рішення невідомої якості, а сам розроблю хаб керування освітлення на всі світильники, цього разу на ESP32 та з використанням DC-DC конвертора (замість LT1083). При цьому замовлю виготовлення плати і все поміщу у корпус на DIN-рейку. Має вийти не гірше заводського рішення, а головне – можливостей із ESPHome буде безліч.
Нахрена MQTT если в esphome в home assiatant залетает сам, нативно?
MQTT використав, оскільки фізично ESPHome модуль знаходиться у іншому будинку, тут тільки зв’язок через інтернет.
кнопку в интерфейс выводить бессмысленно – aeyrwbjyfkf bkb byajhvfnbdyjcnb jn ytt 0, только захламляет. поставь internal: true или убери это и имя, а оставь только id
DHT11 просто выкинь. совсем. и забудь про него навсегда!!
бмешку откалибруй по температуре по далласу и оставь ее. даллас – это эталон. точнее не бывает. при разной температуре будет разная погрешность(. датчики должны находиться максимально близко друг к другу и изменение температуры должно быть плавным, чтобы оба могли отработать.
еще не заметил резюка с далласом. должен быть 4к7 между ногами питания и дата. без него может глючить.
esp32 для простых вещей необоснованно дорого. d1 mini очень классные.
а если нужна сила, мощь и надежность, да еще и по проводу, то WT32-ETH01
Кнопка суто тестово, я бачу як моя теща користується вимикачем (вона в курсі, бере повноцінну участь в тестуванні), потім викину, згоден що лишнє.
DHT11 був в наявності, було цікаво чи заведеться як таке. Хочу Si7021, це зразу і достатньо достовірна температура і вологість. Друге теж важливо з огляду на ситуацію, просто всі наявні Si7021 я десь задіяв. BMP280 буде менш точніша.
Pull-up на OneWire є, 4,7кОм , куди без нього, тільки маленький, на 0,25 Вт, тому не видно.
За light буду пробувати, дякую за ідею.
ESP32 дорого, але дасть кращу підтримку езернету (є ідея такий же модуль на ще одну локацію встановити, а там тільки езернет; і так мінімальне замовлення на jlcpcb – 5 плат), плюс буде мати нативно всі потрібні входи-виходи без розширювачів GPIO.