[Из песочницы] Таймер — начало

yzs9r3pd5_c6uacf0cvy0wbl9r8.jpeg Все началось с него. Это была первая моя покупка на Алиэкспресс для первой автоматизации на даче — захотелось сделать автополив в теплице. Таймер пришел в помятой коробке, с треснутым защитным колпаком, но рабочий. Он прекрасно отработал весь летний сезон поливая огурцы.На зиму был снят и спрятан в теплое и сухое место. Но на следующий сезон меня ждал неприятный сюрприз — таймер стал зависать, переставал реагировать на кнопки управления и открывать воду. Сначала я грешил на дешевые батарейки и заменил их на фирменные Duraсell. Думал проблема в питании и пусковых токах. Не помогло. Тогда я достал паяльник и пропаял в нем все, что только можно, даже добавил некоторые недостающие конденсаторы. Но он упорно продолжал зависать. К сожалению, изделие не очень ремонтопригодно — в том что было у меня используется бескорпусная микросхема-капля и, видимо, что-то расконтачилось именно под компаундом с микросхемой. Кое-как сезон был закончен с таким барахлящим таймером и я начал думать чем же мне его заменить.
Первые мысли были взять модуль Arduino Mini, модуль часов, индикатор и как-то все это запихать в корпус сломанного таймера и задействовать его родной моторчик и шаровой клапан. Но как-то оно туда не очень лезло, потребляло бы оно явно больше оригинальной начинки (а значит можно забыть о батарейках в корпусе) и это было скучно и не масштабируемо — поливать уже хотелось не только теплицу, а сломанный таймер был только один.
 
И тут на Али мне на глаза попался нормальный моторизованный шаровой кран. Вот такой красавец:

zumdc50whupl9mloczorxcmo6sg.jpeg
 
Да он стоил приличных денег, но его не страшно было подключить с летнему водопроводу и оставить на неделю без присмотра. Он вообще довольно добротный, хоть и с пластиковым редуктором — сейчас пара таких кранов трудятся у меня на основном водопроводе, где давление 5атм.
 
Идея была проста. В ящике стола ждала своего часа платочка с WiFi-модулем ESP8266. От экономии питания было решено отказаться в пользу б/у автомобильного аккумулятора, которого по расчетам должно было хватать как минимум на месяц автономной работы устройства.Чтобы не проворонить момент разряда АКБ, в схеме был предусмотрен делитель, через который встроенный АЦП ESP8266 непрерывно измерял напряжение питания. Часами в схеме должен был служить модуль DS3231 с батарейкой, а понижать напряжение с 12В до 3.3В должна была платочка на м/с MP1584EN. 
 
Вот блок-схема прототипа:

qr23j6rhqqseg_haa2kevuaglqc.png

А вот фото его реализации
ux80-pghlpqxovrie-igtxbpuee.jpeg

уже слегка разобранная реализация — модуль DC-DC ушел в боевой кран, модуль часов на обратной стороне макетной платы


Управление мотором крана тут сделано просто — какие транзисторы нашлись в ящике стола, те и поставил. В реальности, мотором можно управлять например через м/с ULN2003 включив параллельно несколько каналов или полевыми транзисторами с логическим управлением или вообще через модуль реле с опторазвязкой. Нужно только учесть, что мотор при рабочем токе порядка 70 мА, имеет пусковой ток (и ток в момент блокировки вращения) порядка 300–350 мА.
 
Быстренько бы написан скетч на Arduino с простым Web-интерфейсом:

vq1urcw-ttzsjbbvcm7nbcxcuky.jpeg
 
И прототип встал на тестовое дежурство. Web-интерфейс крана я пробросил через роутер и устройство было постоянно доступно онлайн.
 
А мысли побежали дальше. Один прототип это хорошо, но хочется несколько таких кранов и делать это все на макетных платах не вариант. Кран был вскрыт. И стало видно, что внутри там очень много места под герметичной крышкой и даже есть крепежные места:

