Приветствую, Хабр!

Статья о разработке контроллера измерения влажности почвы с передачей данных по Wi‑Fi. Конкретно это устройство было разработано для вертикальной фермы на 64 ячейки.

Вертикальная ферма – обобщённое название высокоавтоматизированного агропромышленного комплекса для выращивания культурных растений методами гидропоники или аэропоники в закрытых помещениях внутри специально спроектированного или адаптированного для этого здания (Материал из Википедии).

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

Схема реализована на микроконтроллере STM32F030C6T6 и довольно распространенном Wi-Fi модуле ESP-12E. Конечно, существует масса возможных вариантов реализации данной задумки, но так как контроллер и модуль уже были освоены в других проектах, было решено применять именно эту связку. Я занимался аппаратной частью, все ПО на Алексее, который программировал другой наш совместный проект (https://habr.com/ru/post/411537/). Также есть непосредственно заказчик, который придумывает функционал, тестирует и дает рекомендации. Например, в качестве датчиков влажности применены готовые емкостные, что-то типа:

Рис.1. Датчик влажности почвы
Рис.1. Датчик влажности почвы

Это обусловлено их дешевизной и легкой доступностью. Даже через лаковое покрытие на плате со временем появляется коррозия и датчики являются расходниками (нет смысла производить свои датчики в данный момент, хотя готовое и проверенное решение у нас есть). Задачу гидроизоляции верхней части датчиков тоже на заказчике. Протяжка проводов для подключения происходит на этапе установки фермы.

Наше устройство питается от блока питания 12В. С помощью DC/DC на датчики подается 4,2В. Напряжение выдается на два отдельных разъема, с каждого на 32 ячейки (включением и отключением можно управлять через WEB интерфейс). Для питания контроллера и модуля Wi-Fi стоит LDO.

Для опроса всех каналов задействованы 8 АЦП STM32, сигналы на которые подаются через мультиплексоры CD74HC4051M96. То есть каждый мультиплексор (соответственно один АЦП) получает данные от 8 ячеек.

Рис.2.1. Схема одного мультиплексора
Рис.2.1. Схема одного мультиплексора

Входы каждого мультиплексора заведены на разъемы TJ2-8P8C (RJ-45) позже стали использовать прямые, а не угловые – это упрощает прокладку проводов внутри корпуса. Тесты показали, что данные с датчиков без искажений приходят по витой паре. В другом нашем проекте мы заземляли экран кабелей аналоговых датчиков, так как в противном случае были существенные наводки от внешнего оборудования, но здесь этого не потребовалось.

С ESP все стандартно. Один программный UART используется для связи с микроконтроллером. Второй UART для вывода консольных логов. Две кнопки используются для сброса настроек и обновления прошивки. Для удобства есть индикация светодиодами и буззером.

Рис.2.1. Схема включение ESP
Рис.2.1. Схема включение ESP

Программная часть

Микроконтроллер одновременно переключает все мультиплексоры и читает данные со всех датчиков. Данные копятся в скользящее окне и усредняются. Отправка в ESP происходит по 128 байт. Далее ESP запаковывает все в JSON и отправляет на сервер по MQTT. На сервере вместе живут три сущности: Node-RED, influxdb и Grafana. Мы решили использовать облачный сервер, хотя можно запустить и на своей машине.

Node-RED с брокером MQTT получает данные, парсит их (level->function 1) и отправляет в базу данных influxdb. Тут все настраивается как в детском конструкторе – просто и удобно.

Рис.3. Node-RED
Рис.3. Node-RED

Также у Node-RED есть GUI для настройки системы и отображения, например, статуса. В данный момент он сделан в минималистическом виде. Сюда уходят статусные сообщения и применяются параметры. Параметры летят в ESP (какие каналы передаем) и STM32 (управление питанием и интервал отправки данных).

Рис.4. Dashboard GUI
Рис.4. Dashboard GUI

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

Рис.5. База данных influxdb
Рис.5. База данных influxdb

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

Рис.6. Grafana
Рис.6. Grafana

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

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

Рис.7. Контроллер в корпусе
Рис.7. Контроллер в корпусе
Рис.8. Вариант с вертикальными разъемами
Рис.8. Вариант с вертикальными разъемами

В данный момент ведется отладка и тестирование изделий. Мы копим данные, эмулируем различные варианты показаний и проводим проверки в реальной почве. Еще предстоит пересчет значений в проценты или относительные единицы с человеческой шкалой, возможно калибровка датчиков перед установкой.

Спасибо за внимание!

Комментарии (27)


  1. Javian
    24.11.2022 13:46

    Результат измерения величины в «попугаях»? На графике в статье некие величины до 2800 единиц.


    1. the_bat Автор
      24.11.2022 13:50
      +1

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


      1. Nikita_64
        24.11.2022 14:21

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


        1. the_bat Автор
          24.11.2022 14:25

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


        1. Andy_Big
          27.11.2022 00:14

          А еще есть зависимость (и существенная) от типа и состава грунта.


  1. SuperTEHb
    24.11.2022 14:25
    +2

    Справедливости ради, АЦП всё-таки в этом микроконтроллере один. Несколько там именно каналов измерения. Внутренний мультиплексор. Всё бы и ничего, но УВХ там тоже один. Если измерять разные каналы с разным напряжением с достаточно малым промежутком времени, то они через остаточный заряд в УВХ могут влиять на результаты измерения друг друга. Увеличьте время выборки и всё придёт в норму, магия исчезнет. Пишу потому что это не самая очевидная причина потенциальной проблемы. Имейте в виду.


    1. the_bat Автор
      24.11.2022 15:09

      Спасибо. Да, заметили, что скорость опроса заметно влияет. В нашем случае измерения можно проводить довольно редко.


      1. zurabob
        24.11.2022 19:05
        +1

        Почитайте интересную статью и материалы по ссылкам внизу статьи, очень помогает в понимании работы АЦП в любом процессоре. https://leoniv.livejournal.com/194681.html


  1. Spider55
    24.11.2022 14:57
    +1

    А почему не упростить звено STM32 и перенести его нагрузку на ESP? вроде всего хватает по ногам. Правда придётся его заменить ещё одним мультиплексором и измерять всё одним ADC, но по сути STM32 так и делает, просто мультиплексор у неё свой.
    Затопрошивка одна. Можно смело думать в сторону OAT и не изобретать велосипедов.


    1. the_bat Автор
      24.11.2022 15:06
      +1

      Такой вариант тоже рассматривали и даже реализовывали (думали даже по поводу внешнего многоканального АЦП). Нужно было использовать больше мультиплексоров, также количество ног ESP на грани. Получался огород с управлением мультиплексорами. Не понравилась работа АЦП у ESP в принципе. Часть обработки данных логичнее реализовать на STM (как нам кажется). Может писать один код было бы и проще на одном контроллере, но остановились именно на такой реализации.


      1. FGV
        24.11.2022 18:37
        +2

        Нужно было использовать больше мультиплексоров...

        +1 мультиплексор, итого 9 мультиплексоров на 8 каналов, включенных каскадно. Для уменьшения количества ног для управления ставится дешифратор, и задействуется 6-я нога у 8-ми мультиплексоров. Из плюсов - достаточно откалибровать один канал, вместо 8. Из минусов - ставится дополнительно два корпуса.

        Кстати вопрос, а почему выбрано питание датчиков (и так понимаю мультиплексоров) 4.5В?


        1. the_bat Автор
          24.11.2022 19:07

          Там 4,2В (у меня опечатка, исправил). Сделано для того, чтобы можно было использовать блоки питания на 5В (на всякий случай, но думаю не понадобится).


        1. OptimumOption
          25.11.2022 07:26

          "... Кстати вопрос, а почему выбрано питание датчиков (и так понимаю мультиплексоров) 4.5В?..." - зато удобно переходить на резервное батареечное питание :)


        1. Spider55
          25.11.2022 07:37

          Ай красава! Прям мысли мои за меня написал!


      1. yakosh
        25.11.2022 10:20

        А ESP-32 смотрели?


        1. the_bat Автор
          25.11.2022 10:48

          Да, серьезно рассматривали этот вариант (есть не сколько проектов на ней).


  1. yakosh
    24.11.2022 15:06

    А зачем в этой схеме STM? Что в ней такого, чего нет в ESP? АЦП и там и там один канал.

    Температура меняется не быстро, 1000 отсчетов в секунду не нужны, мультиплексоры уже есть.


    1. the_bat Автор
      24.11.2022 15:06

      Ответил выше.


  1. PMA
    24.11.2022 21:17
    +2

    А ещё "показания влажности" (если их можно так назвать) с этих "датчиков": имеют большой разброс от датчика к датчику, нелинейны, а самое противное - данные с них сильно зависят от температуры (т.е. при одной и той же влажности (погружение в стакан воды на 30% например) и изменении температуры на 3-5-10 градусов - "данные влажности" сильно поплывут...). Т.е. на каждый датчик заводить лист с поправочными коэффициентами для влажности 0%..5%...100% и постоянной температуре и, как пример, как меняется при влажности 5% показания при изменении температуры от ... и до .... Т.е. проще уж тогда на каждый датчик вешать eeprom с таблицей поверки / калибровки датчика, и какую ардуину, чтобы отдавать уже причёсанные данные по какому 485 или LoRa (i2c боюсь по расстоянию не потянет, может аналог какого 1-wire?)


    1. the_bat Автор
      25.11.2022 10:59

      Если рассматривать шкалу в абстрактных единицах и она 1000 единиц, то разность показаний между датчиками в однородной почве (в одном лотке) <10 единиц. Влияние температуры на показания есть, но если рассматривать замкнутую систему с поддержанием температуры, то это легко учитывать. Как раз хуже всего датчики себя ведут в совсем сухой и рыхлой почве.


      1. the_bat Автор
        25.11.2022 12:33

        <100 единиц (UPD)


  1. Mike-M
    25.11.2022 12:59
    +1

    Несколько смутило отсутствие защиты входов RJ-45.
    Рано или поздно может найтись умник, который вставит туда патч-корд, второй конец которого засунет в switсh (+ Power-over-Ethernet).

    В любом случае, защита всех наружных интерфейсов от статического электричества — это аксиома.


    1. the_bat Автор
      25.11.2022 13:18

      Там есть защита на плате.


  1. aumi13
    25.11.2022 13:30

    не самая удачная идея тянуть низкоуровневый аналоговый сигнал по метрам проводов

    сколько он мусора насобирает по дороге при включенной модной светодиодной подсветке?


    1. the_bat Автор
      25.11.2022 15:42

      Нужно будет использовать экранированный кабель. Мы делали устройство с большим количеством аналоговых датчиков температуры. Длина проводов в экране 10-20м. Работает отлично.


  1. beeptec
    25.11.2022 15:49
    +1

    Входы каждого мультиплексора заведены на разъемы TJ2-8P8C (RJ-45)

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

    Было бы интересно увидеть всю топологию системы.


  1. beeptec
    27.11.2022 01:09

    На сегодня еще никому не удалось организовать достаточно контролируемый и управляемый полив почвы хоть в закрытых хоть открытых агрокомплексах вплоть до горшка с домашним растением. Даже если весь ваш грунт вдоль и поперек будет усеян датчиками влаги и температуры. У любого грунта есть кроме его состава много зависимостей от внешних условий, которые непредсказуемы и имеют инертность воздействия на грунт таких факторов не меньше 10. Те кто сегодня выкладывается на такие системы, всегда в убытке из за неэффективной с точки зрения агрономии. Основной бич таких систем - плесень почвы от неправильного режима полива, соответственно если что то и удается выращивать, оно далеко по своим показателям от естественного возделывания.