Smart Plant OS: можно ли доверить растение дешёвому датчику?

—

от автора

Подключаем датчик, записываем два крайних значения и растягиваем диапазон на сто делений. На экране появляются убедительные «47% влажности» и вот уже рядом с растением появляется красивый график.

Но в какой момент этому числу можно доверить включение насоса?

К этому вопросу я постепенно и добрался в Smart Plant OS. В прошлой статье интерфейс впервые открылся с настоящей ESP32. С тех пор были написаны и переписаны тысячи строк кода: за внешне похожей страницей постепенно появлялась работающая система. Впереди оставался самый интересный переход — от интерфейса с растениями к устройству, которое получает данные и на их основании что-то делает.

Для начала хотелось избавиться от необходимости по каждой мелочи возвращаться к терминалу. Пока плат две и обе лежат на столе, такая настройка вполне терпима. Но я представлял следующий шаг: несколько растений в разных комнатах, новый контроллер, смена Wi-Fi, очередная версия прошивки. Повторять всю процедуру вручную быстро надоедает и отнимает много времени.

Поэтому первым делом появился веб-мастер первоначальной настройки. Подключаешься к точке доступа ESP32-S3, открываешь страницу, вводишь ключ владельца и выбираешь домашний Wi-Fi. После настройки попадаешь в основное приложение.

Отдельные ESP32-C3 теперь добавляются уже оттуда. Главный контроллер ищет новые устройства рядом, пользователь выбирает нужное, платы согласуют ключи и сохраняют связь. Домашний Wi-Fi отдельно в каждый ESP32-C3 вводить не требуется.

В дальнейшем хочу дополнить этот процесс индивидуальным QR-кодом для каждой платы. При подготовке устройства можно будет генерировать код подключения, а пользователь сможет отсканировать его в приложении и подтвердить, какую именно плату добавляет. Так первая привязка должна стать одновременно проще и более защищённой.

Интерфейс авторизации

Интерфейс авторизации

Как только подключение стало удобнее, возникло следующее требование: обновление тоже не должно заставлять заново настраивать всю установку.

Для S3 и C3 появились два OTA-слота. Новый образ записывается отдельно, проверяется и подтверждает успешный запуск. Предусмотрен возврат к предыдущему образу, а настройки и связь между устройствами при обычном обновлении сохраняются.

Теперь можно постепенно улучшать систему, оставляя растения, комнаты и настройки на своих местах. Это особенно пригодилось перед испытаниями: логика ещё будет меняться, и каждый новый опыт не должен начинаться с чистого листа.

После этого появилась возможность пройти весь путь: подключить C3, получить его состояние на S3 и увидеть данные в браузере. Вот теперь можно было заняться тем, ради чего всё и собиралось, грунтом.

Для первых опытов я взял три Capacitive Soil Moisture Sensor v1.2.

В статье про измерение влажности и самопроверку зонда я предложил значительно более сложную конструкцию и методику измерения. Но такая реализация сама становится отдельным большим проектом: измерительный тракт, электроника, механика, защита от воды и проверка того, дают ли дополнительные измерения полезную информацию.

Хвататься за всё сразу не хочется ,а то может получиться как в известной поговорке. Поэтому пока начинаю с доступных модулей и внедряю их в остальную систему. Это ещё и очень бюджетный вариант, что для домашнего проекта немаловажно. К более сложным датчикам можно будет перейти позже, уже понимая, какие проблемы они действительно должны решать.

Грунт для первой серии — универсальный Veltorf для комнатных растений, с указанной на упаковке кислотностью pH 5,5–7,0.

Подготовил три образца по 60 граммов грунта. Первый оставил без добавления воды, во второй добавил 23 грамма, в третий — 50. Отдельно приготовил чистую воду.

Все три датчика по очереди подключались к одному ESP32-C3 Super Mini: одинаковое питание 3,3 В и один вход GPIO3. Сначала записывал воздух, затем три состояния грунта, чистую воду и снова воздух. На каждое состояние — минута наблюдения.

Датчики влажности в стаканчиках с грунтом

Датчики влажности в стаканчиках с грунтом

