Зачем?
Даже в этом хабе наблюдается повышение интереса к IoT, по моему субъективному мнению это глобальная тенденция, выходящая далеко за рамки этого сайта. А значит стоит вставить и свои 5 копеек в развитие направления, тем более что давно крутилась мысль сделать узел для умного дома, который смог бы контролировать потребление любого прибора питающегося от сети 220В и давал возможность программировать логику управления в зависимости от параметров потребления, температуры, фазы луны и т.д. Существуют готовые решения, но часто в них что-то не устраивает, да и готовое это не наш метод если можно попробовать построить свой уникальный велосипед.
Параметры будущего велосипеда:
— Дешевое устройство из общедоступных компонентов.
— Контроль тока в цепи потребителя.
— Управление устройством по протоколу MQTT.
— Контроль температуры устройства.
— Два выносных датчика для контроля температуры потребителя.
— Индикация состояния на экране устройства.
— Аварийное отключения потребителя если температура или ток превысили задаваемые значения.
Кейс применения:
- Мониторинг потребления электроэнергии.
- Возможность дистанционного отключение устройства в случае аварии или просто так.
- Простое устройство для мониторинга температуры в полупрофессиональных серверных кладовках где часто случаются ЧП так как за температурой в помещении ничего не следит.
- Термостатическое регулирование (поддержание температуры, в моем случае мне нужно прогнозировать оттепель и включать подогрев ливневки «греющим кабелем» заблаговременно).
- Узел системы умного дома для реализации выше описанных функций.
И конечно же Wifi чайник! Остальное для количества.
И хотелось бы показать насколько просто и дешево реализовать связку: [Устройство] <-> [Wifi] <-> [MQTT] <-> [Централизованное отслеживание состояния и управление конечным устройством].
Подбор компонентов
Чем измерить ток?
В отличии от измерения напряжения датчики для измерения тока не настолько распространены в любительской электронике. Но доступны несколько типов датчиков тока — токовые шунты, трансформаторного типа и датчики основанные на эффекте Холла. Понятно что классификация любительская, но если посмотреть в интернет магазине то названия будут примерно такие.
Шунт использовать не хотелось из-за необходимости придумывать гальваническую развязку (это чтобы 220В не ринулись всеми своими амперами в наш микроконтроллер и из него не вышел весь волшебный дым на котором они, как известно, работают). Трансформаторные датчики тоже имеют свои особенности. А вот последний тип оказался не только очень доступен, но и удобен в использовании. Я так думал когда его заказывал.
Если у вас цепь низкого напряжения то разумнее всего использовать вместо шунта резистор малого известного номинала. Подробнее как и чем можно измерять ток читайте в хорошей статье автора radiolok.
Датчики ACS712 чаще всего продаются уже распаянные на небольшую плату с необходимым минимумом обвязки. Могу посоветовать перед применением защитить саму микросхему металлическим экраном от влияния посторонних магнитных полей. Датчик к ним очень чувствительный и в стоковом виде больше подходит для поиска скрытой проводки чем для измерения тока. С импровизированной защитой помехоустойчивость ощутимо повышается.
В большой зеленый разъем втыкаем два провода полученные путем разрезания одного из двух проводов цепи 220В (последовательное включение в цепь). На разъем с другой стороны датчика подаем +5В, землю и с оставшегося пина снимаем аналоговый сигнал который колеблется относительно середины (2.5В) в зависимости от силы и направление тока. Вот так все просто… на бумаге.
Главный модуль устройства
От этого модуля требуется поддерживать связь желательно по 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 мкА.
ru.wikipedia.org/wiki/ESP8266
Почему 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)\STM8S103\Exe\Project.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 чайник то сильно рекомендую рассчитывать толщину проводов и мощность реле так как средний электрочайник штука очень прожорливая.
Комментарии (47)
rustavelli
27.10.2017 12:13че-то нигде нет упоминания про sonoff pow
svavan Автор
27.10.2017 12:16О, интересно, я как-то пропустил эти продукты. Спасибо, будет полезно ознакомится!
rustavelli
27.10.2017 12:18+1У них получается дешевле, чем если делать самому. Для mqtt я использую эту прошивку
github.com/arendst/Sonoff-Tasmotasvavan Автор
27.10.2017 12:21Зависит от цели, если нужно что-то реализовать и забыть то да. Если цель еще и узнать что-то новое для себя то иногда полезно сделать свой велосипед. Спасибо за прошивку, я посмотрю, больше прошивок больше возможностей.
eg256
27.10.2017 17:44А так же:
www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266
Тот же ESP и еще дешевле и компактнееsvavan Автор
27.10.2017 17:46Вот так обычно и бывает что в коментах можно найти чуть ли не больше полезного чем в статье)
DRomanov1972
28.10.2017 17:07www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266
eg256: Посмотрите все решения на этом и других сайтах. Мне понравилось:
macwyznawca (verified owner) – March 12, 2017
The perfect solution! I have uploaded the software Sonoff-Tasmota. I connected to the pin switches, LED WS2812, temperature sensors and motion detectors. Everything works. I use to control the light in terrerium and in the bedroom (for now).
The only problem was to flash the firmware. My USB-to-TTL does not have enough power to 3.3V. I have uploaded the software correctly, but to the work was too little power. It was enough to change the power (low voltage) or after downloading the firmware and disconnect from USB-TTL, connected to the mains supply. I have 7 pieces (now), I’m happy!
Stan88
27.10.2017 12:40Не судите строго, и не принимайте близко к сердцу!) Но глядя на монтаж, подход и коммутацию — я бы «такое» не осмелился оставить без присмотра включенным в электросеть! Не то что в серверное помещение (хоть и собственный подвал), да и даже в составе умного дома. Я конечно понимаю что делать «поделки» на ардуино весело и сердито, но когда заходить речь о высоких напряжениях и токах (свыше 12в, к примеру) — необходимо хоть как-то ознакомиться с техникой безопасности! Клемные соединения, стойки, нормальные провода, заземление, — минимально необходимое!) Исключительно как прототип для отладки софта — еще пойдет. Но вот использование в качестве готового устройства — крайне сомнительно.
svavan Автор
27.10.2017 13:01Согласен с вами! Какие бы именно моменты и как вы предложили бы улучшить с точки зрения безопасности если есть идея сделать в будущем несколько устройств с использованием болле компактной компоновки и печатной платы?
slavka414
29.10.2017 12:44Я в конце лета заказал печатные платы для своей разработки и избавился от некоторых проблем с наводками.
З.Ы. делаю «умную» регулировку для электроинструмента и тоже использую ACS712.svavan Автор
29.10.2017 12:44И как вы с ними боритесь?)) У вас же гарантированно еще и электромоторы близко.
slavka414
29.10.2017 12:51Я уже написал. Я заказал платы и избавился от вермишели. Ну и на каждую микруху ставить керамический конденсатор по питанию.
У меня устройство чуть проще и там требуется контроль тока, контроль оборотов и их регулировка.svavan Автор
29.10.2017 12:57Саму микросхему датчика не экранировали?
slavka414
29.10.2017 13:04Нет. У меня сейчас проблемы в том что:
1. Ток синусоидальный и с небольшим сдвигом
2. Фазовая регулировка
3. Attiny13 и её ограниченные ресурсы
4. Ограниченное финансирование
5. Мои познания в программированииsvavan Автор
29.10.2017 13:13Я не эксперт в оцифровке сигналов в но по моему сигнал с этого датчика требует приличных вычислительных мощностей что-бы получить что-то более менее чистое на выходе. Не смотрели в сторону Stm8 или Stm32?
slavka414
29.10.2017 13:23Да знаю. Сейчас вычисляю среднее арифметическое для участка полуволны и записываю его, а также максимум в EEPROM, после этого в экселе провожу вычисления.
На stm8 и stm32 смотрел, но5. Мои познания в программировании
svavan Автор
29.10.2017 13:33Мне очень помогло визуализировать выборку через processing. Я просто набивал массив значений с АЦП насколько хватало памяти, а потом выплевывал его по UART. Processing отрисовывал волну (да я знаю что изобрел осциллограф), но это помогло понять как данные выглядят реально на выходе с АЦП и в соответствии с этим уже делать поправки.
VladGum
27.10.2017 13:02Хорошая статья но только с точки зрения сделать что-то своими руками (DIY). Если же у вас нету времени/желания/необходимых компонентов/прямых рук но есть немного лишних денег то можно обойтись например «умной» розеткой TP-Link HS100/HS110 (прошу не считать это рекламой, недавно купили такую и я доволен её работой), самое большое преимущество которой по моему мнению в том, что включать и выключать розетку можно даже не находясь в домашней Wi-Fi сети, а везде, где есть доступ к интернету через приложение в смартфоне.
Данные розетки тоже можно настроить на определённую логику работы от срабатывания датчиков (нужно больше денег :)
Ну некоторые рассказывают что её ещё можно прикрутить к голосовым помощникам Alexa/Google Assistant.svavan Автор
27.10.2017 13:04Вы совершенно правы, я об этом тоже писал. Если нужно сделать и забыть то это лучший вариант. Единственно что меня тут беспокоит это ролики на ютубе в которых взламывают серийные видеокамеры и т.д.
Vooon
27.10.2017 14:16+1Мне понравилось использовать PlatformIO вместо ардуины.
А для OTA имхо удобнее использовать стандартный HTTP update, запускать процесс командой через MQTT.
Правда для этого метода лучше использовать специальный сервер (или скрипт).
Я быстро набросал на го: https://github.com/vooon/esp-ota-serversvavan Автор
27.10.2017 14:22Хм, а ведь правда можно инициировать обновление командой через MQTT, как-то в голову не пришло, это идея. Мне кажется OTA как-то сильно уж капризно работает, но это мое субъективное мнение, возможно мне не повезло с сетевой инфраструктурой.
Vooon
27.10.2017 19:05Да, http update не очень стабильно работал пока я не заменил nginx (просто сервил файлы) на свой сервер, который выдает контрольную сумму md5 в заголовках.
KonstantinSoloviov
27.10.2017 14:31Использовался USBtoUART на микросхеме CH340. Плата упорно не хотела прошиваться пока я не переключил логику CH340 на 5В рискуя спалить выводы ESP. Но пока без потерь.
А был ли мальчик? Как-то разбираясь в похожей ситуации с удивлением обнаружил, что все мои USB2UART конверторы (разных типов: CH340, CP2102, парочка от старых телефонов) выдают на TX 3.3V. Правда напрямую все равно не подключаю, мало ли где КЗ образуется, так что — без делителей просто через резисторы на 100-200омsvavan Автор
27.10.2017 14:37Очень может быть. Чтоб точно ответить на этот вопрос нужно посмотреть осциллографом. Для своего любительского не могу найти дрова под win 10. У меня есть еще одна ESP, буду пробовать сделать через резисторы, в случае успеха поправлю статью.
KonstantinSoloviov
27.10.2017 14:43Осциллограф — здесь совсем лишнее :), когде нет передачи на TX постоянный высокий уровень.
Vooon
27.10.2017 19:08У большинства чипов есть возможность выбрать напряжение IO. Обычно это специальная ножка питания. Некоторые чипы поддерживают 1.8, что необходимо например одроиду.
svavan Автор
27.10.2017 19:30Это полезно, но в случае с ESP8266 удобнее всего взять плату на которой уже все распаяно и не парится с теми проблемами которых можно избежать.
superyarik
27.10.2017 15:02такой вопрос: как проще всего прокидывать управление majordomo извне? реализовывали это?
svavan Автор
27.10.2017 15:13Я этого не делал так как поднял систему на кануне этого проекта. Думаю проще всего это белый внешний IP и пробросить порт на роутере, но сами понимаете это очень не безопасно. Можно рассмотреть вариант дублирования MQTT топиков на внешнем IoT сервере, но это не совсем управление именно majordomo извне. Есть еще простой вариант это программы типа teamviewer, заходим на домашний комп и вперед, конечно это довольно любительский способ.
Barnaby
27.10.2017 17:01VPN, например openvpn. Если не нужна высокая скорость можно прямо на роутере поднять.
vvmk
27.10.2017 20:29Работа проделана большая.
Статья интересная.
Но есть некоторое противоречие.
Вы пишите что токовый датчик ACS712 чувствителен к внешним магнитным полям (оно и понятно, т.к. работает на эффекте Холла)
Но в вашей конструкции плата с датчиком лежит аккуратно на импульсном БП, который скорее всего обратноходовой, и «стреляет» игольчатыми магнитными всплесками очень здорово.svavan Автор
27.10.2017 21:22Я про это писал в статье. Необдуманно разместил там датчик, а когда подумал про помехи от БП начала смотреть какое влияние он оказывает, существенных искажений не заметил. Это было видно потому что все отлаживалось изначально просто на столе, где БП не было, я знал как оно работает в этих условиях. Сравнив картину я и сделал вывод что помех нет или их я не могу зафиксировать. Но вот когда я положил всю коробку просто под LED монитор то сразу, не вооруженным взглядом, были заметны всплески «тока», а вот это как раз возможно работал БП монитора (как вы описали). Я экранировал датчик фольгой и в том же самом месте помех больше не было. Но неодимовый магнит «пробивает» и эту защиту.
telobezumnoe
27.10.2017 22:08потребляемую мощность можно измерять с счетчика эл энергии, по вспышкам индикатора на счетчике, чувствительность такова что видно даже потребление лампочки в холодильнике по открытию двери. замеряю интервал между вспышками и по ним рассчитываю текущую потребляемую мощность, у меня на один кВт 3200 вспышек, получилось что мощность равна 1250000/t, где t интервал между вспышками в милисекундах
svavan Автор
27.10.2017 22:16Собственно в конце статьи я такой вариант и предлога тем у кого цель учет электроэнергии.
Estranged01
30.10.2017 21:28В следующий раз лучше используйте PZEM-004T. Переменный ток, напряжение, мощность и Вт*ч в одной платке. И без плясок с бубном, т.к. есть готовая библиотека.
Я ACS712 использую только для факта самого наличия тока. Т.е. если ток есть, значит контролируемый объект работает. А измерять им — это уж слишком муторно.svavan Автор
30.10.2017 21:55Пожалуй соглашусь, ACS712 своеобразная штука. Еще как вариант можно применять их для измерения больших токов (больше 0.5А) в низковольтных сетях в не ответственных местах. Спасибо за вашу железяку!
siryoshka
Годная статья, но есть одно но, ведь так или иначе тратится энергия даже на поддержании заряда аккумулятора в вашем дивайсе. не просто ли выключить свет в туалете после того как выключил воду?