Практическое применение IoT в сельском хозяйстве: от датчика в почве до автоматизации полива
COURSE-16-M05-L04 — Практическое применение IoT в сельском хозяйстве: от датчика в почве до автоматизации полива
Введение в концепцию "Умного агронома"
Интернет вещей (IoT) трансформирует традиционное сельское хозяйство в высокотехнологичную отрасль, известную как "точное земледелие" (Precision Agriculture). Цель — переход от общих агротехнических операций к управлению, основанному на данных, собранных в реальном времени с каждого участка поля или для каждой группы животных. Это позволяет принимать обоснованные, экономически эффективные и экологически безопасные решения.
Контроллер HI, благодаря своей универсальности (Linux, Node-RED), набору промышленных интерфейсов (RS-485, CAN) и большому количеству входов/выходов, является идеальной платформой для реализации таких решений на объектах малого и среднего масштаба: от частных теплиц и небольших фермерских хозяйств до систем мониторинга на крупных агрокомплексах.
Ключевые компоненты системы на платформе HI
Экосистема IoT для сельского хозяйства, построенная на базе нашего контроллера, состоит из четырех взаимосвязанных уровней.
- Уровень 1: Сбор данных (Датчики и устройства). Это "органы чувств" системы.
* Метеостанции: Профессиональные метеостанции с датчиками скорости ветра, осадков, температуры и влажности воздуха интегрируются по промышленному протоколу Modbus RTU через шину RS-485.
* Датчики уровня: Ультразвуковые или поплавковые датчики для контроля уровня воды в резервуарах или силоса в бункерах подключаются к аналоговым или дискретным входам ("сухой контакт").
* Идентификация животных (RFID): Считыватели RFID-меток для отслеживания перемещения и идентификации животных подключаются через RS-485 или TCP/IP.
- Уровень 2: Управление и логика (Контроллер HI). Это "мозг" системы.
* Локальное хранение: Встроенная база данных MySQL используется для накопления истории показаний датчиков и ведения журнала событий (audit log).
* Функция ПЛК: Критически важные сценарии, такие как аварийное отключение насосов, могут быть реализованы на уровне детерминированной логики для обеспечения максимальной надежности.
- Уровень 3: Исполнение команд (Исполнительные устройства). Это "руки" системы.
* Системы освещения и обогрева: Фитолампы в теплицах или системы обогрева для животных включаются по расписанию или по показаниям датчиков через реле.
* Приводы и дозаторы: Сервоприводы для открытия/закрытия форточек или дозаторы кормов управляются через релейные выходы или специализированные шины, такие как CAN.
- Уровень 4: Мониторинг и аналитика (Облако и интерфейс).
* Визуализация: Данные из MQTT могут отображаться в любой SCADA-системе или на кастомных дашбордах (например, Grafana) для анализа и построения отчетов.
Практическая реализация: Система автоматического полива на базе контроллера HI
Рассмотрим пошаговое создание базовой, но надежной системы автоматического полива для теплицы или грядки.
Задача: Автоматически поддерживать влажность почвы в диапазоне от 40% до 60%.Шаг 1. Компоненты и схема подключения (WIRING-AGRO-001)
Необходимое оборудование://========= 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. Усложнение и масштабирование
💡 Совет: Базовая логика работает, но для профессиональной системы ее необходимо улучшить.
---
Лабораторные работы
COURSE-16-M05-LAB07: Чтение и калибровка датчика влажности почвы
- Цель: Научиться подключать аналоговый датчик к контроллеру HI, считывать его показания в Node-RED и преобразовывать "сырые" значения в понятные единицы измерения (проценты).
- Оборудование: Контроллер HI, датчик влажности почвы (0-10V), стакан с сухой землей, стакан с водой.
- Задачи:
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: Реализация полного цикла полива с ручным управлением
- Цель: Создать законченную систему автоматического полива с возможностью ручного вмешательства через MQTT.
- Оборудование: Стенд из предыдущей лаборатории + светодиод (имитирующий клапан), подключенный к реле `RL-01`.
- Задачи:
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)
* A) Дискретный вход
* B) 1-Wire
* C) Универсальный аналоговый вход (UI)
* D) Релейный выход (RL)
* A) MQTT
* B) Modbus RTU (по RS-485)
* C) DALI
* D) 1-Wire
* A) Конечный автомат (FSM)
* B) Переиспользуемый компонент (Subflow)
* C) Визуальный статус
* D) Контракт сообщения
* A) Юридический документ с клиентом.
* B) Стандартная структура JSON-объекта `msg.payload` для обмена данными между узлами.
* C) Настройки COM-порта для Modbus.
* D) Схема подключения оборудования.
* A) Запускать поток по расписанию.
* B) Перехватывать и обрабатывать ошибки, возникающие в других узлах.
* C) Фильтровать сообщения по их содержимому.
* D) Отправлять данные в MQTT.
* A) К клемме +24V.
* B) К сигнальной клемме.
* C) К клемме GND только со стороны контроллера.
* D) К клемме GND с обеих сторон.
* A) Задержка перед включением насоса.
* B) Разница между порогом включения и порогом выключения для предотвращения "дребезга".
* C) Максимальное время работы насоса.
* D) Частота опроса датчика.
* A) `Function`
* B) `Switch`
* C) `Debug`
* D) `Inject`
* A) Чтобы узнать текущее время.
* B) Чтобы отменить полив, если скоро ожидается дождь.
* C) Чтобы управлять освещением в теплице.
* D) Чтобы измерить pH почвы.
* A) Текущая влажность.
* B) Текущий режим работы автомата (`IDLE` или `WATERING`).
* C) Время последнего полива.
* D) Напряжение на датчике.
---
Мини-справочник "Что делать, если..." (Runbook)
📋 Проблема: Клапан/насос не включается, хотя почва сухая.
📋 Проблема: Датчик влажности постоянно показывает 0% или 100% (или нереалистичное значение).
📋 Проблема: Система поливает слишком часто или слишком долго.