Уже на этапе подготовки стало понятно, что просто смотреть на бегущие числа неудобно. Пока переставляешь датчик и следишь за образцами, легко потерять, какое значение к чему относилось.

Для фиксации измерений написал простенькую программу. Выбираешь датчик — №1, №2, №3, указываешь образец и запускаешь запись. Программа показывает график и сохраняет исходные значения в CSV и JSON.

В лабораторном режиме каждые 500 мс выполняются девять быстрых чтений ADC. На экране отображается медиана пакета, а в файл попадают все чтения. Это позволяет спокойно наблюдать за сигналом, сохраняя возможность потом посмотреть, что происходило до обработки.

Не хотелось сразу подбирать сглаживание под красивый график. Сначала нужно получить данные, а уже затем решать, какие изменения полезно отфильтровать и какие нельзя потерять.

В этой серии получилось 19 записей. Разобрать записи и сопоставить результаты помог ИИ: с ним было проще сравнить показания, пересчитать их в общую шкалу и обсудить возможные причины различий.

Для краткости обозначил датчики A, B и C. Ниже — округлённые медианные значения ADC:

Состояние

A

B

C

Воздух

2972

3048

2904

Исходный грунт

2350

2279

2093

Грунт +23 г воды

1391

1675

893

Грунт +50 г воды

792

990

605

Чистая вода

764

1005

604

Воздух после опыта

3000

3033

2923

Все три датчика последовательно реагировали на увлажнение: при добавлении воды показания уменьшались. На это я и надеялся. Различия между образцами были заметно больше обычных колебаний сигнала.

То есть доступный модуль уже даёт полезную информацию. Но достаточно посмотреть на соседние столбцы, чтобы увидеть следующую проблему: для одного состояния грунта разные экземпляры выдают разные значения.

Использовать одну калибровку для всех трёх без проверки нельзя. Немного грустно, хотя ожидаемо что одинаковая надпись на платах ещё не означает одинаковые показания.

Тогда я попробовал привести их к общей шкале. Для каждого экземпляра взял собственные опоры: исходный грунт обозначил как 0, а образец с добавленными 50 граммами воды — как 100.

индекс = 100 × (сухая точка − текущее значение) / (сухая точка − влажная точка)

Крайние точки после такого пересчёта совпадают по определению. Проверять нужно то, что находится между ними.

На образце с добавленными 23 граммами воды получилось:

Датчик

Относительный индекс

A

около 62

B

около 47

C

около 81

Если предположить линейную связь с количеством добавленной воды между этими опорами, ожидалось бы около 46: 23 / 50 × 100.

В этой серии B оказался ближе к такой зависимости. У A кривая заметно изгибалась, а C уже на промежуточном образце приблизился к своей мокрой точке.

Графики после нормализации

Графики после нормализации

Получается, простого растягивания диапазона недостаточно, чтобы сделать все экземпляры взаимозаменяемыми. При этом пока рано приписывать всю разницу электронике: глубина установки, уплотнение и контакт с грунтом тоже могли повлиять.

Поэтому следующую серию нужно расширять: больше состояний грунта, повторных установок, вариантов контакта и самих датчиков. Тогда станет понятнее, какая часть различий воспроизводится у конкретного модуля, а какапоявляется при его перестановке.

Есть и ещё одна зацепка. Грунт с +50 граммами воды у всех трёх давал значения, близкие к чистой воде. В этой области выбранные состояния различались слабо. Дальше интереснее добавить промежуточные образцы, например +10 и +35 граммов, и посмотреть на них.

Пока я оставил индивидуальную двухточечную калибровку. Она позволяет наблюдать за изменением конкретной установки.

Для первой версии управления поливом мне важнее добиться воспроизводимого порога в конкретном грунте. Более точную зависимость можно будет добавлять по мере накопления измерений и проверять на новых образцах.

Из этого решения сразу выросло требование к приложению: пользователь не должен разбираться в ADC и вручную переносить числа в настройки.

Так появился мастер калибровки. Сначала нужно взять отдельную порцию того же подсохшего грунта, установить датчик на выбранную глубину и нажать кнопку записи сухой точки. Затем равномерно увлажнить грунт в ёмкости с дренажом, дать лишней воде стечь и влаге распределиться, повторить установку и записать влажную точку.

