ГлавнаяАкадемияCOURSE-16: Основы Интернета Вещей и практическое применение → Практическое применение IoT в сельском хозяйстве: от датчика в почве до автоматизации полива

Практическое применение IoT в сельском хозяйстве: от датчика в почве до автоматизации полива

Урок 3 · COURSE-16: Основы Интернета Вещей и практическое применение · theory

COURSE-16-M05-L04 — Практическое применение IoT в сельском хозяйстве: от датчика в почве до автоматизации полива

Введение в концепцию "Умного агронома"

Интернет вещей (IoT) трансформирует традиционное сельское хозяйство в высокотехнологичную отрасль, известную как "точное земледелие" (Precision Agriculture). Цель — переход от общих агротехнических операций к управлению, основанному на данных, собранных в реальном времени с каждого участка поля или для каждой группы животных. Это позволяет принимать обоснованные, экономически эффективные и экологически безопасные решения.

Контроллер HI, благодаря своей универсальности (Linux, Node-RED), набору промышленных интерфейсов (RS-485, CAN) и большому количеству входов/выходов, является идеальной платформой для реализации таких решений на объектах малого и среднего масштаба: от частных теплиц и небольших фермерских хозяйств до систем мониторинга на крупных агрокомплексах.

Ключевые компоненты системы на платформе HI

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

* Датчики почвы: Датчики влажности, pH, EC (электропроводности) подключаются к универсальным аналоговым входам (UI) контроллера.

* Метеостанции: Профессиональные метеостанции с датчиками скорости ветра, осадков, температуры и влажности воздуха интегрируются по промышленному протоколу Modbus RTU через шину RS-485.

* Датчики уровня: Ультразвуковые или поплавковые датчики для контроля уровня воды в резервуарах или силоса в бункерах подключаются к аналоговым или дискретным входам ("сухой контакт").

* Идентификация животных (RFID): Считыватели RFID-меток для отслеживания перемещения и идентификации животных подключаются через RS-485 или TCP/IP.

* Node-RED: Вся логика автоматизации (например, "если влажность почвы < 40% и нет дождя, включить полив на 15 минут") реализуется в виде визуальных потоков (flows).

* Локальное хранение: Встроенная база данных MySQL используется для накопления истории показаний датчиков и ведения журнала событий (audit log).

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

* Насосы и клапаны: Управляются напрямую через мощные релейные выходы (RL) контроллера.

* Системы освещения и обогрева: Фитолампы в теплицах или системы обогрева для животных включаются по расписанию или по показаниям датчиков через реле.

* Приводы и дозаторы: Сервоприводы для открытия/закрытия форточек или дозаторы кормов управляются через релейные выходы или специализированные шины, такие как CAN.

* MQTT: Контроллер отправляет стандартизированные данные (телеметрию) и статусы на центральный MQTT-брокер. Это позволяет удаленно наблюдать за состоянием объекта.

* Визуализация: Данные из MQTT могут отображаться в любой SCADA-системе или на кастомных дашбордах (например, Grafana) для анализа и построения отчетов.

Практическая реализация: Система автоматического полива на базе контроллера HI

Рассмотрим пошаговое создание базовой, но надежной системы автоматического полива для теплицы или грядки.

Задача: Автоматически поддерживать влажность почвы в диапазоне от 40% до 60%.

Шаг 1. Компоненты и схема подключения (WIRING-AGRO-001)