rttc3f_0uzhnlpjql2vp4ds-nvm.jpeg
 
В том кране, который использовался в прототипе, под крышкой была маленькая плата с реле, которая обеспечивала логику управления. А на фото кран с индексом CR05. В этих кранах нет никакой логики и плат. Просто выведены провода управления мотором и провода концевых выключателей. И управлять такими кранами надо сменой полярности напряжения на моторе. При этом сильно желательно контролировать моменты окончания закрытия/открытия по концевикам тк мы помним, что ток в эти моменты уже 300–350 мА.
 
Блок схема начала вырисовываться такая:

aea1uvc0g09wxdkdyxoioq8t8z8.png
 
Теперь берем в руки штангенциркуль, лист бумаги и начинаем снимать размеры, рисовать контур печатной платы и пытаться разместить на ней компоненты. От крупной батарейки CR2032 прошлось отказаться и применить мелкую CR1220(или 1225). Очень долго подбиралась микросхема Н-моста для управления мотором. Выбор вроде большой, но очень много этих микросхем, либо не могут работать при напряжении питания 12В, либо используют биполярные транзисторы с очень большим падением напряжения, ну или корпус неудачный. Микросхема TB6612 сначала долго не попадалась на глаза, а потом казалась сильно избыточной и неудобной для пайки. Но в конечном итоге остановился именно на ней — она доступная и недорогая на Али. H-мост там построен на полевых транзисторах и может работать при напряжении до 15 вольт. Модуль DC-DC преобразователя (MP1584EN) оставил модулем — это оказалось просто дешевле по деталям и распаивать его просто. Главное, для надежности, заменить в нем подстроечный резистор напряжения на постоянный (27кОм — даст выходное напряжение 3.4В ).Микросхему часов можно было применить и в более компактном корпусе, но был один нюанс — все комплектующие я собирался заказывать на Али и был риск получить поддельные или нерабочие микросхемы. Поэтому на начальном этапе все микросхемы планировалось покупать в составе готовых модулей и перепаивать на разработанную плату. А в модулях часы были только в корпусе SO16. По факту, только одна микросхема часов оказалась с браком или плохой подделкой — частота кварца у нее была 32727 при положенных 32768кГц.
 
После всех подготовительных работ, берем KiKad,  немного гуглим в поисках недостающих посадочных мест, некоторые компоненты рисуем сами и начинаем разводить плату:
 
vjzfcyt6qukg3sj5mev5xhkzcem.jpeg

Проверяем ее, распечатывая в масштабе 1:1. Прикладываем детали и модули и, если все совпадает, подготавливаем Gerber-файлы для производства и отправляем в EasyEda. Через 3 недели получаем 10 симпатичных платочек и собираем их.

uijnhsbq8zqklcjm1n-pjhpax-c.jpeg
На фото их осталось 5, остальные все работают

dn8cnx12fhixuzkxywboqkqfmou.jpeg
Модуль в сборе
 
Дырки для крепежа, конечно сразу, немного не совпали ,  некоторые посадочные места получились не такими как хотелось, но в целом изделие, после сборки и прошивки, заработало сразу. На Али были куплены герметичные хвостики питания, пропущены через штатный гермоввод в корпусе и WiFi кран-таймер приобрел законченный заводской вид:

kzrnzyqalg_t_jsrrrjegdvc98q.jpeg

Вот пара кранов на боевом дежурство на даче:

на посту
dasxds16utudu8su6efnv46dixy.jpeg
 


Но тут мысль опять побежала дальше. Автоматизации на даче захотелось больше, а модуль получился довольно компактный и универсальный. Через H-мост вполне себе можно управлять обычным реле. Для DIY автоматизации многие берут Sonoff, а тут получается я сам себе не хуже могу сделать.
 
