Зачем?
Даже в этом хабе наблюдается повышение интереса к IoT, по моему субъективному мнению это глобальная тенденция, выходящая далеко за рамки этого сайта. А значит стоит вставить и свои 5 копеек в развитие направления, тем более что давно крутилась мысль сделать узел для умного дома, который смог бы контролировать потребление любого прибора питающегося от сети 220В и давал возможность программировать логику управления в зависимости от параметров потребления, температуры, фазы луны и т.д. Существуют готовые решения, но часто в них что-то не устраивает, да и готовое это не наш метод если можно попробовать построить свой уникальный велосипед.
Параметры будущего велосипеда:
— Дешевое устройство из общедоступных компонентов.
— Контроль тока в цепи потребителя.
— Управление устройством по протоколу MQTT.
— Контроль температуры устройства.
— Два выносных датчика для контроля температуры потребителя.
— Индикация состояния на экране устройства.
— Аварийное отключения потребителя если температура или ток превысили задаваемые значения.
Кейс применения:
- Мониторинг потребления электроэнергии.
- Возможность дистанционного отключение устройства в случае аварии или просто так.
- Простое устройство для мониторинга температуры в полупрофессиональных серверных кладовках где часто случаются ЧП так как за температурой в помещении ничего не следит.
- Термостатическое регулирование (поддержание температуры, в моем случае мне нужно прогнозировать оттепель и включать подогрев ливневки «греющим кабелем» заблаговременно).
- Узел системы умного дома для реализации выше описанных функций.
И конечно же Wifi чайник! Остальное для количества.
И хотелось бы показать насколько просто и дешево реализовать связку: [Устройство] <-> [Wifi] <-> [MQTT] <-> [Централизованное отслеживание состояния и управление конечным устройством].
Подбор компонентов
Чем измерить ток?
В отличии от измерения напряжения датчики для измерения тока не настолько распространены в любительской электронике. Но доступны несколько типов датчиков тока — токовые шунты, трансформаторного типа и датчики основанные на эффекте Холла. Понятно что классификация любительская, но если посмотреть в интернет магазине то названия будут примерно такие.
Шунт использовать не хотелось из-за необходимости придумывать гальваническую развязку (это чтобы 220В не ринулись всеми своими амперами в наш микроконтроллер и из него не вышел весь волшебный дым на котором они, как известно, работают). Трансформаторные датчики тоже имеют свои особенности. А вот последний тип оказался не только очень доступен, но и удобен в использовании. Я так думал когда его заказывал.
Если у вас цепь низкого напряжения то разумнее всего использовать вместо шунта резистор малого известного номинала. Подробнее как и чем можно измерять ток читайте в хорошей статье автора radiolok.
Датчики ACS712 чаще всего продаются уже распаянные на небольшую плату с необходимым минимумом обвязки. Могу посоветовать перед применением защитить саму микросхему металлическим экраном от влияния посторонних магнитных полей. Датчик к ним очень чувствительный и в стоковом виде больше подходит для поиска скрытой проводки чем для измерения тока. С импровизированной защитой помехоустойчивость ощутимо повышается.
В большой зеленый разъем втыкаем два провода полученные путем разрезания одного из двух проводов цепи 220В (последовательное включение в цепь). На разъем с другой стороны датчика подаем +5В, землю и с оставшегося пина снимаем аналоговый сигнал который колеблется относительно середины (2.5В) в зависимости от силы и направление тока. Вот так все просто… на бумаге.
Примерно в этом месте начинается костылестроение. Эти датчики доступны в версиях на 5,20,30 ампер. Если с двумя последними все более менее понятно то 5-ти амперная версия оказалась особенная, особенность эта заключалась в том что сигнал изменяется (по документации) только на +-1В от середины (2.5В). Кому интересны подробности их есть тут. По ссылке автор делает предположение что это на самом деле 10-ти амперные датчики которые не получились. Если добавить к этому сильную шумность самого датчика и его склонность реагировать на все подряд магнитные поля вокруг то задача снять с него более менее внятный сигнал перестает быть скучной. Но так как датчики были уже закуплены я решил попробовать сделать что-то из них.
Главный модуль устройства
От этого модуля требуется поддерживать связь желательно по Wifi и крутить основной рабочий цикл с опросом датчиков, проверкой условий, реакцией на кнопки и т.д. Что же выбрать из одного варианта? И внезапно мы выбираем ESP8266. В моем случае это ESP-12F. Ах, да! Есть еще ESP-32.
Лучше всего берите его сразу распаянным на плату с обвязкой и USB to UART переходником. Но можно и подключить самому так как покупать готовый это не по заветам велосипедостроения. Материал по этой теме.
Я потерял некоторое количество времени пытаясь прошить самоподключенную ESP-шку. Использовался USBtoUART на микросхеме CH340. Плата упорно не хотела прошиваться пока я не переключил логику CH340 на 5В рискуя спалить выводы ESP. Но пока без потерь.
Далее это все подключается к Arduino IDE HWman и не сильно отличается в программировании от обычной Arduino. Но очень сильно отличается по возможностям и вычислительным ресурсам:
- 80 MHz 32-bit процессор Tensilica (англ.)русск. Xtensa L106. Возможен негарантированный разгон до 160 МГц.
- IEEE 802.11 b/g/n Wi-Fi. Поддерживается WEP и WPA/WPA2.
- 14 портов ввода-вывода(из них возможно использовать 11), SPI, I²C, I²S, UART, 10-bit АЦП.
- Питание 2,2…3,6 В. Потребление до 200 мА в режиме передачи, 60 мА в режиме приема, 40 мА в режиме ожидания. Режим пониженного потребления с сохранением соединения с точкой доступа ~1 мА, режим глубокого сна 0.1 мкА.
Почему Arduino IDE? Я в курсе что есть еще как минимум два способа реализовать все тоже самое, это использовать прошивку со скриптами на LUA и нативная разработка на Cи используя SDK от производителя. Первый способ мне показался сильно поверхностным, думаю не смог бы реализовать некоторые нюансы пойдя по этому пути. Второй способ самый многообещающий, но требует много времени на освоение, однако это единственный вариант если предполагается реализация более серьезного устройства.
Используя Arduino IDE самая главная часть оказалась наименее хлопотной в плане включения в проект. Однако нормальной отладки очень не хватает. Изначально были сомнения что все задуманные функции вместе (1-Wire, i2c, ADC, MQTT, EEPROM, wifi) будут сосуществовать на ESP-12F в одном скетче, но прокатило.
Stm8s103f3p6
Казалось бы зачем тут еще один микроконтроллер? Просто сегодня одноядерное устройство уже не воспринимается всерьез, шучу. Причина другая — датчик тока настолько «особенный» что проще и дешевле повесить всю обработку его показаний на отдельный микроконтроллер и пусть он с ним нянчится. Фактически мы получили цифровой датчик тока который подключается по шине i2c. Теоретически можно использовать самый дешевый микроконтроллер, но так как эти платы очень доступны и вполне приличны по параметрам я применил ее. В будущем перемерено так и собираюсь их использовать — как замену PIC12 которые применял для добавления «мозгов» в совершенно различные поделки. По началу мне казалась эта идея избыточной, но теперь вижу что на другой вариант даже не надо было тратить время.
Программируются эти микроконтроллеры в среде IAR Embedded Workbench, она бесплатна для кода объемом до 8кб, наш микроконтроллер имеет памяти как раз столько. Огромным преимуществом является возможность человеческой отладки. Правда нужно отучить себя использовать привычные стандартные для Си функции типа printf и работу с числами с плавающей запятой так как это быстро выжрет всю память. Подробнее про прошивку расскажу ниже.
Экран
Тут вообще почти без вариантов — используем OLED SSD1306, прекрасный экранчик с очень красивым свечением и простым подключением. Библиотеки для него есть даже под спектрум. Существуют экраны разных цветов. Так же есть платы на которых сразу распаян и ESP и подобный экран. Голубой цвет кажется самым выигрышным. Есть двухцветные, когда верхняя часть другого цвета.
Экран подключается по i2c шине, это всего 4 провода с учетом питания. Датчик тока тоже будет подключен по этой же шине. Проблем экран не доставил вообще никаких. Однозначно must have!
Стоит учесть что экран скорее всего будет светить 24/7, а технология экрана такова что отдельные светодиоды-пиксели со временем выгорают, поэтому нужно стараться их использовать равномерно. Я придумал просто смещать изображение в разные стороны через определенные промежутки времени. Вообще думаю если вдруг изображение станет совершенно не читаемым заменить экран не проблема. Посмотрим сколько он проживет.
Подробное видео про такой экран и стоящий youtube канал.
Датчики температуры
Я использовал всем известные DS18B20. В режиме паразитного питания три датчика спокойно работают по одной витой паре проводов на расстоянии превышающим разумное для подобного проекта (хватает с запасом до любой точки квартиры).
Единственно отличие от рисунка это использование резистора на 1Ком, иначе не хватает питания. Когда такое происходит то датчик выдает температуру равную 85 градусов. Запрос на преобразование и последующее считывание значения происходит последовательно, для каждого датчика, что бы они не мешали друг другу.
Адреса датчиков я считал заранее и захардкодил их в скетч. Была попытка сделать автоопределение датчиков на шине, но мне не понравилась стабильность работы этого алгоритма, а так как температура параметр ответственный то игра не стоит свеч.
Конструктивные элементы и «рассыпуха»
Все это железо было помещено с небольшой платковый бокс который можно подобрать на любом радио рынке по вкусу. Использовалось обычно контактное реле для 220В. Много километров провода от старого FDD шлейфа, пол кило резисторов на 10КОм, пара кнопок, пара выводом под «тюльпаны» для подключения линии 1-Wire и ADC ESP-шки. Много термоклея. Один качественный блок питания на 5 вольт, который целиком был помещен в корпус прибора. И увы почти нет синей изоленты.
Если вы собираете прототип то старайтесь на одной из крышек не размещать вообще ничего, тогда будет удобно ее снимать и ковыряться в устройстве. Продумайте откуда будут подходить внешние соединительные кабели и какие у них разъемы, чтобы не вышло что штекера нужно втыкать под дикими углами и т.д.
Затраты на компоненты:
- Датчик тока — 2.1$
- ESP-12F — 3.2$
- Stm8 board — 0.75$
- Преобразователь логики — 0.5$
- Датчика температуры — 0.6$
- Экран — 4.2$
- Реле — 0.75$
- Коробка и прочая рассыпуха ~ хз, пусть будет 3$
Итого: 15$
Вооружившись правильным напильником...
Датчик тока
Как я писал выше, датчик тока оказался очень капризный. Кроме того измерение действующего значения переменного тока это несколько сложнее чем измерение значения постоянного тока. Думаю лучше эти моменты объяснит человек который хорошо разбирается в вопросе radiolok:
И еще:
«Вместо I (ток) подставьте в формулу U (напряжение). Интеграл это площадь фигуры под огибающей. Посчитать приближенно интеграл можно по методу средних прямоугольников, аппроксимируя фигуру прямоугольниками с высотой равной дискретному отсчету величины напряжения и шириной равной промежутку времени между отсчетами.»
Таким образом получается что нам нужно измерить площадь «под графиком» переменного тока за один период. Поскольку частота нашего напряжения равна 50Гц получаем длину периода 20мс. Когда начинать измерять значения не имеет, главное делать это на протяжении времени кратном 20мс. Практически все сводится к суммированию по модулю показаний АЦП на протяжении периода с последующим вычислением среднего. Это и будет наш ток. За период между двумя измерениями берется время срабатывания АЦП, оно довольно стабильное.
Как бонус такой метод позволяет измерять и переменный и постоянный ток. За скобками оставим вероятность гуляющей частоты и напряжения в розетке.
Измерения можно пробовать делать на АЦП ESP8266 и я пробовал, но точность оказалась очень посредственной, а так же ESPшка большую часть времени должна была заниматься исключительно обработкой сигнала с АЦП. Кроме этого встроенный АЦП имеет диапазон измеряемого напряжения порядка 1 вольта. Необходимо использовать делитель напряжения. Питается ESP от 3.3В, а датчик тока от 5В, это означает что данные с АЦП могут искажаться если питания будут изменять свою величину не пропорционально. Все это не добавляет точности измерениям. Изначальный план был такой — если не получится нормально использовать АЦП ESP то применим отдельный микроконтроллер, так и получилось.
С использованием Stm8s103f3p6 ситуация сильно улучшается. Во первых и датчик и микроконтроллер питаются от 5В что не дает «уплывать» результатам измерения при скачках напряжения. Во вторых все свои вычислительные ресурсы микроконтроллер может посвятить обработке сигнала, его фильтрации и уточнению. На самом деле конечно не прям совсем все, можно на него повесить еще что-то.
Опытным путем было определено что за 20мс stm8 успевает получить около 600 значений от АЦП без ущерб точности. При необходимости можно тактировать АЦП быстрее, но на графике становится больше заведомо ложных значений. Я мониторил измерения с помощью софта Processing, это продукт для визуализации чего либо, в моем случае это была пачка значений снятых с АЦП. Достаточно стабильные показания получались у меня после измерения в течении 100мс, то есть примерно 3000 измерений. Потом умножаем на эмпирически подобранный коэффициент (понятия не имею что это за число и как его рассчитывать потому как по всем адекватным формулам получались другие числа, просто подогнал и все) Далее значение прогоняется через фильтр. Все что остается сделать это положить очередное значение в место откуда его заберет ESP.
В итоге получилась примерно такая стабильность если включить лампочку 100Вт.
В процессе отладки выяснилось что датчик умеет зависать при срабатывании реле, видимо от сильных магнитных полей в момент размыкания реле с образованием дуги. Пришлось добавить цепь «передергивания» датчика по питанию. Хотя сначала я думал что это зависает stm8 или какой-то его блок так как в датчике зависать нечему, но он смог.
Из-за шумности датчика практически не реально измерить ток до 100мА. Где-то на форумах видел упоминание что это нормально. Я попытался организовать детектирование шума и выдачи, в этом случае, нулевых показаний тока чтобы ток не прыгал даже при разомкнутой цепи.
Алгоритм этого детектора заключается в том что шум имеет равное распределение значений выше и ниже «нуля», в то время как настоящий сигнал в конкретный участок периода все же имеет среднее значение отличное от нуля, если конечно мы не начали измерения в момент перехода нуля синусоидой. Поэтому я прослушиваю сигнал в три случайные промежутка одного периода, которые расположены друг относительно друга таким образом что хотя бы один гарантированно не попадет на момент перехода синусоидой нуля и даст суммарное значение отличное от нуля. Возможно есть способ проще, но велосипедостроение, знаете ли, не терпит длительного изучения вопроса.
Stm8 случается зависает, но только в процессе обмена по шине i2c c ESP, возможно из-за моих не великих познаний программирования этого микроконтроллера, а возможно потому что может. Использование наблюдающей собаки помогло решить эту проблему.
Безопасное переменное напряжения для отладки проще всего получить разобрав трансформаторный блок питания (естественно понижающий, желательно вольт до 12-и) и отключив от трансформатора диодный мост и сглаживающий конденсатор, обычно там больше ничего и нет.
Так сложилось что у меня не было прибора который может измерять действующее значение переменного тока. В этом случае можно обойтись измерением действующего напряжения на резисторе заведомо известного номинала, а ток уже вычислить разделив напряжение на номинал резистора. Действующее значение переменного напряжения может показать любой мультиметр. И второй способ это измерять падение напряжение на том же резисторе, но подключив его после диодного моста и сглаживающего конденсатора. Естественно что в этом случае значение тока будет несколько меньше потому как у преобразователя переменного напряжения в постоянное есть свой КПД.
Естественно я подразумеваю что вышеописанный операции проводятся с пониженным переменным напряжением, а не сетевым.
В рамках этой статьи я не буду разбирать процесс программирования под stm8. Но это не сложно, есть стандартные библиотеки для периферии и гугл решает львиную долю проблем. Тем кто не хочет вдаваться в подробности предлагается залить прошивку (CurrentMeter(IAR)STM8S103ExeProject.hex) в микроконтроллер и забыть про него. Если есть желание капнуть глубже то для начала статья и видео:
Есть попытки адаптации Arduino под этот микроконтроллер, но на текущий момент я не нашел боле-менее готовых к реальному применению.
Итак у нас есть датчик тока с i2c интерфейсом. Поскольку ESP имеет 3.3В логику и stm8 5В то необходим преобразователь логических уровней, причем двухсторонний, делителем напряжения тут не отделаться. Всякие трюки с установкой последовательных сопротивлений позволяют кое как наладить связь, но стабильность такого решения не удовлетворительная. Гораздо проще использовать уже готовый двусторонний преобразователь, который стоит копейки.
Его работа основана на использовании полевых транзисторов, подробнее про преобразование уровней можно почитать тут.
[Прошивка и исходники для stm8]
Сборка и компоновка устройства
Прототип устройства было решено собирать навесным монтажом. Есть вероятность что некоторые моменты придется переделать в процессе эксплуатации, а так же я все еще не освоил нормальную и простую разводку печатных плат. После того как устройство проработает несколько месяцев без доработок наверно есть смысл разработать и заказать печатные платы в Китае. Ну а пока получился такой макаронный монстр:
Интуитивно понятная и наглядная схема коммутации элементов устройства.
Общий принцип сборки прототипа прост — примерно размечаем в пластиковом боксе что где будет располагаться, крепим там основные элементы и далее все соединяется монтажным проводом. Стоит продумать расположение элементов чтобы не создать себе лишних неудобств.
Используя китайскую незаменимую развертку проделываются необходимые (и не только) отверстия, надфилем подгоняется окошко для экрана.
Для питания электроники используется качественный бп на 5В который подключается параллельно к сети 220В прямо внутри корпуса устройства.
Очень важно понимать что 220В это уже опасное напряжение, обязательно делайте все соединения изолированными и по возможности локализуйте такие соединения в одной части устройства, а низковольтную часть в другой. При тестовых первых подключениях можно производить коммутацию через обычный автомат, никто не застрахован от ошибок.
Про ошибки и вероятность их совершить. Ничего необычного, просто слегка примятые термоядерные бомбы от удара об землю при случайном падении вместе с самолетом после неудачной дозаправки над Испанией в 66 году. Фото из этой статьи автора MagisterLudi
Не считайте себя самыми умными и самыми осторожными. Ну или хотя бы трогайте провода с высоким напряжением внешней стороной ладони, ну лучше не надо.
На фото видно что датчик тока приклеен к блоку питания, на удивление помех от него я не заметил, но заметил что помехи проникают сверху, пришлось демонтировать датчик и экранировать его металлической фольгой. Проверить эффективность экранирования можно применив неодимовый магнит. Важно только не забывать что с одной из сторон микросхемы датчика приложено напряжение 220В поэтому экранировать нужно с изоляцией исключительно синей изолентой.
Если кому-то не понятна наглядная схема коммутации блоков приведенная выше, есть кривоватая принципиальная схема. Первый опыт использования fritzing кажется вышел комом.
Единственно что не отражено на схеме это вывод необходимых, для прошивки, контактов от ESP и STM8 на отдельный разъем сбоку устройства. Таким образом можно закончив со сборкой начинать прошивать готовое устройство, а не помесь узлов и проводов раскиданных на столе.
Перед тем как подавать питание несколько раз прозвоните цепи питания на короткое замыкание или правильную полярность. Вроде простые вещи, но небольшая кучка мертвых платок в ящике моего стола красноречиво требует не пренебрегать этими простыми правилами.
Связь с внешним миром.
Начнем потихоньку допиливать софт. Для организации управления и взаимодействия с нашей розеткой будем использовать протокол MQTT.
MQTT. Как оно работает? Все организовано следующим образом — в локальной (а может и не в локальной) сети есть некий хост на котором запущенна специальная программа (MQTT брокер) которая принимает различные данные от всевозможных устройств и организует их хранение на подобие системы файлов и каталогов на вашем диске.
Например: «SmartPowerSocket1/Current» — так выглядит реальный MQTT топик.
Папка это устройство — «SmartPowerSocket1», подпапки это какие-то внутренние параметры устройства, например значение тока — «Current». Полный путь к параметру (топику) используются для подписки устройствами на изменения в этих параметрах. Туда же происходит запись параметров самим устройством. Можно подписаться на всю «папку» (топик) и получать все изменения параметров по конкретному устройству (топику или подтопику) — SmartPowerSocket1/#.
Более подробное видео на эту тему.
И снова рекомендую этот канал, там вы найдете очень много полезной информации.
Самый известный MQTT брокер это Mosquitto. А поскольку я решил сразу развернуть и систему управления умным домом MajorDoMo, которая уже фигурировала в видео выше, все это оптом было поднято путем разворачивания готового образа под Orange Pi PC. Там все уже установлено.
Использование MQTT протокола даст возможность использовать разные системы управления умными домами и не только, этот протокол набирает популярность.
Можно обойтись только MQTT брокером установив его на ваш ПК, а взаимодействовать с ним например с телефона, под Android существует много MQTT клиентов. Да и не только под Android. Настраиваются они довольно просто.
Используя же MajorDoMo можно организовать красивое отображение информации, рисование графиков и управление через любой браузер.
Можете попробовать угадать что за прибор в качестве подопытного отображен на графиках ниже.
Это холодильник, датчик температуры в морозильнике. Я немного удивлен тем что если установить ручку управления в холодильнике на «2» то получаются показания на скринах выше. Если поставить на «3» то холодильник молотит уже 40 минут вместо 7 и держит температуру между -16/-18 градусов. Не сильно плавная регулировка как по мне. Информация не обладает сверх ценностью, по посмотреть было интересно.
Также интересно что отображаются моменты стартового большого тока и видна дискретность температурного датчика (ступеньки), поскольку для тока используется усредняющий фильтр то я вообще не ожидал увидеть таких всплесков на графике.
Скетч для ESP-12F
Чтобы заставить ESP обмениваться данными по MQTT нужно всего лишь использовать соответствующую библиотеку под Arduino. Стоит отметить что есть еще аналогичные бибилиотеки.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "........";
const char* password = "........";
const char* mqtt_server = "broker.mqtt-dashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is acive low on the ESP-01)
} else {
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe("inTopic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "hello world #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("outTopic", msg);
}
}
Если коротко то когда нужно передать данные то они передаются функцией publish(«SmartPowerSocket1/Current», «2»). Передаем значение тока равное 2-м попугаям.
Чтобы получить данные от брокера нужно просто подписаться на интересующий нас топик и в калбек функции проверять с какого топика пришли данные раскладывая их по соответствующим переменным. Вот и все.
Итоговый скетч получился довольно объемный, но там используются абсолютно стандартные подходы к организации обмена по i2c, 1-wire и работа с другими сущностями. Думаю человеку который имел уже дело с Arduino не составит большого труда разобраться и модифицировать логику управления под свои нужды, если это вообще понадобится.
EEPROM. В скетче организованно хранение параметров в EEPROM и кроме этого при доступности MQTT сервера они подтягиваются еще и оттуда при старте устройства.
ArduinoOTA. Еще в скетче проскакивает такая вещь как ArduinoOTA (OTA — «over the air», что можно перевести как «по воздуху») то есть прошивку можно заливать по Wifi.
По ссылке выше есть рецепт как это использовать. От себя добавлю что загрузка таким способом в несколько раз быстрее, но это требует встроить в скетч специальную обработку. Основной цикл не должен быть перегружен иначе не будет происходить конект между ESP и ArduinoIDE. Именно для этого в скетче так много разных таймаутов и измеряется время одного прогона главного цикла. Чем чаще ESP проверяет «а не хотят ли меня прошить?» тем стабильнее все это работает. Еще одна особенность, которую я пока не поборол, ArduinoOTA отказывается прошивать в некоторых wifi сетях, хотя все пингуется. Больше всего вероятность на успех если ArduinoIDE и ESP связанны выделенной (только для IoT) точкой доступа.
Кнопки. Сначала хотел сделать больше двух кнопок, но оказалось что GPIO на ESP-12F подходят к концу. Здраво рассудив что на эти кнопки все равно никто почти не будет нажимать (если есть управление через вебморду умного дома) было решено ограничится двумя. Завязал их на регулирование уставки по току, а если нажать обе сразу происходит аварийное отключение реле. После этого включить его можно только если перезагрузить по питанию само устройство или через вебморду. Таким образом пытался добавить немного защиты от необдуманного включения если ток вышел за предел допустимого, ведь это может означить аварийную ситуацию.
[Скетч по мере обновления буду выкладывать тут.]
«Я сделяль!»
Загадочная черная коробочка начала исправно щелкать реле и издавать, не менее загадочный, тихий высокочастотный писк разной тональности в разных режимах работы — фича/баг появившийся в результате работы блока питания, видимо там есть разболтанный музыкальный дроссель.
Забавно что именно он косвенно помог мне отловить моменты зависания отдельных узлов. Глазами можно смотреть, но это утомительно, на слух в фоновом режиме очень легко отлавливается момент когда ритм звука меняется. Поэтому я не стал утихомиривать этот дроссель и даже задумался о добавлении такой функции другим устройствам для отладки.
Некоторое время размышлял как же продемонстрировать устройство если само оно скучный черный ящик и даже не шевелится. Давайте попробуем заварить чай использую кипятильник и один из датчиков температуры, за одно вычислим сколько на это уйдет энергии.
Нажав несколько раз на кнопку которая разблокирует реле ничего не произошло, позже выяснилось что уставка по току была сильно низкая и первые несколько раз срабатывала.
Когда кипятильник немного прогрелся ток немного упал и реле разблокировало.
Устроившись поудобнее я приготовился долго ожидать закипания воды, однако китайский шайтан-кипятильник так быстро вскипятил воду что я еле успел выключить в режиме ручного управления. А датчик температуры оказался не таким шустрым и хотя я задал уставку на 95 градусов боюсь к моменту его срабатывания все вокруг было бы уже в кипятке, боюсь что я не на столько хочу чая.
По началу меня смутила надпись на кипятильнике 500Вт, однако по току видно что это правда. Под конец я уже боялся что пластиковая часть кипятильника может расплавится и испортить
«эксперимент», но обошлось.
Безусловно можно было бы снять видео по сценарию, но мне кажется в экспериментах ценнее реальный результат, поэтому показал то что получилось с первого раза без репетиций. В общем вот такое шуточное боевое крещение умной розетки.
Очень просто можно рассчитать затраченную энергии исходя из того что вода закипела через 2.5мин. и все это время ток был примерно 2.5А: (2.5А * 220В) / 60мин. * 2.5мин. = 0.023 кВт⋅ч.
Если у вас цель вести учет электроэнергии то хорошо будет добавить еще датчик напряжения который можно изготовить из понижающего трансформатора, этим способом можно получить и гальваническую развязку и напряжение не опасное для измерения с помощью АЦП микроконтроллера. А добавлять его нужно потому что напряжение в наших розетках почти никогда не 220В, а гуляет ±10В это в лучшем случае.
И еще один вариант если не нужны показания тока и напряжения сами по себе, а нужен только учет потребления электроэнергии — это китайские однодиновые электросчетчики, у них обычно есть импульсный низковольтный выход и они очень компактны. В этом случае их использование вполне оправдано.
P.S. Если вы реально планируете собрать настоящий Wifi чайник то сильно рекомендую рассчитывать толщину проводов и мощность реле так как средний электрочайник штука очень прожорливая.
Автор: Владимир