Лабы на esp32
Делали сегодня лабы на микроконтроллере esp32 через ESPlorer IDE.
Может кому нибудь будет интересно)
В первой лабе надо было подключиться к устройству (оно создаёт точку WiFi) и через веб-интерфейса устройства зажечь светодиод
Во второй надо было подключить к устройству кнопку, подключиться опять по WiFi и в веб-интерфейсе увидеть, что при нажатии на кнопку, отображается информация, что она нажата.
В третьей надо было подключить к устройству джойстик, в веб-интерфейсе можно смотреть положение джойстика.
В четвёртой лабе подключали динамик к устройству, заходили в веб-интерфейс и включали оттуда мелодию на динамике))
И в пятой взяли два устройства. Одно запрограммировали как сервер. Другое как клиент. Сервер раздаёт WiFi. Клиент автоматически к нему подключается. На клиенте есть кнопка. Если на неё нажать, то на сервере зажигается лампочка)
Управление реле по UDP: Беспроводное решение с ESP8266, ESP32 и Easy HMI
Вы уже, наверное, в курсе, что Easy HMI получил поддержку беспроводной связи по UDP. Если нет, то ознакомьтесь с новыми возможностями тут. А так как есть беспроводной интерфейс, неплохо было бы сделать удаленное управление реле. Что, в свою очередь, позволит управлять светом, вытяжкой, вентилятором, чайником, кофемашиной, обогревателем и другими устройствами и приборами. Для реализации данной идеи можно использовать готовые модули на базе ESP32 и/или ESP8266. Я уже рассказывал про модуль ESP12F Relay X4 (LC-Relay-ESP12-4R-MV – по даташиту). Сегодня напишем код для управления данным модулем и также посмотрим, как можно управлять по UDP 2, 3, 5, 10 и даже 12 группами реле с одного сенсорного дисплея. Думаете, это невозможно реализовать? Давайте разберемся!
Бюджетный и «злой» аналог Flipper Zero – борьба с надоедливыми блютуз колонками, тестирование WiFi сетей, шлагбаумы и не только
Речь в посте пойдет об устройстве LilyGO T-Embed CC1101 с небольшими доработками.
Дисклеймер: все описанные ниже действия, тесты и атаки проводились только на собственных устройствах или с согласия владельцев тестируемых устройств и сетей, nrf24 jammer использовался только в экранированном помещении, исключительно в рамках тестирования помехоустойчивости личной колонки.
Использование данного функционала в иных целях может преследоваться по закону!
Ну что, мамин хакер, заинтересовался?) Или тебя просто достали колонки с плохой музыкой в общественных местах? Поехали!
ВАЖНО: в посте именно версия CC1101, обычная версия не имеет радиомодулей!
Железо: на борту имеем микроконтроллер ESP32, 2,4ГГц Wi-Fi модуль, Bluetooth, NFC, SUB-GHZ радиомодуль CC1101, ИК приемопередатчик
Прошивка: Bruce 1.9.1. Отключаем на T-embed аккумулятор, идем на https://bruce.computer/flasher, зажав центральную кнопку на девайсе подключаем его к ПК и прошиваемся прямо из браузера за пару минут. Удобно, однако.
Прошивка поддерживает также работу с модулем NRF24, о нем позже. Потребуются навыки небольшого колхоза с паяльником или внешний переходник.
WiFi 2,4ГГц: стандартный набор для тестирования безопасности сетей и разумности сотрудников, к ним подключенных:
Deauther ("глушилка" WiFi): отправка на роутер пакетов деаутентификации, выбивающих все устройства из сети без возможности подключиться обратно, пока идет атака. Можно одновременно с атакой расшарить сеть с таким с таким же названием и открывающимся окном с просьбой ввести пароль от роутера для его перезагрузки, получая на T-Embed введенные юзером данные. Если роутер раздает 2,4ГГц и 5ГГц сети, вышибет только сеть 2,4ГГц. 5ГГц WiFi модуля тут, увы, нет.
Deauth flood: то же самое, но атака сразу на все доступные роутеры.
Beacon: спам названий WiFi сетей.
Bluetooth: тупые хулиганские fast pair атаки на доступные устройства. Вызывает раздражение пользователей, не более.
IR: чтение/сохранение и передача заранее сохраненных/загруженных из интернета ИК сигналов (совместим с файлами от Flipper), выключатель всех телеков одним нажатием.
SUB-GHZ: самое интересное. Захват радиосигналов в достаточно широком диапазоне, их сохранение и ретрансляция, а также воспроизведение файлов сигналов для Flipper (формат .SUB).
Тут начинается веселье и тест на защиту от тупого перехвата всех своих устройств. Итого, копированию и воспроизведению сигнала поддались: дверной звонок, сигнализация от мотоцикла (вот тут я реально расстроился), шлагбаум со статическим кодом (ожидаемо, имеем в итоге один пульт для всех). Файлу с большой базой кодов (перебор брутфорсом) спустя 5 минут сдался шлагбаум со скользящим кодом в гаражах. В целом, функционал позволяет скопировать и эмулировать любой простой радио пульт. А большая база .SUB файлов в интернете дает возможность этот пульт даже не искать. Да, даже от вибратора :)
Для большей дальности модуль можно дооснастить внешней антенной.
RFID: простой функционал чтения/записи/стирания меток. Эмуляцию пока не завезли, но обещают.
NRF24: еще одно интересное применение.
Важно: использование глушилок может быть незаконным!
Это модуль связи 2,4ГГц (на этой частоте работает WiFi, Bluetooth и не только), в котором возможно использование режима Jammer, т.е. глушилки сигналов.
Необходимо припаять его к плате по схеме, чтобы компактно разместить внутри устройства. Покупайте модуль с U.FL разъемом для внешней антенны.
Альтернативно можно подключить снаружи через microsd sniffer, схема есть на https://github.com/pr3y/Bruce/tree/main/media/connections
Если вам нужен только функционал WiFi, NRF24 и SUB-GHZ, возможно проще и дешевле купить M5STICK или Cardputer вместе с готовой платой с этими модулями. Однако, такая конструкция будет хрупкой из-за внешней голой платы - потребуется колхозить какую-то изоляцию для нее.
Припаиваем к выводам ESP32 и модуля CC1101
Паяем
Спиливаем ребра жесткости на задней крышке, сверлим отверстие под вывод внешней антенны, втыкаем u.fl – sma пигтеил и собираем все обрано.
Включаем колонку и пробуем
Поворачивая «крутилку» на девайсе, можно менять режимы, на блютуз колонки лучше всего влияют режимы WiFi, BLE и RC. Колонка заикается, а то и вовсе глохнет.
Дальность с качественной антенной, например от Baltic Signal – в пределах 10 метров.
При подключении дополнительного антенного усилителя, как на картинке ниже, дальность прилично возрастает.
JS Interpreter: запуск произвольных скриптов на девайсе. На случай, если захотите быстро допилить свой функционал.
BAD USB: притворяется клавиатурой, вводит заранее прописанный скрипт.
Заключение
Аналогичные девайсы можно собрать на основе других устройств, таких как M5 Cardputer, M5StickC2, “cheap yellow display” и т.д. Полный список совместимых с прошивкой плат есть на сайте Bruce.
Я никого ни к чему не призываю и напоминаю о незаконности некоторых атак и тестов, если они производятся без разрешения на чужом оборудовании.
Ценник на все это безобразие – порядка 5000 рублей. На Озон Глобал было дешевле, чем на Али, на момент моего заказа. Ссылок не дам, не реклама.
Действительно умная гидропоника. Часть 2
Собственно продолжение поста про моё устройство для выращивания различных растений.
Первая часть тут - Действительно умная гидропоника. Часть 1.
Функция измерения веса. Покажу конструкцию в 3д, так как показывать её в реальности весьма затруднительно. Я использую 60мм горшочки для гидропоники, поэтому проектировал под себя и свои нужды.