И тут начинается трансформация простого Wi-Fi крана в то,  что получило кодовое название SHAPEsp — сокращение от Esp8266 based Smart Home Automation Platform. По задумке это должно стать недорогим универсальным модулем для домашней автоматизации. Причем это все должно быть надежным и выглядеть законченным изделием после сборки в доступный корпус.
 
Удивительное дело, но оказалось что в китайский корпус с Алиэкспресс на 2DIN юнита прекрасно, тютелька в тютельку, помещается популярный преобразователь AC/DC 220В/12В HiLink (ну или его клон), реле и силовой разъем, ну и конечно мой слегка переразведенный модуль с ESP8266, часами и H-мостом.
 

Делай раз
bpwmxkb9rxu-mxso9_fbiz9wc4q.jpeg 


Делай два
okjdd-orz-ecgzujbub-j-p2hzc.jpeg


Делай три
_iipjmuknwsvpqelavmsrxrj3t0.jpeg
модуль можно установить как в корпус крана, так и в DIN-реечный корпус


И получаем:

ht2xuiatsx_ckjmyit2ihczozh4.jpeg
 
Немного изменил форму модуля. Добавил ему краевых разъемов, чтобы он просто мог стоять вертикально в 2DIN корпусе. Разместил на верхнем торце платы индикаторные светодиоды, которые видны на просвет в пластиковом корпусе. Ну и развел плату носителя для реле и источника питания. Чтобы было дешевле,  все это было отправлено в производство одной платой:

un5jz2k4nzvoo1g4bhkhdyik7bq.jpeg

Собрал два таких прототипа и поставил их на даче управлять включением конвекторов для зимних наездов:
 

На другом посту
2tyopox-lcaqrqdd6yb3j8fqb3i.jpeg
Один из модулей в щитке, рядом с парой контакторов которые включают конвекторы


Но потом решил его еще больше улучшить и сделать более универсальными. Для более надежной и удобной прошивки разместил на модуле схему прошивки от NodeMcu. Вывел все возможные пины и добавил контактных площадок для удобства подключения разных датчиков. Все краевые пины разместил с шагом 2.54 мм, так что модуль можно воткнуть в breadboard макетную плату. Естественно опробовал подключение термометра ds1820, комбинированного датчика BME280 и датчика влажности на компараторе. Получилось что, кроме простого таймера с реле или краном, можно легко построить метеостанцию или например систему аквастоп. Ну и всякие другие системы извещения и управления…
 
Увлекшись, нарисовал модель своего модуля для Fritzing. Так что можно оценить и повертеть различные варианты применения виртуально:
 
obrsqm8tbnl6mknximfdzp7ossc.png
 
Ссылка на GitHub модели есть внизу статьи.
 
Ну, а дальше начинается самая сложная часть — программная поддержка модуля. Изначально я все тестировал и испытывал со своим довольно простым Arduino-скетчем. Простой HTML, немного Java-скрипта, разные простые способы передачи данных, только нужный мне функционал таймера и некоторых датчиков. Но довольно быстро стало понятно что освоить все и вся в современном мире IoT и умного домостроения будет не так-то просто. А также просто лень (тут улыбчивый смайлик). И еще иногда не хочется изобретать велосипеды.
 
Поэтому было принято решение посмотреть что же есть из готовых прошивок в которые можно добавить поддержку своего модуля. Как отправная точка были взяты альтернативные прошивки для изделий Sonoff: Sonoff-Tasmota, ESPurna, ESPEasy. Поиском можно найти сравнительные обзоры этих прошивок.

Например:

https://lobradov.github.io/FOSS-Firmware-comparison-overview/

https://lobradov.github.io/FOSS-Firmware-comparison-developers/

