Реализация мониторинга почвенных датчиков через мобильное приложение
Почвенные датчики выдают сырые данные в нечитаемых форматах — бинарные пачки по протоколам Modbus RTU, SDI-12 или LoRaWAN. Каждый датчик требует уникального декодирования: один производитель использует смещение байтов, другой — масштабирование. Приходится учитывать тип почвы, калибровку и LoRaWAN-стек, иначе цифры превращаются в шум. Мы реализовали такие проекты для агрохозяйств: интеграция ChirpStack, декодирование Cayenne LPP, отображение профиля влажности с учётом полной влагоёмкости (ПВ). Наш опыт — более 5 лет в IoT, 30+ завершённых проектов.
Агроном получает уведомление на смартфон: влажность на глубине 30 см упала до 15% при полевой влагоёмкости 45% — пора запускать полив. Без мобильного приложения это бы осталось незамеченным до визуального осмотра. Именно поэтому система мониторинга с датчиками и LoRaWAN окупается за один сезон.
Как работает мониторинг почвенных датчиков через LoRaWAN?
Почвенный датчик — обычно Modbus RTU или SDI-12 на проводном интерфейсе, либо LoRaWAN/NB-IoT для беспроводного. Популярные модели: Sentek Drill & Drop (SDI-12), Vegetronix VH400 (аналоговый 0-3В), TEROS 12 (SDI-12), Decagon 5TM — все с разными форматами вывода данных. Мобильное приложение получает эти данные через IoT-шлюз или LoRaWAN Network Server — никогда напрямую. Именно поэтому LoRaWAN стал стандартом для полевого мониторинга: он даёт дальность и энергоэффективность, но требует грамотной настройки джойнеров и частотных планов. Как указывает спецификация LoRaWAN 1.0.4, максимальная дальность в открытом поле достигает 10 км.
| Протокол | Дальность | Скорость | Применение |
|---|---|---|---|
| Modbus RTU | до 1200 м (провод) | до 115 кбит/с | Локальные сети теплиц |
| SDI-12 | до 60 м (провод) | 1200 бит/с | Метеостанции, датчики почвы |
| LoRaWAN | до 10 км (открытое поле) | 0.3-50 кбит/с | Полевые агромониторинг |
Что измеряет датчик и как интерпретировать
Три основных параметра почвы:
VWC (Volumetric Water Content) — объёмная влажность в процентах. Значение 0-100%, на практике для большинства почв рабочий диапазон 10-40%. Датчик меряет диэлектрическую проницаемость почвы, пересчёт в VWC — по формуле Топпа или по калибровочным данным производителя для конкретного типа почвы.
EC (Electrical Conductivity) — электропроводность, мСм/см. Показывает засоленность и концентрацию питательных веществ. Норма для большинства культур: 0.5-2.0 мСм/см. Выше 4 мСм/см — стресс для растений.
Температура почвы — важна для прорастания семян (большинство культур не прорастают ниже 8-10°C) и активности микроорганизмов.
| Тип почвы | Норма VWC (%) | Полевая влагоёмкость (ПВ, %) |
|---|---|---|
| Песок | 5-10 | 15 |
| Супесь | 10-20 | 25 |
| Суглинок | 20-35 | 45 |
| Глина | 30-45 | 55 |
Без контекста типа почвы и ПВ число VWC бессмысленно. Приложение должно показывать не только сырые значения, но и их агрономическую интерпретацию: «Влажность 19% при ПВ=45% для супесчаной почвы» — это сухо.
Как декодировать данные TEROS 12 через Cayenne LPP?
ChirpStack — open-source LoRaWAN Network и Application Server. REST API и gRPC интерфейс:
// Kotlin, Retrofit для ChirpStack API
interface ChirpStackApi {
@GET("api/devices/{devEui}/events")
suspend fun getDeviceEvents(
@Header("Grpc-Metadata-Authorization") token: String,
@Path("devEui") devEui: String,
@Query("limit") limit: Int = 100,
): DeviceEventsResponse
}
data class DeviceEvent(
val publishedAt: String,
val data: String, // Base64-encoded payload
val rxInfo: List<RxInfo>,
)
fun decodePayload(base64Data: String): SoilReading {
val bytes = Base64.decode(base64Data, Base64.DEFAULT)
// Декодирование зависит от кодировки производителя датчика
// TEROS 12 Cayenne LPP формат:
val vwc = ((bytes[1].toInt() and 0xFF) shl 8 or (bytes[2].toInt() and 0xFF)) / 100.0
val temp = ((bytes[4].toInt() and 0xFF) shl 8 or (bytes[5].toInt() and 0xFF)) / 100.0 - 40
val ec = ((bytes[7].toInt() and 0xFF) shl 8 or (bytes[8].toInt() and 0xFF)) / 100.0
return SoilReading(vwc = vwc, temperature = temp, electricalConductivity = ec)
}
Для реального времени через MQTT — ChirpStack публикует события в топики вида application/{appId}/device/{devEui}/event/up. ChirpStack поддерживает интеграцию с любым бэкендом.
Почему LoRaWAN подходит для полевых датчиков?
LoRaWAN обеспечивает дальность до 10 км в открытом поле при минимальном энергопотреблении. Датчики работают от батарей до 5 лет. В сочетании с ChirpStack и REST API это даёт гибкую интеграцию с мобильным приложением.
Дашборд: несколько датчиков на поле
Стандартная конфигурация — 3-5 датчиков на горизонты глубины (10, 30, 60, 90 см) в одной точке измерения. Дашборд показывает профиль влажности по глубине — вертикальный барчарт эффективнее обычного списка:
Widget buildMoistureProfile(List<SoilLayerReading> layers) {
return Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
// Ось глубины
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: layers.map((l) => Text('${l.depthCm} см')).toList(),
),
const SizedBox(width: 8),
Expanded(
child: Column(
children: layers.map((layer) {
final isLow = layer.vwc < layer.fieldCapacity * 0.5;
return Container(
margin: const EdgeInsets.symmetric(vertical: 2),
height: 32,
child: LinearProgressIndicator(
value: layer.vwc / 60.0, // нормируем к 60% макс
backgroundColor: Colors.grey.shade200,
color: isLow ? Colors.orange : Colors.blue,
),
);
}).toList(),
),
),
],
),
);
}
Как настроить порог полива и тренды?
Главная аналитическая функция — показать момент, когда влажность опустилась до порога полива (irrigation threshold), и когда вернулась к целевому уровню после полива. Это помогает агроному подтвердить, что система ирригации отработала корректно.
График из fl_chart с горизонтальной линией порога:
LineChartData buildTrendChart(List<SoilReading> readings, double threshold) {
return LineChartData(
extraLinesData: ExtraLinesData(
horizontalLines: [
HorizontalLine(
y: threshold,
color: Colors.orange,
strokeWidth: 1.5,
dashArray: [5, 5],
label: HorizontalLineLabel(
show: true,
labelResolver: (_) => 'Порог полива',
),
),
],
),
lineBarsData: [
LineChartBarData(
spots: readings
.map((r) => FlSpot(r.timestamp.toDouble(), r.vwc))
.toList(),
isCurved: true,
color: Colors.blue,
dotData: const FlDotData(show: false),
),
],
);
}
Что такое алерты и как их настроить?
Два типа алертов для почвенных датчиков: по порогу влажности (ниже X% — нужен полив) и по EC (выше Y мСм/см — риск засоления). Доставка через FCM. Важный момент: алерт по влажности нужно фильтровать по времени суток и дням — если только что прошёл дождь, алерт «нужен полив» избыточен. Бэкенд должен учитывать данные метеостанции или прогноза погоды.
Как настроить систему мониторинга: пошаговая инструкция
- Выбор и установка датчиков (Modbus RTU для теплиц, LoRaWAN для поля).
- Настройка шлюза и LoRaWAN Network Server (ChirpStack).
- Декодирование даташита датчика в Cayenne LPP или кастомный парсер.
- Разработка мобильного дашборда (Flutter) с профилем влажности и графиками трендов.
- Настройка алертов с учётом погоды и типов почвы.
- Тестирование в поле и деплой в магазины приложений.
Что входит в работу
- Проектирование архитектуры сбора данных (выбор протоколов, шлюзов, Network Server)
- Настройка LoRaWAN Network Server (ChirpStack) и REST API
- Разработка мобильного приложения для iOS/Android (SwiftUI / Jetpack Compose)
- Интеграция с метеостанциями и учёт типа почвы
- Тестирование в полевых условиях и deploy в App Store / Google Play
- Документация и обучение агрономов
Типичные ошибки при интеграции:
- Путаница с кодировкой Cayenne LPP (разные производители используют разные смещения)
- Отсутствие фильтрации алертов по погоде (ложные срабатывания после дождя)
- Игнорирование типа почвы при интерпретации VWC (для супеси и глины нормы разные)
Разработка приложения мониторинга почвенных датчиков с LoRaWAN-интеграцией, профилями влажности и алертами занимает 3-5 недель. Стоимость рассчитывается индивидуально. Свяжитесь с нами для консультации — мы подготовим оценку за один день. Получите бесплатную консультацию и узнайте, как система окупится в вашем хозяйстве.







