Собственно продолжение поста про моё устройство для выращивания различных растений.
Сама измеряющая платформа с тензодатчиком. Печатается на 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, тк изначально собственно под него и проектировался.
Расположение самих форсунок тоже важно. Разместить их надо таким образом, что бы будущая корневая система не загородила собой одну\две\три из форсунок и не отняла питание у остальных растений, так же надо учесть что бы струя не била напрямую в горшочки, а увлажняла воздух вокруг, ну и естественно что бы это не было так, что из щелей фигачит водяной туман и увлажняет все вокруг и вокруг системы лужи.
Вариант 1, форсунки в верхней части направлены вниз.
Я сделал около 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) вообщем очень много какой инфой могу поделится в этом цикле постов.