В реальности, я как-то глазом пробежав исходные тексты в репозиториях этих прошивок, понял что проще всего мне будет добавить свой модуль в прошивку ESPurna. Код прошивки был довольно разумно структурирован и изначально предполагал добавление новых модулей и функций. В прошивке был обязательно нужный мне функционал таймера — автономный Sheduler. Более того, можно сказать из коробки, просто описав свою конфигурацию с простым реле в файле hardware.h,  я получил уже рабочий вариант прошивки WiFi-реле.
 
Однако у моего модуля был более богатый и сложный функционал. И было принято решение контрибутить в прошивку. С одной стороны это довольно просто — пишем функционал и делаем pull-реквест, но в реальности это нудный и долгий процесс с не всегда положительным или быстрым результатом. Это издержки того что предлагаемый функционал по большому счету нужен только мне и моей неизвестной плате.
 
Начал я с поддержки часов. В прошивке ESPurna все работало через NTP и библиотеку Time для arduino — ну так исторически сложилось, что знать время нужно, а у изделий Sonoff автономных часов нет и предполагается что они всегда имеют доступ в интернет. Для поддержки RTC часов я написал простенький модуль, который при желании подменял функцию провайдера времени с чистого NTP на NTP+RTC. Принцип был прост — если недоступна синхронизация по NTP, то пытаемся читать время из локальных часов RTC. При появлении доступа к NTP серверам восстанавливаем синхронизацию и при желании синхронизируем локальные часы. Так часы на моем модуле включились в работу. Pull-реквест довольно быстро приняли, но лег он в отдельной ветке espurna-rtc.
 
Следующим был тривиальный pull-реквест. Так как я измеряю напряжение питания до DC-DC преобразователя, чтобы отследить разряд АКБ, то мне нужен был мониторинг не напряжения питания модуля ESP8266, а некоторого пользовательского. Что я и оформил в виде pull-реквеста «add support for custom VCC monitoring». Но этот запрос как-то повис в воздухе… и желание контрибутить как-то утихло.
 
Кроме этого стало очевидно что добавить свой модуль в список поддерживаемых законченных устройств будет не так-то просто — у него возможна куча разных конфигураций. Поэтому было принято решение просто развивать свой форк прошивки. И по возможности и желанию поддерживать синхронизацию, делать pull-реквесты или предлагать cherry-pick в основной репозиторий прошивки.
 
После такого решения все стало проще. В прошивке была частична переписана система управления реле. В нее был добавлен режим управления H-мостом и она стала более удобной в плане добавления пользовательских режимов работы реле.
 
Дальнейшее изучение кода прошивки показало, что ее рефакторить не перерефакторить. Стиль написания и использования ресурсов местами очень жесток для микроконтроллера (хоть он и довольно шустрый 32-битный). Например система выдачи отладочных сообщений пожирала стек с огромной скоростью, но при этом, чтобы просто не уронить всю систему, блокировалась когда размер стека становился меньше 10кБайт. Я немного переписал код в своей ветке так что теперь все отладочные сообщения и подсказки в консоли выводятся полностью.
 
Ну и на текущий момент в прошивку была добавлена подсистема расчета
восходов/закатов солнца и виртуальный сенсор SunriseSensor, так что можно из модуля SHAPEsp соорудить простое астрономическое реле. Надо будет собраться с духом и закоммитить в основной репозиторий. Думаю что это полезный функционал.
 
Вот такая история трансформации DIY идеи от прототипа до практически готового изделия. Возможно востребованного изделия. Самое удивительно, что я еще так и не опробовал никаких систем умного дома — все модули трудятся у меня совершенно автономно друг от друга и просто доступны через web-интерфейсы в интернете. А купленная когда-то плата OrangePi PC лежит в ящике стола и ждет своего часа, чтобы стать контроллером умного дома.
 
Список ссылок:

  1. Модель Fritzing и как соберусь с силами думаю будут схема и разводка модуля в Kikad
  2. Простая тестовая прошивка для модуля
  3. Форк прошивки ESPurna с поддержкой модуля
  4. Основной репозиторий прошивки ESPurna

© Habrahabr.ru