Nous vous présentons aujourd'hui une application du Yocto-RS485-V2, pour laquelle nous avons prêté assistance à l'un de nos clients. L'objectif est de recueillir les données mesurées par un capteur de vent à ultrason Gill WindSonic, pour en extraire les valeurs clés conformément aux standards de l'Organisation Météorologique Mondiale (OMM).
Le capteur de vent fournit des mesures de vitesse et de direction du vent à 4 Hz. Elles sont lues en temps réel via un bus RS-485 par un appareil spécialisé, un afficheur Observator OMC-139.
Le but de cette application est d'ajouter sur le bus RS-485, en parallèle à l'afficheur, un module Yoctopuce qui écoute les mesures et les enregistre dans sa mémoire interne. Une fois par jour, un petit script télécharge les mesures depuis l'enregistreur de données et calcule les moyennes et les maxima pertinents. Le script produit un fichier CSV qui peut être ouvert dans Excel par exemple, incluant toutes les valeurs mesurées et calculées pour attester des chiffres produits.
Le capteur de vent de notre client, au sommet d'un mât de 17m50
Enregistrement des mesures
Pour les statistiques de météorologie, les valeurs intéressantes sont les moyennes glissantes de la vitesse et de la direction du vent, selon différentes périodes de moyennage: trois secondes, 2 minutes, 10 minutes. On veut calculer toutes ces moyennes sur une fenêtre de mesure qui se déplace avec une granularité de 0.25 seconde, afin d'identifier précisément le maximum journalier pour chacune de ces périodes. On va donc demander au module d'effectuer un enregistrement à la fréquence de 4 Hz, et on calculera les moyennes glissantes dans le script Python qui les récupérera depuis l'enregistreur de données.
Pour activer l'enregistrement des données qui transites sur le bus RS485, on va utiliser le système de jobs, décrit dans la documentation et dans quelques articles précédents.
Le format des données produites par le capteur de vent ultrasonique est le suivant:
Q,226,006.60,M,00,<ETX>18,61872,07/09/2024 16:15:46 Q,239,008.26,M,00,<ETX>1A,61874,07/09/2024 16:15:47 Q,240,008.69,M,00,<ETX>1F,61875,07/09/2024 16:15:47
Les nombres qui nous intéressent sont les deux premiers: la direction et la vitesse du vent. On va donc pouvoir mettre sur le Yocto-RS485-V2 un job de décodage automatique du flux RS-485 qui ressemble à ceci:
Mais il y a une subtilité: dans le cas où la vitesse est inférieure à 0.05 m/s, la direction n'est pas fournie:
Q,182,000.06,M,00,<ETX>13,254,14/10/2024 10:34:19 Q,,000.04,M,00,<ETX>2A,254,14/10/2024 10:34:20 Q,099,000.13,M,00,<ETX>1C,254,14/10/2024 10:34:20
On va donc rajouter une deuxième règle à notre job pour traiter ce cas:
compute "$direction = -1"
Vous aurez remarqué que dans les règles ci-dessus, nous n'avons pas affecté les valeurs mesurées directement aux genericSensor1 et genericSensor2, mais nous les avons stockées temporairement dans des variables direction et speed. En effet, une difficulté rencontrée dans cette application est que la sonde de vent envoie les mesures à 4 Hz environ, avec une petite tolérance qui dépend de son horloge propre. Or, si le module Yoctopuce enregistre la dernière mesure reçue à 4 Hz exactement selon sa propre horloge, le très léger décalage (variable) de quelques dizaines de ppm entre les deux horloges mène tôt ou tard à une duplication de mesures. En effet, si la nouvelle mesure n'est pas arrivée à temps, la mesure précédente est enregistrée deux fois. Or ceci peut fausser significativement le calcul des rafales maximales. On utilise donc une tâche synchrone pour stocker les mesures, en s'assurant ainsi que chaque valeur lue n'est utilisée qu'une seule fois:
compute "$1 = $direction"
compute "$2 = $speed"
assert "$speed >= 0"
compute "$direction = -1"
compute "$speed= -1"
sync 250
Vous pouvez charger le fichier job complet ici.
Bien sûr, il faut aussi activer l'enregistrement des genericSensor1 et 2 à la fréquence 4/s. A cette fréquence, l'enregistreur peut garder un historique de 3 jours environ pour les deux mesures, après quoi les données les plus anciennes seront effacées.
Script d'analyse des mesures
Le petit programme qui récupère les mesures enregistrées et calcule toutes les moyennes glissantes est écrit en Python, sur la base de l'exemple Prog-Datalogger de notre librairie. Par rapport à l'exemple de base, cette version a l'avantage de commencer par indiquer au démarrage pour quels jours les données sont disponibles dans l'enregistreur, et proposer de choisir un jour particulier à exporter:
Données disponibles du 13-10-2024 20:00:00 au 16-10-2024 09:40:16.25
- Tapez 1 pour exporter les données J-1
- Tapez 2 pour exporter les données J-2
- Tapez 3 pour exporter les données J-3
- Tapez Q pour quitter
Votre choix:
Après avoir choisi un jour, le programme télécharge les données progressivement puis effectue les calculs:
Chargement des mesures de direction : 345600 mesures chargées
Données de vitesse disponibles de 00:00:00 à 23:59:59
Données de direction disponibles de 00:00:00 à 23:59:59
Calcul des moyennes glissantes : terminé
(...)
Max sur 3.0s : 12.345 m/s (44.442 km/h) à 68.0 deg le 13-10-2024 10:23:12
(...)
Fichier Vent Gill 13-10-2024.csv créé
Le programme de calcul de moyennes glissantes est un peu touffu, car il prend soin de gérer les éventuelles données manquantes à tout moment (par exemple en cas de perte de transmission), mais sur le principe de base, il ne s'agit que du calcul de plusieurs moyennes en parallèle avec différentes périodes. Pour calculer la direction moyenne du vent sur une période donnée, on calcule une moyenne vectorielle du vecteur vitesse du vent en le décomposant selon les axes Nord/Sud et Est/Ouest. Vous le pouvez consulter le code source du programme et le télécharger directement sur GitHub.
Conclusion
Dans cette application, le Yocto-RS485-V2 a permis de rajouter une fonction d'enregistrement des données à un système qui n'en avait pas. Le post-traitement en Python a ensuite permis de présenter les données sous la forme optimale pour l'application.
Et si cela vous intéresse, vous pouvez retrouver les données en temps réel de ce capteur de vent sur Twitch via le site de Meteo17aunis.