IoT-метеостанция на TensorFlow: точный прогноз интенсивности дождя с ветром и давлением
Компоненты и материалы
- Набор метеостанции DFRobot (анемометр, ветровой флюгер, дождемер) — 1 шт.
- NodeMCU ESP8266 (ESP-12E) — 1 шт. (WiFi)
- Arduino Uno + DFRobot SIM808 GPS/GPRS/GSM Shield — 1 компл. (GPRS для удалённых точек)
- Raspberry Pi 3B+/4 — 1 шт. (веб-сервер для Google Sheets API)
- Печатные платы для прототипирования — 2 шт.
- Клей-пистолет
Инструменты
- Паяльник, клей-пистолет
Приложения и сервисы
- Arduino IDE
- TensorFlow / Keras
- Microsoft Visual Studio 2017 (для PHP-проекта)
О проекте
В 2020 году ливневые дожди вызвали большие потери в сельском хозяйстве региона. Чтобы помочь фермерам и владельцам теплиц, создана бюджетная IoT-станция, собирающая локальные метеоданные и предсказывающая интенсивность осадков нейросетью. Исследования показывают, что избыточные осадки снижают урожайность кукурузы до 34% — сравнимо с засухой.
Станция оснащена профессиональным набором DFRobot (ветер, дождь) и двумя каналами связи: WiFi (NodeMCU) на балконе и GPRS (SIM808) во дворе. Данные каждые 5 минут отправляются на Raspberry Pi, где PHP-приложение пишет их в Google Sheets через API. Накопленный датасет (>3 мес., 32219 строк) обрабатывается в Python: визуализация, нормализация, создание лаговых признаков, обучение ANN (Keras/TensorFlow) на 5 классах интенсивности: Нет дождя, Слабый, Умеренный, Сильный, Ливневый. Точность на тесте ~72–73% (переобучение из-за малого тестового набора), на обучении 83–85%. Сбор данных продолжается для улучшения.
Шаг 1: Сборка метеостанции DFRobot
Комплект включает анемометр, флюгер, дождемер и конвертер с последовательным выходом (37 байт/сек). Формат: c000s000g000t086r000p000h53b10020 (курс, средний/макс ветер, температура °F, дождь 1ч/24ч в 0.01 дюйма, влажность %, давление 0.1 гПа). Сборка: крепление датчиков на стойку, защита электроники пластиковым боксом.
Шаг 2: Google Sheets API — подготовка
- Google Cloud Console → новый проект «Remote Weather Station» →.enable Google Sheets API.
- Создайте Service Account, ключ JSON (
credentials.json). Настройте OAuth Consent Screen, создайте OAuth Client ID (Desktop app), скачайтеcredentials.json. - Создайте таблицу «Remote Weather Station», заголовки: WD, Av_WS, Mx_WS, 1h_RF, 24h_RF, Tem, Hum, b_PR.
Шаг 3: PHP-веб-приложение (приём данных → Google Sheets)
Размещено на Raspberry Pi (LAMP). Папка remote_weather_station в /var/www/html. Файлы: index.php (приём GET-параметров, авторизация через token.json, запись в таблицу), account_verification_token.php (вставка verification code после первого запуска). При первом открытии выдаёт ссылку авторизации — перейдите, разрешите доступ, скопируйте код в файл, обновите страницу — появится token.json. Тест: https://localhost/remote_weather_station/?wd=12&a_ws=8&m_ws=11&1_rf=14&24_rf=84&tem=24&hum=32&b_pr=57.
Шаг 4: NodeMCU ESP8266 (WiFi) — сбор и отправка
Скетч читает последовательный поток от конвертера DFRobot, парсит поля, конвертирует единицы (mph→м/с, °F→°C, дюймы→мм), каждые 300 сек делает HTTP GET на PHP-скрипт. Лог в Serial Monitor показывает отправку и ответ сервера («8 cells appended»).
Шаг 4.1: Arduino Uno + SIM808 (GPRS) — для удалённых точек
Аналогичная логика, но соединение через SIM808: инициализация модуля, DHCP (APN cmnet), TCP-коннект к серверу, отправка GET-запроса как char-массива. Требует внешнего питания 7–23В, SIM-карты, GSM/GPS антенн. Переключатель на щите: None (1) → загрузка → Arduino (3) → ожидание регистрации в сети.
Шаг 4.2: Накопление датасета (>3 месяцев)
Получен CSV 32219 строк: WD (deg), Av_WS, Mx_WS (м/с), 1h_RF, 24h_RF (мм), Tem (°C), Hum (%), b_PR (гПа). Данные продолжают накапливаться.
Шаг 5: Нейросеть (TensorFlow/Keras) — обучение и прогноз
5.1 Визуализация и нормализация
Парные гистограммы (Matplotlib) каждого параметра vs 1h_RF. Нормализация: вектор ветра (WD, Av_WS) → компоненты WX, WY (cos/sin), аналогично для макс. ветра. Остальные: Tem/25, Hum/70, b_PR/1013, 24h_RF/24. На выходе 7 признаков.
5.2 Создание классов и обучение
Примерная интенсивность: approx_RF_rate = (1h_RF + scaled_24h_RF) * 100 (мм/ч). Классы: 0 (0), 1 (<2.5), 2 (2.5–7.6), 3 (7.6–50), 4 (>50). Split 60/40. Архитектура: Input(7) → Dense(16, relu) → Dense(32, relu) → Dense(64, relu) → Dense(128, relu) → Dense(5, softmax). Optimizer Adam, loss sparse_categorical_crossentropy, 19 эпох. Точность на train 0.83–0.85, на test 0.72–0.73.
5.3 Прогноз
Метод model.predict() возвращает вероятности 5 классов, argmax даёт метку. Примеры: сухое → 0, сильный дождь → 3, ливень → 4.
Подключение (ESP8266)
NodeMCU: VV→5V, D5→RX, D6→TX, G→GND
Подключение (SIM808)
Arduino Uno: D0→RX, D1→TX, D12→POWER (SIM808)
Weather Station: 5V→5V, D5→RX, D6→TX, GND→GND
Внешнее питание 7-23V на SIM808, SIM-карта, антенны.
Видео и выводы
Станция работает на балконе и во дворе >3 месяцев. Данные улучшают модель. Перспективы: добавление ветра/UV/газов, swarm-станции для локальных прогнозов, оценка водных ресурсов, урожайности, экосистем.
Код
IoT_weather_station_neural_network.py— полный Python-класс (визуализация, нормализация, обучение, прогноз, сохранение модели).ESP12E_remote_weather_station.ino— скетч NodeMCU (WiFi).SIM808_remote_weather_station.ino— скетч Arduino Uno + SIM808 (GPRS).index.php,account_verification_token.php— веб-приёмник для Google Sheets.
Все файлы доступны в репозитории проекта.
Схемы


Кастомные части
CSV с собранными данными: remote_weather_station_OobOCQNPSW.csv.
Производственный процесс
- DIY солнечная метеостанция на Raspberry Pi
- Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Учебник для начинающих по IoT: стриминг данных температуры с Raspberry Pi
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub
- Интеграция метеостанции с CWOP: практическое руководство
- Создание IoT с Java ME 8 на Raspberry Pi: Часть 1 — интеграция GPIO-датчиков
- Подключение Raspberry Pi 3 к датчику DHT11 и загрузка данных в облако ThingsIo.ai
- Передача данных Adafruit 10DOF IMU с Raspberry Pi 2 в Azure Event Hubs на Windows 10 IoT Core
- Продвинутая метеостанция v2.0: мониторинг температуры, давления, влажности и высоты в реальном времени