Сама измеряющая платформа с тензодатчиком. Печатается на 3д принтере и вставляется в мой кейс с растениями вместо обычной платформы (одной из 3х)
Собственно на изображениях видно, по центру стоит тензодатчик и вокруг него равноудаленно 7 слотов под горшочки с субстратом. От тензодатчика провод идет в АЦП HX711, но тут было несколько ньюансов:
А) Обязательно заэкранировать кабель подключения от самого тензодатчика(я обернул экраном наполовину) и довести экран до АЦП.
Б) Провести провод так, что бы если по нему капилярным эффектом начнет подниматься вода, он не добрался до датчика. Я сделал простую петлю и разместил его выше чем сам тензодатчик. Таким образом вода точно никак не попадет на АЦП.
Сам же АЦП в герметичном корпусе. и вынесен отдельно от системы и подключается через TYPEC-TYPEC провод любой длины.
Это нужно для того, что бы провода от тензодатчика и до АЦП были как можно короче. а цифровой сигнал уже все равно на какое расстояние и с какими помехами передавать.


Корпус для АЦП.
Собственно сама функция измерения веса не замысловата и просто измеряет вес всего что стоит на ней. Тарирована вместе с платформой по умолчанию. Калибровка осуществляется по известному весу и выборкой в 50 измерений. Опять же, я встретил достаточно много проблем с этой фичей, но все удалось побороть.
1) Проблема влажного субстрата. Я знаю сколько весит горшочек с сухим субстратом и с мокрым. Но вода штука капающая. И эти самые капли, на начальных этапах роста дают не просто шум, а шумище. То есть когда растения весят 0.02 грамма, это начинает становится серьезной проблемой. Был введет флаг полива, и примерная интерполяция по времени, за сколько "худеет" горшочек от воды. + мы знали начальный и конечные веса. Это помогло уменьшить шум от измерений. Затем сверху накладывается алгоритм среднего, лимитации пиков (по сути фильтрация сигнала, если он превышает порог, то значит это значение либо шум, либо вода) и просто большая выборка на одно измерение, и вес стал стабильно учитываться.
2) Проблема контрафакта. Очень, ООЧЕНЬ много контрафакта на OZON. 2 штуки HX711 купленные мной, были с затертыми микрухами, неотмытым флюсом и шумели хуже чем пьяный сосед вася, периодически отваливались и отказывались измерять показания во всех режимах. (40\10), причинно следственной связи установить не удалось. В стерильном скетче и с идеальным подключением, вели себя неадекватно. Лишь на 3 раз удалось приобрести действительно хороший модуль, который ведет себя как заявляет производитель. На удивление он даже выглядел иначе.
Собственно, я упомянул, про распределение веса. у меня в системе 25 слотов на данный момент. (без весов 27). Так вот для каждого из слотов можно вычислить свой вес. Даже если растение не на весах, нужно что бы оно хотя бы раз там побывало единственное что.
Работает это по принципу "разумного распределения", у каждого слота в системе есть свой индекс и 1 или 0 является ли этот индекс весами или нет. Если мы знаем, что растение например в системе 15 дней и оно одно сидит на измерительной платформе, то формула следующая
вес платформы - вес горшка - вес субстрата = вес этого конкретного растения.
Если на платформе сидят условно 5 растений, то этот вес просто делится на 5, при соблюдении того факта что это та же партия выращеваемых растений. (помните в предыдущем посте мы задавали количество посаженных растений? вот вот, там же и формируется уникальный ID посадки)
А дальше магия. У нас для каждого поддерживаемого растения системой,базово прописан теоретический вес, который перезаписывается реальным во время использования. Ну то есть по большому счету, некое самообучение.
И логично предположить, что растение сидящее на весовой платформе в слоте с индексом 1, которому 5 дней примет массу A, а растения например в индексе 4,5,6 которым уже 25 дней, примет массу Общая масса растений - масса А / 3. Собственно как то так. А дальше, когда мы знаем уже реальную массу каждого растения, системе собственно не сложно предположить, что остальные растения из этой партии но в слотах не на весах, весят примерно столько же. И она присваивает массу уже этим растениям. Собственно как то так, это весьма сложно объяснить как оказалось. А дальше можно оставить на весах 7 уникальных растений например и с помощью этого алгоритма наблюдать за их поведением в зависимости от например различных факторов. (температуру поднять, чо будет? дать больше EC? и тд. ) все это пишется, запоминается и анализируется.
Ну и собственно график роста по CSV данным. Вот так салаты росли примерно с 25.04. (все что старше 30 дней улетает в долгосрочную память). Есть шумы и провалы, все таки я то трону весы, то сами растения на них, во время осмотра, все в норме.
Видно на графике, что сейчас салаты на платформе в стадии активного роста и прибавляют примерно по 0.1кг в сутки, что очень даже не плохо. Сейчас пару дней назад я снизил дозу EC до 1.2, до этого было 1.6, дальнейшие наблюдения покажут, осталась ли прежней скорость набора зеленой массы или замедлится.
Салат Мини Ромэн.
Внешне это выглядит вот так:
Контейнер
Ну что бы далеко не отходить уже от конструкции, чуть вильнем в эту сторону. Это тоже отдельный и большой этап.
Контейнер для выращивания у меня сделан из ПВХ пластика на фрезерном ЧПУ. Тоесть по сути это был конструктор для склеивания. Клеил специальным клеем и сверху проходился ещё герметиком, тк вода может стоять в процессе эксплуатации весьма большим объемом. (около 1.8 литров. Возможно это не доработка и я поправлю в следующей генерации этот момент, но пока все работает отлично. Спроектирован так, что бы на обычном принтере можно было напечатать 3 крышки для высаживания растений и что бы влез в обычный металический стеллаж. Как по высоте так и по ширине. Идеально входил в стеллаж 800*300, тк изначально собственно под него и проектировался.


Конструкция контейнера.
Расположение самих форсунок тоже важно. Разместить их надо таким образом, что бы будущая корневая система не загородила собой одну\две\три из форсунок и не отняла питание у остальных растений, так же надо учесть что бы струя не била напрямую в горшочки, а увлажняла воздух вокруг, ну и естественно что бы это не было так, что из щелей фигачит водяной туман и увлажняет все вокруг и вокруг системы лужи.
Я сделал около 4-5 вариантов в модели, примерно просчитал конусами ~55 градусов, что соответствует моему давлению и диаметру форсунок. И самый нормальный вариант как по мне, без лишнего изобретательства велосипеда, это разместить их на будущем уровне воды внизу под 35 градусов к поверхности. Так же они заполняют пробелы друг друга. По одному борту стоят 4, по другому тоже 4 но со смещением на около 50мм.
На дне имеются укрепления в виде полосок того же пластика, что необходимо для того что бы днище не прогибалось под весом жидкости и конструкция получилась легкой и жесткой и так же укреплены сами стенки ближе к крышке такими же полосами, что бы надежнее их скрепить между собой и дать опору для прямоугольника под печатные крышки уже.
Конструкция бака
Тут особо рассказывать нечего. Тут я не изобретал велосипед и сделал из контейнера удовлетворившего мои условия. Он должен закрываться плотно на защелки и быть не прозрачным, подходить по размеру. В принципе это всё. Дальше дело техники, я все монтировал на крышку, что бы при необходимости её поднять и вытащить сам бак и помыть\заполнить водой или что то ещё сделать, но честно я этого не делаю)) потому что заливаю воду просто в контейнер и она сама наполняет бак, но ситуации могут быть разные. Для обслуживания единственное что важно было, это не крепить ничего на сам контейнер, тк провода или шланги в дальнейшем будут мешать его обслуживанию.
Единственное что пришлось сделать, это закрепить на быстросъемном печатном креплении датчик наличия воды на безопасном для насосе уровне. Если вдруг я все таки не увижу отсутствие раствора, он отключит насос и не даст ему работать вхолостую.
Продолжаем по функциям (системные функции)
Диспетчер задач. Да да, вы не ослышались. У меня есть свой диспетчер задач с блэкджеком и памятью. На самом деле вещь сугубо дебажная. Показывает она приоритет, ядро исполнения, сколько стека ест та или иная задача, за сколько выполняется и есть ли опасность краша системы по Watchdog, так же есть апи поинты для остановки или перезапуска задач, но пока в интерфейс не интегрировал ещё. Конечно это касается только задач FreeRTOS, задачи в Loop цикле при этом никак не отображаются.
Лог система
Лог система, это отдельная вещь, тк в такой сложной системе надо логировать всё и ещё раз всё что можно. Но все же сталкивались с тем что в луп написал println и значение и больше в логах ты не хозяин. Да, конечно можно Усовершенствовать это делеями, а лучше миллисами или yield ами, но это разве гибкость? Когда логов становится много. Нет, не так. МНОГО, ОЧЕНЬ МНОГО, за пару секунд собирается 30-40 строк, пора что то с этим делать. А ведь так не хочется трогать уже сделанное полезное логирование, вдруг оно опять понадобится позже. Поэтому я уже известным путем и пошел. Сделал просто обертки для функций логирования, но уже с аргументами уровня логирования. DEBUG INFO WARNING ERROR. И собственно параметрами куда это самое логирование отслыать, в телегу на сд карту или в веб интерфейс. В тг просто по приколу, я хрен знает зачем, мне ни разу не пригодилось. А вот на SD очень даже, в связи с этим на фронте на самой ESP появилась даже кнопочка скачать лог. Пришлось ограничить правда размер до 4мб, как правило этого хватает для всех нужд. Но не было печали купила баба порося, это то я все сделал, но как отлавливать PANIC/WDT и прочие неприятности когда ты по ошибке вылез за предел массива или сожрал весь HEAP? Правильно, взять дешман ESP32Dev модуль и подцепить его TX\RX2 в RX\TX0 на Main ESP32S3 и заставить его читать вообще всё и отсылать по вебсокету на свой веб интерфейс. А ещё можно прикрутить кнопку принудительной перезагрузки контроллера, перепрошивки без необходимости лезть в корпус и подсоединять USB.
Логирование всей фермы SLAVE контроллером на ESP32. Все идет в Live режиме, без перезагрузок страницы и без задержек через WebSocket.
Тут же прикрутил и фильтрацию логов по системам которые определяются автоматически, прикрутил MQTT для удаленного перезапуска Main и самое главное, на SLAVE сохраняются все Backtrace c Master контроллера и коды ошибок для дальнейшей диагностики + лог за минуту до критической ошибки. И вот это уже настоящая имба. Ты буквально независим от ошибок и USB провода и можешь прочитать всё что тебе нужно независимо от того, что с Master контроллером. Так ещё и ладно, эту идею можно развить и дальше, Slave контроллер может быть и резервным контроллером. Например самые важные функции это полив и свет, вполне можно автоматически дублировать и управлять теми же самыми реле при отключении Master контроллера. Уведомлять пользователя и тд. В будущем такое обязательно будет, но количество лапши внутри корпуса уже заставляет дергаться оба глаза. Поэтому потом, когда нибудь.
Резюмируя систему логирования, она получилась мощная, быстрая, понятная и самое главное удобная для использования. А большего мне и не надо. Красивости в ней только мешают, поэтому тут дизайна как такового и нет.
MQTT и умный дом.
Так же отдельный большой раздел.
Настройки подключения к MQTT. Все отображается в лайве, а так же есть подсказочки на какие топики подписаться если нужно это сделать вручную.
Обычно я не шел дальше ручной подписки на нужные топики, но тут что то захотелось ну прям автоматически все чтоб было. Итог таков. Если у вас дома есть Home Assistance и стоит расширение MQTT, вам больше ничего не надо делать. Все найдется и добавится в систему автоматически как надо и без танцев с конфигурациями, отдельным устройством, в котором усе уже сконфигурировано как нужно.
Конечно забавно, но виртуальные реле из HA добавляются снова в HA, можно исправить, но не вижу смысла)
Не знаю, тут особо рассказывать то больше и нечего, из HA можно прокинуть уже куда хотите, хоть в Apple Home, хоть в Алису. Задавать сценарии и тд. В будущем возможно я расширю возможности настроек MQTT, что бы можно было выбрать а что конкретно вообще по этому вашему MQTT передавать то, но пока это жестко захардкожено и он передает все сенсоры и все реле. А больше как будто и не нужно, разве что блокировку таймеров и их настройку ещё бы завести, но как будто ту мач.
Система
Отсюда, можно забэкапить всё, что происходит в системе. конфигурацию реле, насосов, удобрений, бака, посадки и так далее и тому подобное. Всё качается в ZIP архиве и так же восстанавливается в одну кнопку на чистой системе. Это очень очень полезно, тк я за время тестирования и кучи форматирований флешек и Spifs просто устал заполнять всё руками. А так же помогает если вдруг вы сменили SD или отчистили SPIFS обновив прошивку. (Дада, кнопка файловой системы называется LittleFS так это потому что я всегда их путаю, но в данном проекте SPIFS)
Ну и возможность обновить систему через OTA .bin или обновить сам веб интерфейс, чего я делать больше не планирую.
Telegramm
Это последняя в этом посте система, телеграмм уведомления.
Во вторых, может уведомлять о том, что система засорена и насос не будет включен, или кончился раствор. (скриншоты из тестирования)
Конечно же она шлет ежедневные отчеты в 9 или во сколько вы выберете утра. С фотографией, параметрами и счетчиком незапланированных перезапусков за все время. (незапланированный перезапуск, это перезапуск даже от обновления прошивки, его можно скинуть)
Ну и конечно, система может выслать вам неприятные сообщения, которые вас уже изрядно бесят.
Каждый запуск системы, это куча проверок на работоспособность всех микросервисов системы. И их запуск. О чем телеграмм бот и сообщает. Тут немного дублируется логирование, тк STILL BETA. Но ничего)
Давайте на этом закончим вторую часть. В третей, я хотел бы рассказать уже о датчиках, их калибровке, температурных компенсациях, проблемах, шкалах NaCl и других. Австралийских аршинах в измерении EC. А в четвертой, если успею доделать 4.2, расскажу об интерфейсах взаимодействия с фермой. (Веб интерфейс, экран Nextion) вообщем очень много какой инфой могу поделится в этом цикле постов.
Подключение TCD1205D к ESP32
всем привет. прощу помощи в подключении линейного считывателя изображения к esp32. проблема с распиновкой видимо.
моё подключение пинов
питание беру отдельно и даю 5 вольт
GROUND втыкаю в GND на плате
далее
SH (shift gate) - > GPIO 23
ICG (integration clear gate) -> GPIO 22
Φ1 (clock phase 1) -> GPIO 21
Φ2 (clock phase2) -> GPIO 19
OS (output signal) -> GPIO 18
пины брал с офф сайта https://www.alldatasheet.com/datasheet-pdf/view/32192/TOSHIB...
код ардуино такой
#define SH 23 // GPIO 23
#define ICG 22 // GPIO 22
#define PHI_M 21 // GPIO 21
#define PHI_M2 19 // GPIO 19
#define OS 18 // GPIO 18
void setup() {
Serial.begin(115200);
// Настройка выводов
pinMode(SH, OUTPUT);
pinMode(ICG, OUTPUT);
pinMode(PHI_M, OUTPUT);
pinMode(PHI_M2, OUTPUT);
pinMode(OS, INPUT); // входной сигнал
}
void loop() {
digitalWrite(ICG, HIGH); // Включаем ICG
delay(10);
digitalWrite(ICG, LOW); // Выключаем ICG
// Считывание данных
for (int i = 0; i < 128; i++) {
digitalWrite(SH, HIGH);
delayMicroseconds(10);
digitalWrite(SH, LOW);
// Чтение выходного сигнала
int pixelValue = digitalRead(OS);
Serial.println(pixelValue);
}
// Генерация тактового сигнала
for (int j = 0; j < 128; j++) {
digitalWrite(PHI_M, HIGH);
delayMicroseconds(10);
digitalWrite(PHI_M, LOW);
digitalWrite(PHI_M2, HIGH);
delayMicroseconds(10);
digitalWrite(PHI_M2, LOW);
}
delay(1000);
}
в результате я получаю 1 при включенном tcd и 0 при выключенном. чтобы я не делал и не ставил перед tcd значения не меняются.
может кто в теме. возможно проблема с интервалами. копа еще и перебираю. но если кто в теме подсобите пожалуйста :)
заранее спасибо.
"Отверточный" блок управления из китайских деталей
Брутально, надёжно. Выглядит не очень. Тазик с вермишелью. Блочно-модульный. Шлейфы нарезка/обжимка наших рук дело. Сварной каркас из 25 уголка и дин-реек.
Тестовую софтину под Винду сами рисовали в HiAsm.
Альтернатива ПЛК? Вполне. Блок для АСУ ТП? Возможно.
Цена затрат около 20 кило рублей на один каркас.
Времени 3...4 месяца по 6...8 часов в неделю.
Компановка:
Мини ПК: селерон 2 потока 1.8ггц, 4гб дд3, ssd 128gb.
БП 12 вольт 400 ватт китайских
4 модульных блока, каждый из которых содержит 8 реле, 8 входов, контроллер esp32 wroom. Все на оптопарах, с подтягивающими резисторами на землю, инверторами уровня.
Вполне заменит релейных блок автоматики старого советского станка.
Для чего, собственно, и изготавливался.
Изготовлено 2 шт.