Видео стриминг с ESP32
В сети есть много примеров того как превратить плату esp32 cam в веб-камеру способную стримить видео поток. Однако, такая веб-камера может раздавать контент только на одно устройство, что делает такое решение не очень функциональным.
Задался вопросом, как сделать так, чтобы видеопоток от веб-камеры можно было принимать на нескольких устройствах. К удивлению, в сети, почему-то, очень мало успешных решений для потокового вещания с ESP32, хотя подобный проект мог бы быть довольно интересным.
Однако, существуют примеры того, как организовать потоковое вещание при помощи nginx от других источников, ту же идею можно применить и для нашего случая.
После нескольких вечеров экспериментов мне удалось организовать стриминг от устройства на esp32 cam в локальной сети на несколько устройств. В качестве реверсивного прокси-сервера используется nginx. FFMpeg преобразует RTSP поток от веб-камеры в RTMP видео поток который посылается на веб-сервер и раздается нескольким устройствам одновременно. В качестве видео плеера я использовал VLC но может подойти и любой другой.
Таким образом, сервер получает трафик виде одного потока от камеры esp32 который затем уже раздаётся на несколько потребителей. Веб сервер был поднят на устройстве Raspberry Pi Zero W - мини компьютера размером с половину пластиковой карточки и стоимостью в десять долларов. Вычислительных способностей этого малыша оказалось достаточно для перекодирования в реальном времени видеопотока с ESP32 Cam и раздачи его на оконечные устройства.
Команда для перекодирования потока при помощи ffmpeg у меня получилась вот такой:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.0.61:8554/mjpeg/1 \
-f flv -tune zerolatency -preset ultrafast -r 10 -an \
rtmp://localhost:1935/live/ccc
В ходе экспериментов было выявлено, что задержка при подобном способе раздачи контента составляет около 30 секунд, возможно для коммерческих устройств это будет неприемлемо, но для домашнего видеонаблюдения будет вполне достаточно. Стоимость компонентов при этом оказывается совсем смешной по сравнению со стоимостью "взрослых" решений.
Измерение ёмкости аккумулятора
Потребовалось измерить емкость аккумуляторной батареи. Однако никакого готового устройства для этого в доме не оказалось.
Заказывать на амазоне не хотелось, поэтому собрал из того что было небольшое устройство для измерения ёмкости аккумулятора на базе Arduino и ino219.
На макетной плате расположены arduino pro mini датчик тока и напряжения ina219 контроллер зарядки TP4056 и стабилизатор step-up который повышает напряжение 3.7 Вольт аккумулятора до 5 Вольт который нужен arduino и OLED дисплей. Устройство питается от элемента 18650.
Данная схема позволяет измерять ёмкость аккумулятора при зарядке и разрядке литий-ионных аккумуляторов и отображать ее на дисплее.
Когда внешнего питания нет устройство работает от аккумулятора и одновременно измеряет ёмкость аккумулятора при его разрядке.
На дисплее показывается циклические напряжение аккумулятора ток который течет через него и одновременно накапливается ёмкость в ампер часах и в Ватт часах.
Если мы подключим что-нибудь ещё дополнительно какую-нибудь нагрузку мы можем ускорить процесс разрядки и испытать аккумулятор под нагрузкой. В теории, емкость аккумулятора при разных токах разрядки может отличаться.
Если мы подключим внешнее питание, то устройство перейдет в режим зарядки, для чего нужно нажать кнопку для подтверждения смены режима. Это нужно для того чтобы если вы случайно отключили питание чтобы устройство осталось в том же режиме в котором было и продолжило считать параметры зарядки и это не повлияло бы на уже накопленные результаты.
Кроме этого, каждая сессия заряда или разряда записывается в EEPROM устройства и если вы случайно выключите все устройство то после включения устройство продолжит зарядку с прерванного момента. В EEPROM устройства сохраняются последние десять сессий заряда разряда.
Таким образом можно измерить емкость литий-ионного или литий-полимерного аккумулятора при его разрядке или зарядке.
Устройство можно использовать как продвинутый power bank для питания других устройств, в случае, если вам необходимо контролировать параметры энергопотребления схемы, или же как зарядное устройство с контролем емкости заряжаемого аккумулятора.
Прошивка, как всегда, выложена на github.
Альтернативное IDE для Ардуино
Давно ищу замену для Arduino IDE которое очень примитивное и жутко неудобное.
Пробовал использовать для этого Атом и Eclipse но так и не смог их настроить для компиляции скетчей. Приходилось все равно использовать родное IDE но оно не умеет автобновлять содержимое файлов если их изменить в сторонней программе, поэтому скетч нужно постоянно закрывать и открывать заново, что жутко неудобно.
Оказалось что Visual Studio Code прекрасно умет почти из коробки запускать скетни Arduino. Просто ставится соответствующее расширение и ваши скетчи начинают волшебным образом компилироваться. При этом, как я понял, используются те же библиотеки, которые используются для компиляции скетчей в Arduino IDE.
Как же это здорово, когда можно пользоваться нормальной подсветкой синтаксиса и использовать автоподсказки. К хорошему быстро привыкаешь.
Заказал интересную плату
Вторую неделю вся контекстная реклама мне подсовывает новую железку от TTGo : TTGO T-SIM7000G Module ESP32-WROVER-B Chip WiFi Bluetooth 18560 Batterie Halter Solar Ladung Entwicklung Bord
Выглядит очень интересно - процессор ESP32, на борту 3g интернет, WiFi, GPS, и все это питается от аккумулятора 18560 с возможностью зарядки от солнечной батареи. По автономности это должна быть очень крутая штука для всяких дистанционных устройств - онлайн трекеров и подобных самоделок с автономным питанием.
Стоит удовольствие около 30 Евро. Неизвестно правда, нужно ли будет платить пошлину - в Германии весь китайский импорт облагается пошлиной, и не маленькой, - вот и посмотрим.
P.S. Уже давно амфиботропная асфиксия мешает мне заказать нормальный Raspberry Pi чтобы, наконец, доделать GSM гейт - а тут под действием момента взял и заказал совершенно ненужный девайс. Сработала контекстная реклама.