Необходимое оборудование:
  • Контроллер HI.
  • Емкостной датчик влажности почвы с аналоговым выходом 0-10V.
  • Блок питания 24V DC для датчика.
  • Электромагнитный клапан 230V AC для управления подачей воды.
  • Схема подключения:
    //========= WIRING-AGRO-001: Automated Irrigation System =========
    
    

    // Легенда:

    // CTRL:HI-Core - Контроллер HI

    // SOIL-SENS-01 - Датчик влажности почвы (0-10V)

    // PSU-24V - Блок питания 24V DC

    // VALVE-230V-01 - Электромагнитный клапан 230V AC

    // Подключение датчика к универсальному входу (UI)

    (PSU-24V) (SOIL-SENS-01) [CTRL:HI-Core]

    +24V ------------ VCC (Питание +)

    GND ------------ GND (Питание -)

    SIG (Сигнал) ------ UI-01 (Аналоговый вход)

    GND ------------------------------- GND (Общий)

    // Подключение клапана к релейному выходу (RL)

    Щит АВР [CTRL:HI-Core]

    ~L~ -------------- C (RL-01)

    NO (RL-01) ------- L (Фаза клапана)

    ~N~ --------------------------------- N (Нейтраль клапана)

    ⚠️ Важно: Экран сигнального кабеля от датчика (если используется) подключается к клемме GND только со стороны контроллера для защиты от помех.

    Шаг 2. Логика в Node-RED (FLOW-AGRO-IRRIG-001)

    Создадим поток, реализующий логику полива с использованием паттернов "Конечный автомат" (FSM) и "Визуальный статус".

    ASCII-схема потока:
               +-----------------+    +----------------------+    +--------------------+
    

    [Inject] -> | Чтение UI-01 | -> | Function: Логика FSM | -> | rpi gpio out (RL-01) |

    (раз в 1 мин) +-----------------+ +----------------------+ +--------------------+

    | (статус)

    v

    +--------------------+

    | node.status() |

    +--------------------+

    [Catch: All Nodes] --> [Function: Format Error] --> [audit_log_mysql]

    Код для узла `Function: Логика FSM`:
    // --- Константы и уставки ---
    

    const MOISTURE_LOW_THRESHOLD = 40.0; // Нижний порог влажности в %

    const MOISTURE_HIGH_THRESHOLD = 60.0; // Верхний порог влажности в %

    const SENSOR_SOURCE_ID = "soil-sensor-greenhouse-1";

    // --- Получение и валидация данных ---

    // Предполагаем, что предыдущий узел прочитал напряжение 0-10V

    // и положил его в msg.payload. Например, { value: 5.5 } (вольт)

    let voltage = msg.payload.value;

    if (typeof voltage !== 'number' || voltage < 0 || voltage > 10) {

    node.status({ fill: "red", shape: "dot", text: "Ошибка: неверное напряжение " + voltage });

    node.error("Некорректное значение напряжения с датчика: " + voltage, msg);

    return null; // Останавливаем поток

    }

    // --- Преобразование напряжения в проценты ---

    // Линейная шкала: 0V = 0%, 10V = 100%

    let moisture = voltage * 10.0;

    // --- Паттерн "Контракт сообщения" ---

    // Формируем стандартизированный объект для логирования и передачи по MQTT

    msg.payload = {

    value: parseFloat(moisture.toFixed(1)),

    unit: "%",

    source: SENSOR_SOURCE_ID,

    ts: Date.now()

    };

    // --- Паттерн "Конечный автомат" (FSM) ---

    // Получаем текущее состояние из контекста потока

    let state = flow.get("irrigationState") || "IDLE"; // IDLE или WATERING

    let command = null; // Команда для реле: true=включить, false=выключить

    if (state === "IDLE" && moisture < MOISTURE_LOW_THRESHOLD) {

    // Состояние: "Ожидание", влажность упала ниже порога

    // Переход в состояние "Полив"

    state = "WATERING";

    command = true; // Включить клапан

    } else if (state === "WATERING" && moisture > MOISTURE_HIGH_THRESHOLD) {

    // Состояние: "Полив", влажность достигла верхнего порога

    // Переход в состояние "Ожидание"

    state = "IDLE";

    command = false; // Выключить клапан

    }

    // Сохраняем новое состояние в контексте

    flow.set("irrigationState", state);

    // --- Паттерн "Визуальный статус" ---

    // Отображаем текущий статус на узле для быстрой диагностики

    let statusText = `Сост: ${state} | Влажн: ${moisture.toFixed(1)}%`;

    let statusColor = (state === "WATERING") ? "blue" : "green";

    node.status({ fill: statusColor, shape: "dot", text: statusText });

    // Если команда не была сформирована (состояние не меняется), останавливаем поток

    if (command === null) {

    return null;

    }

    // Передаем команду на узел управления реле

    msg.payload = command; // Узел rpi gpio out ожидает 0/1 или true/false

    return msg;

    Шаг 3. Усложнение и масштабирование

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

  • Защита от "дребезга": Используйте узел `Trigger` или `RBE` ("Report by Exception"), чтобы избежать частого включения/выключения насоса, если влажность колеблется на границе порога.
  • Интеграция с погодой: Перед включением полива делайте HTTP-запрос к погодному API. Если в ближайшие 3 часа ожидается дождь, отмените полив.
  • Использование Modbus-метеостанции: Подключите к шине RS-485 метеостанцию. Если датчик осадков фиксирует дождь в реальном времени, блокируйте полив.
  • Создание субпотока (Subflow): Если у вас несколько зон полива, вынесите логику FSM в переиспользуемый субпоток. Это упростит управление и поддержку системы, следуя паттерну "Переиспользуемый компонент".
  • ---

    Лабораторные работы

    COURSE-16-M05-LAB07: Чтение и калибровка датчика влажности почвы

    1. Подключить датчик к универсальному входу `UI-01` согласно схеме `WIRING-AGRO-001`.

    2. Создать поток в Node-RED, который раз в 5 секунд считывает значение с `UI-01`.

    3. Определить минимальное значение (в сухой земле) и максимальное (в воде).

    4. Написать `function` узел, который калибрует показания, преобразуя диапазон [min_v, max_v] в [0%, 100%].

    5. Вывести результат в узел `Debug` в формате JSON, соответствующем "Контракту сообщения".

    * Поток корректно считывает данные.

    * Реализована функция калибровки.

    * Исходящее сообщение `msg.payload` имеет структуру `{ "value": ..., "unit": "%", "source": ..., "ts": ... }`.

    COURSE-16-M05-LAB08: Реализация полного цикла полива с ручным управлением

    1. Использовать поток из предыдущей лаборатории как основу.

    2. Добавить `function` узел с логикой FSM (включить при влажности < 40%, выключить при > 60%).

    3. Подключить выход логики к узлу `rpi gpio out` для управления реле `RL-01`.

    4. Добавить узел `mqtt in`, подписанный на топик `hi/greenhouse/irrigation/set`. Он должен принимать команды `"ON"`, `"OFF"`, `"AUTO"`.

    5. Реализовать логику ручного управления: при получении `"ON"` или `"OFF"` система принудительно включает/выключает полив и переходит в ручной режим. При получении `"AUTO"` — возвращается к автоматической логике по датчику.

    6. Добавить узел `mqtt out` для отправки текущего состояния (`{ "mode": "AUTO", "state": "IDLE", "moisture": 45.1 }`) в топик `hi/greenhouse/irrigation/status`.

    * Автоматический режим работает корректно.

    * Система реагирует на MQTT-команды ручного управления.

    * Система корректно возвращается в автоматический режим.

    * Текущий статус публикуется в MQTT.

    ---

    Тест для самопроверки (QUIZ)

  • Какой тип входа на контроллере HI лучше всего подходит для подключения датчика влажности почвы с выходом 0-10V?
  • * A) Дискретный вход

    * B) 1-Wire

    * C) Универсальный аналоговый вход (UI)

    * D) Релейный выход (RL)

  • Какой протокол является промышленным стандартом для подключения профессиональных метеостанций?
  • * A) MQTT

    * B) Modbus RTU (по RS-485)

    * C) DALI

    * D) 1-Wire

  • В Node-RED, какой паттерн используется для предотвращения дублирования кода при управлении несколькими одинаковыми зонами полива?
  • * A) Конечный автомат (FSM)

    * B) Переиспользуемый компонент (Subflow)

    * C) Визуальный статус

    * D) Контракт сообщения

  • Что описывает "Контракт сообщения" в контексте Академии HI?
  • * A) Юридический документ с клиентом.

    * B) Стандартная структура JSON-объекта `msg.payload` для обмена данными между узлами.

    * C) Настройки COM-порта для Modbus.

    * D) Схема подключения оборудования.

  • Какова основная цель использования узла `Catch` в потоках Node-RED?
  • * A) Запускать поток по расписанию.

    * B) Перехватывать и обрабатывать ошибки, возникающие в других узлах.

    * C) Фильтровать сообщения по их содержимому.

    * D) Отправлять данные в MQTT.

  • При подключении экранированного кабеля от датчика, к чему подключается экран?
  • * A) К клемме +24V.

    * B) К сигнальной клемме.

    * C) К клемме GND только со стороны контроллера.

    * D) К клемме GND с обеих сторон.

  • Что такое гистерезис (в контексте логики полива)?
  • * A) Задержка перед включением насоса.

    * B) Разница между порогом включения и порогом выключения для предотвращения "дребезга".

    * C) Максимальное время работы насоса.

    * D) Частота опроса датчика.

  • Какой узел Node-RED используется для периодического запуска потока (например, раз в минуту)?
  • * A) `Function`

    * B) `Switch`

    * C) `Debug`

    * D) `Inject`

  • Для чего в системе полива может понадобиться интеграция с погодным API?
  • * A) Чтобы узнать текущее время.

    * B) Чтобы отменить полив, если скоро ожидается дождь.

    * C) Чтобы управлять освещением в теплице.

    * D) Чтобы измерить pH почвы.

  • Какое состояние сохраняется в `flow.context` в примере логики FSM?
  • * A) Текущая влажность.

    * B) Текущий режим работы автомата (`IDLE` или `WATERING`).

    * C) Время последнего полива.

    * D) Напряжение на датчике.

    ---

    Мини-справочник "Что делать, если..." (Runbook)

    📋 Проблема: Клапан/насос не включается, хотя почва сухая.

  • Проверка логики: Посмотрите на узел `Function` в Node-RED. Какой у него статус? Отображается ли состояние `WATERING`? Корректно ли отображается влажность?
  • Проверка реле: Вручную через интерфейс Node-RED (или отдельным потоком) подайте команду на узел `rpi gpio out`. Слышен ли щелчок реле? Загорается ли индикатор на контроллере?
  • Проверка проводки: Проверьте схему `WIRING-AGRO-001`. Подается ли напряжение 230V на клемму `C` реле? Правильно ли подключен клапан к клемме `NO`?
  • Проверка клапана: Подайте 230V на клапан напрямую, в обход контроллера. Срабатывает ли он?
  • 📋 Проблема: Датчик влажности постоянно показывает 0% или 100% (или нереалистичное значение).

  • Проверка питания датчика: Убедитесь, что на датчик подается питание 24V DC. Проверьте полярность.
  • Проверка подключения: Проверьте целостность сигнального провода до клеммы `UI-01` и общего провода до клеммы `GND`. Плохой контакт на `GND` — частая причина неверных показаний аналоговых датчиков.
  • Проверка калибровки: Запустите лабораторную работу №1. Погрузите датчик в воду и в сухую землю. Меняются ли показания напряжения в Node-RED? Возможно, сбились калибровочные коэффициенты.
  • Проверка датчика: Подключите заведомо исправный датчик для проверки.
  • 📋 Проблема: Система поливает слишком часто или слишком долго.

  • Настройка порогов: В узле `Function` измените значения констант `MOISTURE_LOW_THRESHOLD` и `MOISTURE_HIGH_THRESHOLD`. Увеличьте разницу между ними (гистерезис), чтобы избежать частого срабатывания.
  • Ограничение времени: Добавьте в логику таймер. Например, после включения полива (перехода в состояние `WATERING`), используйте узел `Trigger`, чтобы автоматически выключить его через 15 минут, даже если влажность не достигла верхнего порога. Это защита от поломки датчика или протечки.