Ранее я уже создавал проекты по управлению реле с использованием сенсорных дисплеев DWIN и Nextion. Реализация этих проектов не представляет большой сложности. Для этого требуется отрисовывать графику, правильно её нарезать и предварительно изучить недружелюбную документацию, в случае DWIN. С помощью программы Easy HMI это можно сделать гораздо быстрее. Создать проект можно минут за 20–30.
По просьбам трудящихся, я постараюсь сделать это в виде некоего обучающего рассказа что ли. Но конечно не step by step инструкции. Краткие выдержки кода и описание алгоритмов и чего куда вообще совать что бы эти ваши показания получать. Сегодня поговорим о PH сенсорах и моем опыте. Я подразобью на более короткие посты для удобства чтения.
PH Sensor
Я пробовал 2 сенсора PH. от DF-Robot и дешевый из синего маркетплейса.
1/2
Вот такие сенсоры
Ссылки на все я приведу в конце поста.
Сейчас я использую pH-датчик от DFRobot — он отлично подходит для непрерывного мониторинга 24/7. Показания стабильны, со временем не «плывут» (дрейф отсутствует — проверено на практике), а калибровка реализована удобно и просто. Чуть позже покажу, как она устроена на примерах кода.
А вот с дешёвым noname-датчиком всё гораздо веселее. На плате два подстроечных резистора: один, судя по всему, отвечает за калибровку нулевой точки (pH 7.0), второй — за чувствительность. Документации — минимум. Настроить этот модуль так, чтобы он давал стабильные показания, — почти как пройти Super Meat Boy на 100%… и не сломать ничего от сгоревшей пятой точки..
Небольшая сравнительная таблица, информации мало для сравнения.
Стоит ли покупать дешёвый pH-сенсор? Нет и ещё раз нет. Даже если ваш код написан идеально, это не спасёт от нестабильной работы самого датчика. Через день-два показания могут начать «плавать» — pH то завышается, то занижается на 3–4 единицы без видимых причин. Сенсор просто начинает вести себя непредсказуемо.
И если у вас на такие данные завязана автоматика (например, дозаторы pH- или pH+), последствия будут неприятными: система начнёт вносить корректоры на основе ложных показаний. В итоге — испорченный раствор и потеря времени, так ещё и потраченные впустую корректоры PH.
Сенсоры от DFRobot мне показались гораздо стабильнее и надёжнее. Да, они стоят дороже, но по опыту — это оправданно. Поэтому далее всё что написано, относится к конкретно H-101 сенсору.
Подключение РH.
Подключение pH-сенсора — дело довольно простое. Информация по распиновке обычно указана прямо на сайте производителя или в описании товара (в том числе на AliExpress). Всё, что нужно — подключить выход сенсора к аналоговому входу вашей платы: будь то ESP32, Arduino или любая другая платформа.
Этот конкретный сенсор, судя по данным и практике, выдаёт сигнал до 3.3 В, так что его можно безопасно подключать напрямую к пинам ESP32 — без делителя напряжения. Я так и делаю, и всё работает стабильно. Делитель нужен, только если сенсор выдаёт до 5 В (что бывает у некоторых моделей), а ваша плата работает от 3.3 В. В случае с классической Arduino делитель не нужен, так как она спокойно воспринимает до 5 В на аналоговых входах.
Подключение.
Калибровка PH.
Калибровка pH-сенсоров всегда выполняется с помощью буферных растворов — это жидкости с точно заданным значением pH. Калибровка может быть двух- или трёхточечной: чем больше точек, тем точнее можно подогнать датчик под реальный диапазон.
Буферные растворы бывают в виде порошков (которые нужно растворить) или уже готовые к использованию. Их подбирают так, чтобы они охватывали рабочий диапазон измерений.
В моём случае я использую двухточечную калибровку — по значениям pH 4.0 и pH 7.0, чего вполне достаточно для контроля большинства питательных растворов.
Буферные растворы для калибровки PH.
Сама калибровка проходит в два последовательных этапа. Сначала сенсор промывается в дистиллированной воде и аккуратно просушивается (я использую салфетку, не протирая стекло — просто промакиваю). После этого сенсор помещается в буферный раствор с pH 4.0. Ждём, пока значения напряжения стабилизируются, и нажимаем кнопку калибровки по pH 4.0 — первый этап завершён.
Далее — всё то же самое, но уже с раствором pH 7.0. После второго нажатия кнопки калибровки сенсор готов к работе.
А вот и фрагмент кода, который у меня отвечает за калибровку pH-сенсора. Он используется при нажатии кнопки калибровки (по pH 4.0 или 7.0):
Функция readStablePHVoltage используется для получения надёжного и стабильного значения напряжения с pH-сенсора перед калибровкой.
Сначала она делает 20 аналоговых замеров с небольшими паузами между ними. Значения переводятся в милливольты и сохраняются в массив.
После этого вычисляется среднее напряжение, а слишком сильные выбросы (если разница с средним превышает 500 мВ) игнорируются — они заменяются на усреднённое значение.
Далее считается стандартное отклонение (σ) — если оно меньше 30 мВ, сигнал считается стабильным и пригодным для калибровки. В противном случае функция сообщает в лог о нестабильности и отменяет процесс.
Кроме самого результата, в лог отправляется подробная информация: все замеры, среднее, минимум, максимум и разброс значений. Это помогает при отладке и повышает надёжность всей системы.
Измерения PH
При измерениях любых параметров жидкости необходимо учитывать её температуру, так как это напрямую влияет на точность показаний. Особенно это критично для pH — с повышением температуры активность ионов водорода возрастает, и даже идеально откалиброванный сенсор начнёт показывать отклонения. В модуле который использую я, по заявлениям уже учитывается этот фактор. Поэтому в моих функциях нет реализации температурной компенсации.
Собственно сама функция чтения PH. В ней мы уже обращаемся к другой функции считывания напряжения. Она гораздо больше фильтрует значения напряжения, и не мешает при этом калибровке. Именно поэтому их тут две.
Для получения чистого и стабильного сигнала с pH-сенсора я использую многоступенчатую фильтрацию.
Всё начинается с простого усреднения — берутся 30 замеров подряд, и по ним считается среднее напряжение.
Затем подключается медианный фильтр: он отсеивает выбросы, которые могли случайно попасть в серию замеров. После этого применяется скользящее среднее, чтобы ещё больше сгладить возможные резкие скачки.
И в конце — финальный этап: IIR-фильтр (экспоненциальное сглаживание), который делает сигнал максимально плавным, но при этом достаточно быстрым в реакции на изменения. Такой подход позволяет получать надёжные и устойчивые данные, на которые уже можно опираться при расчёте текущего уровня pH или при управлении системой.
Заключение.
Таким образом я измеряю PH своего раствора. Вот обещанные ссылки на компоненты из этого поста:
Дальше останется только привязать это к вашим интерфейсам взаимодействия с пользователем и в целом готово. Не претендую на какую то 100% правильность, вы можете сделать это иначе, но сейчас у меня работает отлично всё, напомню, что я в первую очередь 3д художник, который открыл для себя мир программирования и контроллеров)
Спасибо за внимание! Надеюсь скоро выпущу про TDS/EC сенсор, температурный датчик.
Функция измерения веса. Покажу конструкцию в 3д, так как показывать её в реальности весьма затруднительно. Я использую 60мм горшочки для гидропоники, поэтому проектировал под себя и свои нужды.
1/5
Сама измеряющая платформа с тензодатчиком. Печатается на 3д принтере и вставляется в мой кейс с растениями вместо обычной платформы (одной из 3х)
Собственно на изображениях видно, по центру стоит тензодатчик и вокруг него равноудаленно 7 слотов под горшочки с субстратом. От тензодатчика провод идет в АЦП HX711, но тут было несколько ньюансов: А) Обязательно заэкранировать кабель подключения от самого тензодатчика(я обернул экраном наполовину) и довести экран до АЦП. Б) Провести провод так, что бы если по нему капилярным эффектом начнет подниматься вода, он не добрался до датчика. Я сделал простую петлю и разместил его выше чем сам тензодатчик. Таким образом вода точно никак не попадет на АЦП. Сам же АЦП в герметичном корпусе. и вынесен отдельно от системы и подключается через TYPEC-TYPEC провод любой длины.
Это нужно для того, что бы провода от тензодатчика и до АЦП были как можно короче. а цифровой сигнал уже все равно на какое расстояние и с какими помехами передавать.
1/2
Корпус для АЦП.
Собственно сама функция измерения веса не замысловата и просто измеряет вес всего что стоит на ней. Тарирована вместе с платформой по умолчанию. Калибровка осуществляется по известному весу и выборкой в 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/2
Конструкция контейнера.
Расположение самих форсунок тоже важно. Разместить их надо таким образом, что бы будущая корневая система не загородила собой одну\две\три из форсунок и не отняла питание у остальных растений, так же надо учесть что бы струя не била напрямую в горшочки, а увлажняла воздух вокруг, ну и естественно что бы это не было так, что из щелей фигачит водяной туман и увлажняет все вокруг и вокруг системы лужи.
Вариант 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) вообщем очень много какой инфой могу поделится в этом цикле постов.
Всех приветствую. С момента последнего поста про мою гидропонику прошло весьма приличное время, но то не зря! Все это время, я не мытьем то катаньем, разрабатывал следующие, а потом ещё следующие и следующие итерации своей системы, и не могу остановится до сих пор. Постоянно изменял и игрался с центральными контроллерами, датчиками и обвязками и тд. В этом посте я очень поверхностно затрону все версии которые были и постараюсь рассказать о последней, текущей версии своей системы. Во всех тонкостях, с фотографиями и скриншотами и пояснениями.
Бюджет
Забудьте про адекватность в этом вопросе. За это время были и меги, и уны и esp32 и stm и малины(что борщ) и чего только не было. За потраченные деньги я мог бы купить фуру(или около того) салатов и других культур и обжираться ими долгими холодными месяцами. Но цель может и не оправдывает средства, за то это безумно интересное хобби. Кто то вливает тонны денег в сноуборд, я вливаю в контроллеры и всякое такое, даже если оно в итоге не пригодится, да и фиг с ним, когда нибудь будет нужно.
Железо
В итоге последняя версия сидит на ESP32S3-N16R8, чего и мне и системе хватает за глаза и за уши. PH: DF Robot PH Sensor TDS\EC: Самый бюджетный китайцкий TDS метр до 1000 ppm. TDS\EC2: Уже профисиональный модуль для измерения EC имеющий собственную калибровку на борту отдельной платы, длинный кабель, компенсации температур и тд. TEMP: Популярнейший ds18b20. 2 Бинарных некотнактных сенсора жидкости. 4 перестальтических насоса. 1 мембранный насос 5 вольт. 24V источник питания на 300W. DC-DC преобразователи 4 штуки. Полусамодельный блок реле на 4 реле OMRON G2RL1E5DC. 4 силовых ключа. HX711 и тензодатчик до 1кг. Насос 24 вольта, 10 бар. Форсунки 0.3мм 10 штук.
Первую версию ищи у меня в посте (если интересно) Гидропоника начало, вторая версия которая прослужила весьма долго была на том же железе, но с переписанным софтом и измененным подходом. Если раньше это был деревянный стеллаж, то сейчас это уже металический, стелажищще(шучу), маленький стеллажик, на 4 полки. К которому к задней стенке просто открытым монтажем все и крепилось.
1/3
Примерно вот так выглядел процесс сборки, задняя панель стеллажа и собственно сам результат (спойлер, все салаты вымахали, без каких либо проблем) А так же был экран управления, закрепленный и вынесенный отдельно, со всеми нужными параметрами(внизу)
У всей этой конструкции был один главный недостаток. Колхозность исполнения и проявлялась она в постоянных проблемах, то с протечками в соединениях шлангов(их в целом было слишком много), то мерцающие китайские лампы которые не давали даже нормально заснять процесс дешевыми способами(на iPhone конечно все шикарно, но вот на какую нибудь IP камеру, отвратительно, несмотря на все включенные галочки для борьбы с мерцанием и полосами) и конечно софтверные постоянные глюки, отвалы или например залипания реле, некорректные измерения PH из за нестабильного напряжения на датчиках и так далее, ну и самый главный пункт - громоздкость конструкции и не возможность переместить саму систему например в другой шкаф или стеллаж, тоесть сам стеллаж и был гидропоникой. Вообщем, дорастил я партию салатов из 40 штук, 3 черри томата на ней и понял, что это мучение а не умная ферма и вообщем то я мог бы обойтись ведром и воздушным аквариумным компрессором за две тыщи и результат возможно вышел бы лучше даже, пусть и в меньшем количестве. В итоге было решено не бросать все это дело, тк ну очень интересен оказался сам процесс. А сделать следующую генерацию и учесть все эти ошибки.
Версия 3.0
1/4
По моим планам, это должны быть вот такие модульные блоки, которые должны собираться в одну башенку. (Размер MAC-MIni) и содержать в себе все необходимые мне функции)
Тут я попробовал другой подход. Модульные блоки. В планах было 3 штуки: Центральный блок: Блок отвечающий за раствор. Он же опрашивал все датчики, связывался во внешний мир, командовал мини насосами для корректировки раствора по PH / EC и тд. Вообщем все что связано с раствором, это к нему. Он мог получать питание как отдельно через вход питания непосредственно на нём, так и через соседние блоки.
Блок реле: В нём устанавливался блок реле на 8 штук, блок питания 24 вольта и блок комутации 220V. Тоесть по сути, подключалось все одним проводом, а дальше по сути получался умный удленитель на 8 розеток, в каждой из которых уже есть 220V. И в нём есть свой контроллер, который этим всем делом рулил. Мог отдельно, а мог впаре с основным (Master) контроллеров в центральном блоке.
Блок центрального насоса: В нём просто стоял насос на 24 вольта, 10 бар. для аэропоники. Этот блок даже не был смоделирован. Но потенциально мог нести в себе расходомеры\датчики давления и тд. Вообщем вся необходимая обвязка для защиты насоса и блоков.
Соединялось это между друг другом без каких либо проводов, путем использования магнитных разъемов POGO-PIN и I2C шины. По сути был Master контроллер и Slave. Которые просто при соединении начинали пинговать друг друга говоря я тут, а мастер уже понимал, что вот блок реле, значит теперь мы ещё и управляем реле. И так же мог бы детектить ошибки, перезагружать друг друга и так далее.Аналог CAN в машине, где блоки общаются друг с другом и все друг о друге знают. А на экране\веб интерфейсе открывался блок взаимодействия с этим блоком. Но все так же к ним можно было достучаться и по отдельности. Вообщем ультра сложная система, но имела свою гибкость. Но не суждено было даже дойти до момента работы. Собрал я только блок реле и главный блок, а потом начались праздники, упадок сил, осень и на балконе стало прохладно для гидропоники и предстоящий там же ремонт. Вообщем одним словом, энтузиазм закончился на проекте и половинной реализации. Возможно слишком уж переусложнил и неподъемным сделал концепт, не знаю.
Наконец, версия 4.0 и переход в 4.1-4.2 и до 5.0, в процессе.
Прошу прощения, за долгое вступление к теме поста. Но по моему у меня все посты вот такие вот.
Что тут скажешь. Теперь это действительно умная ферма. Имеющая на борту возможность автоматической корректировки EC и PH, да не просто по значениям, а вычисляющее нужное минимальное значение удобрений и PH для каждого из растений в системе или среднее, в зависимости от культур и их фазы роста и других параметров, вообщем есть интеллектуальный режим поддержания EC и\или PH, простой режим поддержания по заданным значениям. Предсказание роста (в граммах ко дню), даты предполагаемого сбора урожая, измерение веса, логирование PH/EC/Веса/Температуры. Интеллектуальное распределение веса для всех растений(хоть однажды измеренных на автоматических весах), управление реле\pwm\виртуальными реле(любыми умными розетками(Xiaomi\Tuya\Яндекс), APi с авторизацией и конечно же многократными защитами от некорректных действий самой же системы, и это только начало, функций ооочень много. Всех их я написал и многократно тестировал. Проект разросся до тысяч и тысяч строк кода и сейчас работа с системой приносит одно удовольствие, ну разве что роборука сама на сажает и не собирает урожай. Но то ли ещё будет. Не зря у меня бакалаврская степень по робототехнике. Авось и диплом пригодится. И всё это влезло в незамысловатых размеров коробченку которая была задана размерами печатной области моего принтера и свободным местом рядом с платформой выращивания.
1/2
Версия 4.0
Выше версия 4.0, сделана ещё 4.1 и 4.2, но с малозначительными отличиями. На цвет прошу не обращать внимания, печатал чем было, не хотел тратить хороший пластик на то, что возможно в будущем претерпит ещё некоторые изменения(а они будут).
Ну и собственно на видео версия уже 4.1. Блок реле был заменен из за проблем с залипанием при включении света. Скорее всего это скачок стартового тока, из за особенности драйверов светодиодных ламп. Но это как минимум странно, т.к. в пике потребления ток составлял около 400мА, что кратно меньше чем пиковый ток написанный на реле(10А),заменил на 6 модульный (из 6 твердотельных реле), что улучшило ситуацию, но добавило новых проблем, ежесекундная зарядка и разрядка конденсаторов в конечных потребителях и их кратковременный запуск(при выключенном реле, как я понял это можно решить Снаббером, но это что то уже совсем очень сложно). Замена на твердотельную схемотехнику, повлекло за собой и добавление силовых ключей для DC 12V на перильстатические насосы (раньше они коммутировались обычными механическими реле) и не требовали такого. Что в свою очередь затребовало изменение конструкции для того что бы освободить место для готовых модулей. В итоге не помогло ничего. Кроме как просто перепайка реле на нормальные механические от OMRON и так же на 10 ампер и всё заработало как часы. Думаю все популярные нынче модули на синих и желтых маркетплейсах зачастую с поддельными компонентами, тк не верю что на 8 реле модуль может стоить 400-500 рублей.
Версия 4.0 была на базе контроллера ESP32, а вот 4.2 уже переехала на ESP32S3, свою DEV плату с пинами и тд. Но все ещё имеет в обвязке кучу готовых китайских модулей, что естественно раздувает корпус до такого состояния. Сейчас у меня используется и тестируется активно (и так же все ещё в процессе разработки) версия 4.2 плавно перетекающая в уже 5.0 и причину этого я опишу в конце поста, там же где и расскажу о будущем этой системы, какие планируются функции и дальнейшие шаги. А сейчас хочу показать вам её поближе и начну структурировано с функций системы: Напомню, у меня Аэропоника и цель - выращивание в основном салатов.
Ниже длиннющее описание всех(или почти всех) функций системы. Можете пролистать если не интересно.
Функции:
Таймеры. Таймеров у меня есть 2 вида и их можно комбинировать при необходимости. Интервальные и Временные. Соответственно если надо включить любое из реле\силового ключа\виртуальной розетки, он включит либо в нужное время по RTC, либо по отсчету(например раз в 10 секунд на 2 секунды или раз в 5 минут на 10 секунд и тд).
Блок таймеров в веб интерфейсе. Всё обновляется в LIVE режиме, имеет уведомления или возможность блокировки от срабатывания.
Привязка устройств к реле. Каждое из реле в системе\силовой ключ\виртуальное реле можно привязать к насосу, свету. Это нужно что бы система поняла, чем она управляет. У перистальтических насосов есть так же тест и задание производительности. Очень простой механизм включающий насос на 1 минуту, и с помощью мерной емкости можно скорректировать производительность относительно той что пишет производитель.
Блок настройки реле
Управление реле. Тут все банально, просто кнопочки. С подсветочкой во время работы и иконками соответствующие названию и\или типу если он задан в параметрах системы для какого то из переключателей.
Блок реле. Все синхронизировано и состояния отображаются в Live режиме, не зависимо от места переключения реле. (Apple Home/Экран/Таймер/веб реле/MQTT и тд) и имена конечно тоже синхронизированы. Их можно переименовывать в настройках реле.
Панель Сенсоров. Тут тоже все банально до жути. PH EC температура, остаток раствора и масса всех растений на платформе.
Система показаний. При желании можно изменять панель сенсоров. (у меня например 2 сенсора EC и можно вывести показания сразу с двух, или вес каждого из растений на платформе. Вообщем вещь кастомизируемая.
Графики pH/EC/Температуры/Веса. Логирование - это очень важно в подобного рода системах. Поэтому у меня регулярно прямо в системе пишется лог и строится график. Графики за последние сутки, а логи доступны за месяц. PH/TDS/Температура пишутся каждые 5 минут, а вес - каждый час. Ну и это доступно через веб интерфейс для просмотра. Я сделал себе не больше 100 строк на график из лога. Т.к. больше в веб интерфейсе локальном считаю не нужным. Самый интересный график тут, это конечно веса. Все остальное более менее всегда стабильно.
Любимые любим электронщиком графены. Можно посмотреть всё что нужно за последнее время. (больше мне не нужно, так как долгая инфа хранится в Grafana или HA).
Посадаки и культуры. Это очень большой функционал. Это используется в нескольких случаях. Анализ роста, журнала для себя, что б не забыть куда и что посадил, какая фаза у растения сейчас, когда посадил, когда собирать и так далее. Все просто и информативно.
Текущие тестовые посадки. Реально растут в системе.
1/3
На выбор пока моя система поддерживает такой вид культур. В дальнейшем думаю как расширить этот список. Ограничение к сожалению и физическое и биологическое. Тут подобрана в основном всякая зелень и тд. Тк в основном сосредоточился на этом.
Вся система посадок плотно завязана с датчиками, интелектуальным режимом поддержания EC и PH, что позволяет добиться полной автономности. Обладает различными защитами и ограничениями от дурака. Условно посадить какую нибудь голубику к салатам не получится. Система просто не откорректирует раствор под неё никаким образом. Она будет её игнорировать. Интелектуальный режим работает только на поддерживаемых растениях, системой. И тут мы плавно подходим к поддержанию PH и EC, одной из главных функций. умной системы:
Три режима. Ручное управление, поддержание и интелектуальный режим.
Ручное и поддержание - это простые режимы. Если выпадает за 5% свыше или ниже диапазона, значит надо влить N удобрения AB и или PH+/- если выпал этот случай, перемешать и проверить снова через несколько минут. Вообщем чуть усложненное сравнение. Интелектуальный режим, же обращается к списку посадок, культур, весу, какое удобрение(производитель) используется системой, датам и текущим параметрам с EC\PH, какие насосы есть в системе и тд. Например, у меня нет в системе растений, но уже подготовлен раствор к примеру с EC 1.5 (1500), что просто дофига для маленьких старта растений. Но пока растений нет, система не сделает ничего. Но стоит посадить к примеру салат Ромэйн в системе, она сразу поймет, что это семечка, такая дозировка сейчас не нужна поскольку нет никаких растений и снизит её до правильной и нужной. Так же и с PH для каждого из посаженных растений. И дальше система просто наблюдает за посаженным растением. Условно спустя N дней, растение как правило переходит в фазу вегетации, что требует уже другой концентрации раствора, система и повышает концетрацию сама и автоматически. И так весь цикл роста. Как вычислить фазы? Примерно прикинув и погуглив и почитав, я расписал все фазы роста для поддерживаемых растений и самое главное примерно интерполировал вес в граммах для этой стадии. Условно вес активно набирается только в стадии Роста, а значит мы имея весы и зная дату посадки, можем вычислить её начало спустя пару тройку дней и подкорректировать EC и самое главное откорректировать этот параметр для дальнейшей эксплуатации. Вообщем это весьма не хитрая, но в то же время сложная система.
Прямой вопрос, что будет если у меня 10 салатов в стадии роста активной и я посадил ещё 5 проращиваться. окей, не проблема. Система возьмет максимум который можно дать семечкам и минимум который можно дать тем кто в стадии роста. Посмотрит сколько дней осталось до окончания фазы роста до финиша и сравнит сколько дней до фазы вегетации к примеру. И постепенно будет корректировать таким образом, что бы и удволетворить фазу роста и подготовить салаты к фазе промывки и при этом не убить семечку салата на этапе проростания, когда она ещё совсем слабая. В цифрах это значит что система снизит концетрацию например до EC ~ 1.2 мСм\см, чего хватит салатам в фазе роста, но много для салатов в стадии всхода многовато, но терпимо. В дальнейшем ближе к концу фазы роста, за 7 дней до конца, система сама будет снижать концентрацию для финиша. до 0.8-1 EC. После окончания этой фазы, вырасшие растения удаляются из расчетов. Но это только с салатами. А если я сделаю тоже самое, но добавлю ещё другую культуру и третью, система запутается? Нет. Она не запутается, а просто будет считать сильно проще. Она возьмет все стадии, вычислит количество преобладающих растений в высшей фазе и подстроит по её нижней границе необходимое значение EC. Тут банально логично предположить,что больше удачно выращенных растений = лучше.
Ну и собственно в самой системе можно выбрать текущее удобрение, увидеть инструкцию по применению и интерактивную таблицу которая покажет в какой стадии большее количество растений в системе и нормальны ли показания для этой стадии сейчас.
Что то вышло ОООЧЕнь длиннопост. Поэтому вскоре я оформлю вторую часть. Где покажу остальные функции, интерфейсы, MQTT и каким образом я прокинул все в Apple Home устройством, расскажу о ежедневных отчетах в телеграмм ботом с фотографией и других возможностях. А пока, как вы могли заметить скриншоты по интерфейсу слегка отличаются по дизайну. Это все по тому, что я в данный момент, переделываю пользовательский интерфейс на React JS и взаимодействие с APi системы. Отказываюсь от SPIFS для веб страниц и переношу фронт на отдельный уже сервер с авторизацией и внешним доступом(хоть он не особо и нужен, но хочется). А так же возможно в следующем посте, уже будет готов проект полностью кастомной печатной платы со всей необходимой переферией, для работы системы. Пока покажу набросок, который я сейчас проектирую и одновременно учусь, я первый раз проектирую свою плату, и в первый раз открыл Easy IDE. Но обо всем, в следующем посте.
А, ну и че вообще, растет что то или нахрен вообще нужны эти салаты?) Конечно растет. Стахановскими темпами)
1/3
Те же самые салаты что в первом видео, но спустя время)
Работа по беспроводной сети планировалась при старте разработки Easy HMI и дисплеев AT HMI. В первых версиях также была заложена работа по беспроводной сети с использованием собственного протокола. Однако обучение новому протоколу оказалось гораздо сложнее, чем предоставление возможности работать с уже знакомым протоколом передачи данных. Поэтому было принято решение сделать реализацию общения по протоколу UDP.
На основе наработок по созданию HMI-дисплея из TFT-дисплея и ESP32 реализована поддержка дисплеев с различным разрешением и разными драйверами. Работа протестирована на дисплеях от 2,4 до 3,5 дюйма. Также реализовано автоматическое определение сенсора и его инициализация. Сейчас поддерживаются не только дисплеи с резистивным сенсором, но и дисплеи с емкостным сенсором с драйверами: GT911, CST816S. При необходимости можно добавить поддержку и других сенсоров.
Ниже приведен список поддерживаемых моделей дисплеев:
В этом году я планировал открыть свой образовательный центр технической направленности (по большому счету кружек робототехники и программирования с продвинутыми программами). К сожалению, идею пока пришлось отложить, но решение одной из проблем я описал в этой статье.
На этапе планирования учебных программ я столкнулся с проблемой выбора контроллера для обучения детей среднего школьного возраста (5-8 класс). Для младших уже существует Wedo, и этот конструктор хорошо себя зарекомендовал. Старшие уже хорошо усваивают Arduino и 3D-моделирование. А для средневозрастных ребят, исходя из своего почти восьмилетнего опыта преподавания робототехники, хотелось бы что-то среднее. Чтобы можно было программировать и блоками (желательно еще сразу видеть код), и напрямую в Arduino IDE. При этом в удобном защищенном корпусе, с минимизированным шансом пораниться или что-то сжечь, и возможностью собирать робота из готовых деталей.
Для этих целей все используют EV3, но мне не нравится программирование только блоками, спорные по качеству датчики, монструозные по размерам итоговые сборки (в основном из-за размера контроллера), ну и, честно говоря, цена. Как вариант с адекватной стоимостью, использовать китайский kazi EV6, но остальные проблемы остаются. Я знаю, что можно программировать на microPython, но это костыль, и все равно детей надо готовить к Arduino.
В этом плане мне понравился образовательный набор от RED (хотя когда я его первый раз пощупал, долго от него плевался). Их контроллер One, по сути, шилд для ардуины с выведенными портами и встроенными драйверами двигателя, в красивом пластиковом корпусе (в первых партиях напечатанном на 3D принтере). Контроллер совместим с лего деталями, и поставляется с немного измененным ресурсным набором 45544 и спорным набором Arduino датчиков, тоже в корпусах. А их среда программирования реализована на принципах scratch, но по сути дублирует ArduBlock.
1/2
Контроллер RED. Распиновка, на мой взгляд, бредовая и немного неудачный корпус.
Однако у этого решения тоже существуют проблемы. Начиная от странной распиновки, заканчивая не самой удачной конструкцией корпуса. Большинство проблем они решили в контроллере X, но зачем-то перевели его с аккумуляторов на батарейки, закрыли возможность программировать из ArduinoIDE и взвинтили ценник.
В общем, решил, чем я хуже? Сделаем свой контроллер!
Первым делом я занялся проектированием платы. При работе с обычной Arduino у ребят чаще всего возникают следующие проблемы: недостаток портов питания (все время приходится изобретать какие-то шины) и большое количество проводных соединений. Поэтому от неё мне нужно было наличие встроенных драйверов для двигателей и адекватной распиновки. Первый вариант схемы на базе Arduino nano я набросал минут за 30. Сильно мудрить не стал, и просто использовал схемы проверенных модулей для Arduino. В качестве драйверов я использовал микросхемы l9110s, которые работают по схеме Н-мост, для стабильных 5в просто стабилизатор L7805, немного резисторов и конденсаторов согласно схемам (пару которых забыл), диодик для защиты от переполюсовки. Также быстро развел печатку, и плата rev-1 готова!
На драйвера задействованы порты 3,9,10,11. Немного нерационально, но это для совместимости с red. Остальные порты постарался вывести максимально удобно, добавив к каждому шину питания.
Получившаяся распиновка (на картинке плата rev-2, но распиновка не изменилась)
Решил попробовать заказать изготовление. JLCPCB, как известно, с Россией сейчас не работает. Но легко нашелся аналогичный производитель, NextPCP. У них аналогичный сервис, цены немного повыше, зато оплата через AliExpress путем покупки нескольких лотов по 1$. Сделал заказ на изготовление 10 плат, и спустя месяц они у меня.
1/2
Запаял минимальное количество деталей для оценки габаритов и занялся проектированием корпуса.
При проектировании корпуса старался победить все проблемы red-а, которые мы (в основном мои коллеги) накопили за время работы с ним. А именно:
Абсолютно дурацкое крепление крышки аккумуляторов 14500 на двух винтах, из за чего ей никто не пользуется, т.к. аккумуляторы надо часто доставать на зарядку.
Неудачно расположенное крепление к lego (меня попросили его поставить пониже, т.к. робот часто просто цеплял пол днищем этого контроллера).
Отсутствие кнопки перезагрузки.
И немного неудобное расположение кнопки питания.
Более-менее сносный вариант корпуса получился почти с третьего раза.
1/5
Первые варианты корпуса
1/3
Крышка батарейного отсека получилась довольно удачной, в виде сдвигающейся шторки. Вышло и надежно, и удобно.
К этому моменту ко мне доехал ресурсный набор и появилась возможность тестировать этот контроллер, чем я и занялся. Допаял схему, на удивление все заработало, и сразу от аккумуляторов. Но при проверке драйверов оказалось, что один мотор нормально не работает. Перебрав несколько микросхем l9110s, которые я заказывал в прошлом году, оказалось, что почти все они бракованные. В итоге заработали сдутые с живых плат драйверов двигателя, чему я очень обрадовался.
Собрал первую телегу
Но счастье было не долгим!
В первый же вечер, играясь этой телегой через bluetooth, я спалил оба драйвера :D.
Оказалось, я просто забыл о конденсаторах между выходами на моторы, из-за чего драйвера и прошибало. Исправил этот момент в схеме. А на текущей железке просто распаял их между контактами.
1/2
Собрал телегу посолиднее, люблю гусеничные модели. Спроектировал сразу корпус для hc-06. Мучил её несколько дней (и до сих пор мучаю), больше проблем с драйверами не выявил.
1/2
Выглядит поинтереснее. Также заметен тот самый добавочный конденсатор по шине +5V
Еще оказалось, что 9-ый порт не может выдавать шим сигнал при задействовании первого таймера для сервопривода. Из-за этого один мотор не работал. Просто поменял в схеме 3 с 9 порты местами.
Последней проблемой, с которой я столкнулся, оказалась перезагрузка Arduino при резкой нагрузке на аккумуляторы. Выяснилось, что конденсатора всего в 0.1мкФ недостаточно по шине 5в (интересно, почему). Поменял его в схеме на обычный 2-х выводной электролит на 100 мкФ, а на текущей плате просто напаял поверх.
На этом найденные проблемы с платой закончились. Я развел плату более грамотно, увеличил размеры smd компонентов (на первой плате замучился их паять), поправил некоторые надписи. И заказал производство второй ревизии платы.
Вторая ревизия платы
Параллельно с этим велась доработка мелких косяков по корпусу и добавление всяких украшательств. И, спустя всего пару тестовых вариантов...
1/2
"Пара тестовых вариантов"
Я получил корпус, который хотел! Корпус (да и весь контроллер) спроектирован так, чтобы свести к мнимому шанс порчи контактов или замыкания. Старался чтобы было понятно, какие контакты за что отвечают, но они ещё дополнительно будут отмечены разными цветами гребенок. Порты моторов специально расположены со смещением, чтобы снизить риск попадания на соседние порты. Корпус имеет встроенный отсек для аккумуляторов формата 14500 и LEGO крепления с 3-х сторон. Кнопка включения расположена выше проводов, её так удобнее нажимать.
1/3
Наклейка не финальная (просто чтобы порты видно было). Кнопки будут белые.
В планах сделать набор на базе этого контроллера с немного соревновательным уклоном, с возможностью собрать робота для езды по линии, для прохождения лабиринта или перетаскивания предметов. Программировать можно в ArduBlock, ArduinoIDE и в любых других средах с поддержкой Arduino nano.
На данный момент ко мне едут платы второй ревизии. А я пока подбираю датчики и делаю для них корпуса. Точно будут пара ИК датчиков, лазерный и пара УЗ дальномеров, Bluetooth, и всякая мелочь типа модуля кнопки, rgb-светодиода и зумера. Есть проблема с заказом относительно больших партий ресурсных наборов и датчиков, с этим пока разбираюсь. Еще сделал группу в ВК про проекту, там публикую процесс разработки.
Если интересен проект, пожалуйста поддержите его. Буду рад подписке на группу :)
Пожелания и предложения тоже очень приветствуются!