Программа наблюдает за сигналом в течение минуты и проверяет, достаточно ли он устойчив. Если показания продолжают заметно меняться, предлагает подождать или проверить установку.

Но теперь возникла уже программная проблема. Датчик во время настройки находится в тестовом образце, а система может быть настроена на автоматический полив. Значит, сам процесс калибровки нужно явно отделить от обычной работы.

Для этого используется подтверждённое обслуживание. Оно оставляет контроллер в ручном режиме и блокирует включение автоматики через другую вкладку. После сохранения калибровки автоматический полив сам не запускается.

Так у настройки появляются два отдельных шага: сначала научить систему различать выбранные состояния грунта, затем выбрать условия полива.

Следом пришлось подумать и о времени измерений. В лаборатории удобно постоянно видеть свежий сигнал. В горшке, который спокойно стоит в комнате, такая частота нужна далеко не всегда. Для обычного наблюдения я планирую оставить опрос примерно раз в 5–10 минут. После полива, около выбранного порога или при необычном изменении сигнала частоту можно временно увеличивать.

В этот момент важна динамика: продолжается ли изменение, появилась ли реакция на воду, стабилизировалось ли состояние.

В текущей прошивке пока оставлен более частый опрос для испытаний: пять секунд в обычном состоянии и чаще при перепроверке. Переход к минутным интервалам — следующий шаг вместе с настройкой правил свежести данных и подтверждения сухости.

Из наблюдения за динамикой постепенно складывается и логика полива.

Одного краткого пересечения порога недостаточно: в прошивке предусмотрено подтверждение сухого состояния. Насос должен выдавать ограниченную порцию и останавливаться по времени. После этого система наблюдает за грунтом.

Если ожидаемой устойчивой реакции нет, повторный запуск блокируется. Это повод проверить установку датчика и подачу воды. Продолжать добавлять воду только потому, что одно число на экране всё ещё означает «сухо», было бы слишком смелым решением.

Следующий аппаратный этап как раз связан с настоящей подачей воды: проверить порцию, расположение зонда, задержку реакции грунта и поведение защит. Пока физически испытывались датчики и обмен между платами, а сценарии работы насоса проверялись программно.

Первые записи подсказали и то, зачем приложению нужна история. По текущему значению видно состояние в конкретный момент. По последовательности измерений уже можно изучать, как высыхает грунт, что меняется после полива и насколько похожи разные циклы.

Поэтому в приложении появились накопление измерений и сравнение периодов. Рядом с ними — дневник ухода, куда можно записать пересадку, удобрение или перестановку горшка. Со временем эти записи помогут разбирать изменения на графике вместе с тем, что происходило с растением.

Комнаты стали группами, растения можно переносить между ними, выбирать вид и вручную указывать стадию роста. Всё это остаётся в одном приложении.

Чем больше добавляю настроек, тем понимаю что важно не потерять уже введённые данные. Поэтому редакторы теперь предупреждают о несохранённых изменениях, проверяют согласованность параметров и сохраняют черновик при конфликте с другой вкладкой. А для нового устройства приложение показывает, что уже готово и что ещё нужно настроить.

Так проект постепенно меняется вслед за реальными сценариями. Сначала нужно было открыть страницу с платы. Затем удобно подключить следующую плату, получить показания, сохранить их, разобраться с калибровкой и подготовить проверяемую логику полива.

Испытания датчиков влажности я продолжу: хочется проверить повторяемость установки, собрать больше данных и проследить полный цикл — от полива до высыхания грунта. Параллельно предстоит решать другие задачи Smart Plant OS: надёжная связь, питание, хранение истории и подключение новых датчиков. Постепенно всё это должно сложиться в систему, которой можно доверить свои растения.

Если вам интересно поучаствовать — присоединяйтесь. Можно повторить эксперимент на своих датчиках и другом грунте, помочь с кодом, предложить решение или рассказать, что оказалось неудобным при первой настройке. Необязательно разбираться во всём проекте: даже один аккуратно проведённый опыт поможет сделать следующий шаг по улучшению Smart Plant OS увереннее.

Код и документация открыты на GitHub.

ссылка на оригинал статьи https://habr.com/ru/articles/1104692/