Station Météo IoT Alimentée par TensorFlow Prédisant Précisément l'Intensité des Précipitations
Composants et fournitures
| Composant | Quantité |
|---|---|
| Kit Station Météo DFRobot (Anémomètre/Girouette/Seau pluviométrique) | 1 |
| Carte NodeMCU ESP8266 Breakout (ESP-12E) | 1 |
| Shield DFRobot SIM808 GPS/GPRS/GSM pour Arduino | 1 |
| Arduino UNO | 1 |
| Raspberry Pi 3 Model B+ ou 4 | 1 |
| Plaque d'essai soudable SparkFun - Mini | 2 |
Outils nécessaires
- Pistolet à colle chaude
Applications et services en ligne
- Arduino IDE
- TensorFlow
- Microsoft Visual Studio 2017
À propos de ce projet
En 2020, des pluies violentes et soudaines ont causé d'importants dégâts aux serres et cultures dans ma région. Avec le changement climatique, ces événements extrêmes deviennent plus fréquents. Plus de 35 incidents de pertes agricoles dus à des pluies excessives ont été enregistrés. Ce projet vise à créer une station météo distante économique pour collecter et interpréter des données locales afin de prédire l'intensité des précipitations.
Les pluies excessives causent : inondations (risque vie humaine), dégâts bâtiments/infrastructures, pertes cultures/élevage, glissements de terrain. Selon des études, elles affectent le rendement des cultures autant que la sécheresse (jusqu'à 34% de perte de rendement maïs aux US). Les systèmes d'alerte précoce ne suffisent pas sans données locales précises par serre/ferme.
J'ai construit un réseau de neurones artificiels (ANN) basé sur un modèle de classification pour interpréter les données météo locales accumulées et prédire l'intensité des pluies. Des recherches montrent que les réseaux de neurones donnent d'excellents résultats pour prévoir précipitations quantitatives (1-3h), tornades, brouillard, etc.
J'ai collecté des données météo sur mon balcon et jardin (rayon 3 km) pendant 3+ mois avec le kit DFRobot et deux cartes :
- NodeMCU ESP-12E (WiFi) pour le balcon
- Arduino Uno + Shield SIM808 (GPRS) pour le jardin (hors portée WiFi)
Les données sont envoyées vers Google Sheets via une application web PHP (API Google Sheets). Après 3+ mois de collecte (toutes les 5 min), j'ai entraîné un ANN avec TensorFlow pour classifier l'intensité des pluies en 5 classes :
- 0 : Pas de pluie
- 1 : Pluie légère (< 2.5 mm/h)
- 2 : Pluie modérée (2.5 - 7.6 mm/h)
- 3 : Pluie forte (7.6 - 50 mm/h)
- 4 : Pluie violente (> 50 mm/h)
Étape 1 : Assemblage du kit station météo
Le kit DFRobot inclut anémomètre, girouette, seau pluviométrique et carte capteur (sortie série 37 octets/sec). Format : c000s000g000t086r000p000h53b10020
- c000 : direction vent (degrés)
- s000 : vitesse vent moyenne (0.1 mph)
- g000 : vitesse vent max (0.1 mph)
- t086 : température (Fahrenheit)
- r000 : pluie 1h (0.01 pouces)
- p000 : pluie 24h (0.01 pouces)
- h53 : humidité % (00 = 100)
- b10020 : pression atmosphérique (0.1 hPa)
Assemblage : fixez anémomètre+girouette sur le pont avec vis/écrous, connectez girouette à l'anémomètre (cordon RJ11), montez tige inox, installez joint seau pluviométrique, placez seau sur tige. La carte capteur n'étant pas étanche, j'ai ajouté une boîte plastique pour protéger l'électronique.
Étape 2 : Collecte données sur Google Sheets
Créez un projet « Remote Weather Station » dans Google Developer Console, activez Google Sheets API, créez un compte de service et clé, configurez l'écran de consentement OAuth, créez un OAuth Client ID (Desktop app), téléchargez credentials.json. Créez un spreadsheet « Remote Weather Station » avec colonnes : WD, Av_WS, Mx_WS, 1h_RF, 24h_RF, Tem, Hum, b_PR.
Étape 3 : Application web PHP pour ajouter données au spreadsheet
L'application PHP reçoit les données météo via HTTP GET des cartes de développement et les ajoute au spreadsheet Google Sheets avec authentification.
Fichiers requis dans dossier remote_weather_station sur serveur : index.php, account_verification_token.php, credentials.json, token.json + bibliothèque Google Client PHP.
index.php : récupère paramètres GET, connecte à l'API Google, charge/rafraîchit token, ajoute ligne au spreadsheet. account_verification_token.php : stocke le code de vérification OAuth.
Étape 3.1 : Déploiement sur Raspberry Pi (ou tout serveur PHP)
Déplacez le dossier dans /var/www/html/. Au premier accès, l'application génère un lien d'autorisation. Autorisez, copiez le code de vérification dans account_verification_token.php, rafraîchissez → token sauvegardé. Testez avec : 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
Étape 4 : Lecture et envoi données avec ESP8266 (WiFi)
NodeMCU ESP-12E programmé pour envoyer données toutes les 5 min au serveur PHP. Bibliothèques : ESP8266WiFi, WiFiClient, ESP8266WebServer, ESP8266HTTPClient, SoftwareSerial. Connexion série sur D6(D5). Parsing du buffer 35 octets, conversion unités (mph→m/s, °F→°C, pouces→mm), envoi HTTP GET toutes les 300 secondes.
Étape 4.1 : Lecture et envoi avec SIM808 (GPRS)
Arduino Uno + Shield SIM808 pour le jardin. Code similaire mais utilise bibliothèque DFRobot_sim808, initialisation module, joint réseau (APN cmnet), établit connexion TCP, envoie GET request via sim808.send(). Nécessite batterie externe 7-23V, antennes GPS/GSM, carte SIM, switch fonction sur « None » (1) pour upload, puis « Arduino » (3).
Étape 4.2 : Création du dataset météo (3+ mois)
Collecte toutes les 5 min → 32 219 lignes dans Remote Weather Station.csv. Variables : Direction vent (°), Vitesse moy/max (m/s), Pluie 1h/24h (mm), Température (°C), Humidité (%), Pression (hPa).
Étape 5 : Construction ANN avec TensorFlow
Prétraitement : visualisation (Matplotlib), normalisation (conversion direction/vitesse vent en vecteurs X/Y, division température/25, humidité/70, pression/1013, pluie 24h/24), création entrées (7 variables scalées) et labels (5 classes selon taux précipitation approximatif), split 60%/40% train/test.
Architecture : Entrée(7) → Dense(16, relu) → Dense(32, relu) → Dense(64, relu) → Dense(128, relu) → Sortie(5, softmax). Optimiseur Adam, loss sparse_categorical_crossentropy, 19 epochs. Précision entraînement : 0.83-0.85, test : 0.72-0.73 (surapprentissage dû données de test insuffisantes).
Prédictions : le modèle retourne probabilités pour chaque classe, argmax donne la classe prédite. Exemples : pas de pluie, pluie forte, pluie violente.
Connexions ESP8266
NodeMCU ESP-12E : Weather Station
VV --------------------------- 5V
D5 --------------------------- RX
D6 --------------------------- TX
G --------------------------- GND
Connexions SIM808
Arduino Uno: SIM808 Shield: Weather Station:
D0 --------------------------- RX 5V --------------------------- 5V
D1 --------------------------- TX D5 --------------------------- RX
D12 --------------------------- POWER D6 --------------------------- TX
GND --------------------------- GND
Note : D0, D1, D12 occupés par SIM808. Batterie externe 7-23V requise. Antennes GPS/GSM, carte SIM. Switch sur None (1) pour upload, puis Arduino (3).
Vidéos et Conclusion
Après 3+ mois de collecte, le modèle ANN fonctionne correctement. Je continue la collecte pour améliorer la précision.
Discussions futures
- Stations NN économiques sur fermes/serres pour prévenir dégâts pluies excessives.
- Essaim de stations communicantes pour prévisions locales précises.
- Utilisation pour évaluer ressources en eau, agriculture, productivité cultures, écosystèmes, hydrologie.
Références
- NIWA, Extreme weather - heavy rainfall
- Univ. Illinois, Excessive rainfall as damaging to corn yield as extreme heat, drought, ScienceDaily 2019
- A. Culclasure, Using Neural Networks to Provide Local Weather Forecasts, Georgia Southern Univ. 2013
Code
Le projet inclut 5 fichiers de code principaux :
IoT_weather_station_neural_network.py: Script Python complet (collecte, visualisation, normalisation, ANN TensorFlow/Keras, prédiction)ESP12E_remote_weather_station.ino: Sketch Arduino pour NodeMCU ESP-12E (WiFi)SIM808_remote_weather_station.ino: Sketch Arduino pour Arduino Uno + SIM808 (GPRS)index.php: Application web PHP (réception données + Google Sheets API)account_verification_token.php: Stockage token OAuth
Tous les codes sont fournis en intégralité dans la section code du projet original.
Pièces personnalisées
Fichier CSV dataset : remote_weather_station_OobOCQNPSW.csv
Schémas
Deux schémas de câblage disponibles (ESP8266 et SIM808).
Processus de fabrication
- Station météo solaire DIY avec Raspberry Pi
- Construction d'une station météo extérieure avec Raspberry Pi 2 et ADS‑WS1
- Construire une station météo Raspberry Pi qui envoie les données météo quotidiennes par email
- Tutoriel IoT débutant : Diffusion de données de température depuis un Raspberry Pi
- Surveillance météo à distance avec Raspberry Pi 3 et PubNub
- Intégrer votre station météo à CWOP : Guide pratique
- Construire l'IoT avec Java ME 8 sur Raspberry Pi : Partie 1 – Intégration capteurs GPIO
- Connecter un Raspberry Pi 3 au capteur DHT11 et envoyer les données vers le cloud ThingsIo.ai
- Envoyer les données IMU 10DOF Adafruit du Raspberry Pi 2 vers Azure Event Hubs avec Windows 10 IoT Core