Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Точный прогноз дождя: Arduino-станция с Python и Keras — полный цикл от датчиков до нейросети

Компоненты и материалы

Необходимые инструменты

О проекте

Цель — предсказать дождь за 6 часов вперёд (булево: будет/не будет). Проект охватывает весь цикл: автономнаяmeteoстанция с солнечным питанием и глубоким сном (≈50 µA), сбор данных каждые 10 минут, передача по радиоканалу HC-12 на базовую станцию, запись в MongoDB, предобработка Pandas, обучение нейросети Keras, прогноз и уведомление по email.

С ~600 дней данных точность достигает ~80%. Все этапы реализованы без внешних API — полностью локально.

Шаг 1: Детали и инструменты

Полный список приведён выше. Навыки: пайка, базовый Arduino, настройка Linux-сервисов, Python.

Шаг 2: Сборка станции

  1. В корпусе просверлите 4 отверстия: для проводов панели и трёх датчиков (BME280, BH1750, дождь). Приклейте панель снаружи, выведите провода внутрь.
  2. На печатной плате распаяйте: гнезда для Pro Mini, HC-12, стабилизатор 3.3В, диод, транзистор с резистором, два разъёма KF301 (панель и батареи), три гнезда для датчиков. Важно: снимите или перережьте ножку встроенного LED на Pro Mini — он потребляет заметный ток.
  3. Установите заряженные аккумуляторы в корпус, подключите к разъёму.
  4. Подключите датчики снаружи к соответствующим гнездам. Датчик дождя распаяйте на трёхпроводном шлейфе (GND, VCC, сигнал).
  5. Закрепите станцию в месте, защищённом от прямых осадков (для основного блока). Датчик дождя вынесите отдельно на устойчивую стойку под открытым небом.

Шаг 3: Код Arduino

Скетч каждые 10 минут: пробуждает периферию, опрашивает датчики, передаёт пакет через SoftwareSerial (HC-12), усыпляет периферию и уходит в глубокий сон (LowPower.powerDown на 8-секундных циклах). Если напряжение >4.2В — использует обычный delay для разряда (защита от перезаряда).

Формат пакета: H1:78|T1:12|PS1:1022|L1:500|R1:0|V1:4010| (влажность %, температура °C, давление гПа, освещённость люкс, дождь 0/100, напряжение мВ).

Необходимые библиотеки: LowPower, SoftwareSerial, Wire, Adafruit_Sensor, Adafruit_BME280, BH1750. Ссылки на GitHub в исходнике.

Важно: перед загрузкой удалите строку transmitSenzorData("V", sensors.voltage); — она дублирует передачу напряжения.

Шаг 4: Базовая станция (Linux)

  1. Установите Anaconda (Python 3.6.2), MongoDB (v3.4+), клонируйте репозиторий https://github.com/danionescu0/home-automation.
  2. Создайте окружение weather, установите зависимости: pip install -r requirements.txt (Keras, pandas, pymongo, sklearn).
  3. Настройте config.py: хост/порт MongoDB, последовательный порт HC-12 USB (обычно /dev/ttyUSB0, 9600 бод).

Шаг 5: Работа с данными

Шаг 6: Как это работает (внутренности)

Архитектура

Разделение станции и базы даёт: низкое потребление, портативность, масштабируемость (можно добавить станции), низкую стоимость. MongoDB выбрана за schemaless, простоту, бесплатность. Данные агрегируются по минутам.

Подготовка данных (ключевой этап)

  1. Сырые точки → очистка (drop NaN).
  2. Группировка в 6-часовые окна. Для каждого датчика считаются: min, max, mean, перцентили 10/30/70/90, число подъёмов/спадов/плоских участков.
  3. Добавление целевой колонки has_rain (1 если rain_avg > 0.1).
  4. Удаление дат, строк с temperature_min < 0 (нет снегоизмерителя).
  5. Лаговые признаки: для каждого параметра добавляются значения за 8 предыдущих окон (48 часов) — оптимально по экспериментам.
  6. Удаление строк с NaN (первые окна) и текущих значений (кроме has_rain).
  7. Случайный split train/test (sklearn), разделение на X/y, масштабирование StandardScaler (сохранение scaler'а через joblib).

Нейросеть (Keras)

model = Sequential([
  Input(shape=(n_features,)),
  Dense(n_features//2, activation='relu'), Dropout(0.05),
  Dense(n_features//2, activation='relu'), Dropout(0.05),
  Dense(1, activation='sigmoid')
])
model.compile(optimizer='rmsprop', loss='mean_absolute_error', metrics=['accuracy'])
model.fit(X, y, batch_size=1, epochs=50)
model.save('model.h5')

Гиперпараметры (слои, нейроны, dropout, optimizer, loss, batch, epochs) требуют подбора. Скрипт train.py --grid-search перебирает комбинации.

Шаг 7: Бонус — официальные данные Dark Sky API

Использование исторических данных Dark Sky (ветра, UV, видимость и др.) повышает точность с ~80% до ~90%. Инструкции по загрузке/импорту и обучению с флагом --data-source darksky в репозитории.

Код

Основные фрагменты: скетч станции (weatherStation), скрипты Python (serial_listener.py, train.py, predict.py, graphs.py), конфиг, требования. Полный код на GitHub: weatherStation и weather-predict.

Схемы

Точный прогноз дождя: Arduino-станция с Python и Keras — полный цикл от датчиков до нейросети

Fritzing-файл: sketch_KAtDa2VReF.fzz в репозитории.

Производственный процесс

  1. Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
  2. DIY-консоль управления Photoshop на Arduino Nano RP2040 Connect
  3. Переименование файлов и директорий в Python с os.rename() — пошаговое руководство
  4. Надежная система учета рабочего времени на Arduino с RFID и Python
  5. Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
  6. Умный вольтметр на Arduino и смартфоне — простое DIY-проект
  7. Надежный ИК-датчик пульса на Arduino: пошаговое руководство
  8. Точное измерение частоты и коэффициента заполнения на Arduino UNO
  9. Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
  10. Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing