Le but de cette page est de vous présenter ma station météo. Ce site étant axé sur l'électronique et l'instrumentation, je ne vais pas présenter le code en lui-même. Je vais vous présenter les capteurs utilisés, la méthode utilisée pour l'enregistrement des données, la transmission de données entre les cartes, et bien sur, le montage (d'abord réalisé sur plaquette d'essais puis soudé !).
Le projet n'est pas terminé. Certes, il est fonctionnel, mais pour l'instant, je suis obligé de passer par l'interface de communication d'Arduino pour récupérer les précieuses données. Le prochain objectif est de récolter les données avec LabVIEW.
Petite précision: J'ai réalisé cette station météo durant les vacances d'été avant mes cours de pilotage du 3e semestre (que vous pouvez retrouver dans la section Notions d'Électronique...). La méthode utilisée n'est pas optimale, et je n'ai pas le courage de tout reprendre sur la programmation des cartes ! "Après tout si ca marche !..."
Bonne lecture !!
Capteurs
Tempérarture et Humidité: DHT22
Capteur DHT22 Température / HumiditéExtrait de la fiche technique du capteur (datasheet)
Tout en un ! Ce capteur permet d'obtenir la température (en celsius ou en fahrenheit), et le taux d'humidité dans l'air. La plage de fonctionnement du capteur pour la température est de -40C a +80C, ce qui convient largement pour notre station meteo. Pour l'humidité, elle est de 0% a 100%.
Ce capteur possède également une meilleure précision au niveau des mesures par rapport au DHT11.
Luminosité: Photorésistance
Comme son nom l'indique, c'est un composant qui voit sa résistivité varier en fonction de la luminosité. Il suffit de lire la broche analogique de la carte Arduino.
Petite amélioration à effectuer: Pour l'instant, je ne fais que lire la broche analogique de la carte. Je dois maintenant comparer la valeur lue à un niveau d'éclairement A suivre !
une carte Arduino UNO pour acquérir les données et les enregistrer.
une carte Arduino NANO pour transmettre les données de l'Arduino UNO vers l'ordinateur. Plus d'infos dans la rubrique Transmission des données
La carte UNO me permet d'avoir un espace de stockage important (environ 50 mesures de température/humidité/luminosité) avec une petite marge pour éviter les plantages... En sachant que l'on peut régler la fréquence d'enregistrement, en enregistrant tous les jours, j'ai de quoi tenir un peu moins de 2 mois avant que le processus de moyennage de l'historique débute...Largement acceptable pour ce que j'en fais !
Problème: La mémoire de la carte est limitée. Une fois pleine, que faire pour enregistrer une nouvelle valeur ?
Il a fallu décider de l'utilité précise de la station.
Soit moyenner toutes les données (anciennes comme récentes). Dans ce cas, nous avons un appercu global durant la période d'enregistrement.
Soit moyenner les valeurs les plus anciennes et garder un maximum de valeurs récentes. C'est cette option que j'ai retenue.
Comportement du programme lors de l'enregistrement d'une valeur lorsque la mémoire n'est pas pleine
Les valeurs seront stockées dans des "cases". Dans cette partie, je vais (tenter) de vous expliquer ce qui ce passe lorsqu'il reste des cases de libre. En clair, nous pouvons continuer d'enregistrer des valeurs sans déclencher le processus de moyennage.
Nous appellerons "jetons" le nombre d'enregistrements dans une case. Attention ! Pour moi, un "enregistrement", (ou "jeton") est composé de 3 valeurs: (Température, Humidité et Luminosité) à un instant t !
Si la mémoire n'est pas pleine à la date t:
les cases t-1, t-2, ... contiennent 1 jeton (c'est à dire une valeur de Température, une valeur d'Humidité et une valeur de luminosité).
Les cases t+1, t+2, ... (c'est à dire les cases du futur) contiennent 0 jetons, car l'acquisition n'a pas encore eu lieu.
Enregistrement des données
Lorsque la mémoire est pleine...
Si la mémoire est pleine, la première version du programme applique ces règles: (on rappelle que nous voulons moyenner les valeurs les plus anciennes et garder un maximum de valeurs dans un passé récent)
On ne fusionne que 2 cases en une 1 seule
Les cases fusionnées doivent être adjacentes en date
On fusionne des cases avec le même nombre de jetons
On fusionne les plus vielles cases ayant le nombre de jetons le plus faible (pour avoir quand même quelques points dans un passé lointain !)
Voici le processus en image !
Lorsque la mémoire est pleine...
En vous montrant cette image, je ne vous dis pas tout ! Il y a d'autres processus difficilement observables (voir invisibles) sur le tableur :)
D'abord, il y a un code qui permet de privilégier la fusion des cases les plus anciennes, avec un coefficient attribué à chaque valeur dans le passé (Vous pouvez voir mes données brutes en dessous...)
Si vous avez bien remarqué, il y a des lignes où j'ai fusionné 2 cases qui ne devaient pas être fusionnées si on applique à la lettre le programme du début. Exemple: ligne 4 où je fusionne 2 cases ayant 2 jetons alors qu'à coté, il y a des cases avec 1 jeton). La règle de fusionner les plus vielles cases
avec le nombre de jetons le plus faible n'est pas respectée !
Autre exemple: Après la dernière étape, on peut imaginer que je vais fusionner les cases avec 3 jetons plutôt que les cases à 1 jeton pour conserver plus de données dans un passé "récent"...
Ensuite, il y a des cas où il n'y a aucun doublet avec le même nombre de jetons (cela est arrivé lors des essais...)
Bref, il y a également un code qui a pour but de "lisser" le nombre de jetons.
Bien sur, l'exemple est très "simplifié" car il n'y a que 7 cases. Ma station météo en comporte 55.
Et le processus de moyennage est plus accentué sur ma station que sur l'exemple, c'est à dire qu'il n'y a que très peu de cases fusionnées, et les plus anciennes contiennent beaucoup de jetons.
Voici ce que donne une récupération de données: (classé chronologiquement) La fréquence d'enregistrement était de 15 secondes (pour les besoins de la démonstration), et la station a enregistré pendant 55 minutes.
T: Température (Celsius)
H: Humidité (%)
L: Luminosité (on voit bien quand la lumière est allumée ou éteinte !)
t: Date de la prise de la mesure (cela me permet de trier le tableau du plus ancien au plus récent)
J: Nombre de jetons
i: Numéro de la case
4 cases ont été fortement moyennées (car elles ont un nombre de jetons important). Les autres n'ont pas été moyennées puisque le nombre de jeton est de 1. On peut également le voir avec l'heure... Les cases ayant 1 seul jeton sont espacées de 15 secondes (=fréquence d'enregistrement souhaitée). Celles contenant plus de jetons sont plus espacées dans le temps...
Avec ce processus, nous avons une "(très) vague idée" de ce qui s'est passé il y a longtemps, mais au fur et à mesure qu'on se rapproche du présent, nous avons une idée de plus en plus précise ! Résultat en image: Voici ce que donne le tracé de la résistivité (=luminosité) en fonction du temps, du tableau ci-dessus.
Le dernier point n'est pas une erreur, mais il correspond au moment ou j'ai allumé la lumière pour arrêter l'éxpérience !
Améliorations possibles...
Cette méthode peut paraître idéale... Mais le fait de moyenner mes valeurs me fait perdre des informations ! (mes données sont naturellement moins précises !). L'idéal serait de pouvoir conserver les données brutes. Cela me permettrait de voir les éventuelles variations, ou éventuelles erreurs de mesure (valeurs abérrantes).
J'envisage pour cela de transformer (voir refaire) ma station, de telle sorte à ce que celle-ci puisse transmettre la valeur brute à un serveur (sur mon réseau local). Un PC pourrait récupérer constament les valeurs brutes. Plus besoin de moyenner (en effet, plus de problèmes de stockage sur la carte Arduino)
Pour l'instant, c'est encore à l'état de projet, j'ai commencé à regarder comment mettre en place ce dispositif (notamment avec mes cours de Systèmes de Mesures en Réseaux de mon 3e semestre que je mettrai peut-être à disposition sur le site...).
J'ai déjà un module me permettant de transmettre des données sur un serveur local (NodeMCU ESP8266), ainsi qu'un programme LabVIEW permettant d'interroger le serveur et de récupérer les données.
Mon seul problème (pour l'instant) est que la carte alimente mes capteurs en 3.3V (alors que ceux-ci doivent être alimentés en 5V), ce qui provoque la transmission de données abérantes. Et puis, cette méthode m'oblige à laisser un PC allumé 24h/24 !!!
Je dois gérer "plusieurs communications". Les ordres sont donnés par le PC sous forme de commandes (exemple: lettre "h" pour avoir l'historique, "s" pour obtenir l'historique et le supprimer après...). La carte UNO exécute les actions suivant la lettre reçue ("h" ou "s"). La carte NANO sert de relai entre le PC et la carte UNO.
D'abord, la carte NANO (qui est connectée au PC et à la carte UNO) attend l'ordre du PC (sous forme de commandes). Lorsque l'utilisateur envoie une commande, elle est reçue par la carte NANO. Le PC passe ensuite en mode "écoute" pour
recevoir les données.
=> La broche de transmission de données du PC est reliée à la broche de réception de la carte NANO.
Lorsque la commande est reçue par la NANO, cette même carte envoie un ordre de transmission des données météo à la carte UNO. (= elle renvoie la lettre "h" ou "s" à la carte UNO)
=> La broche de transmission de NANO est reliée à la broche de réception de l'UNO.
Quand la carte UNO reçoit l'ordre de transmission, elle transmet les enregistrements sur la carte NANO.
=> La broche de transmission de UNO est reliée à la broche de réception de NANO
Enfin, lorsque la NANO reçoit des données, elle les transmet au PC.
=> La broche de transmission de NANO est reliée à la broche reception du PC.
Cependant, ce schéma comporte un problème. Nous avons ici une liaison série, avec un maitre (qui donne les ordres, et qui écoute les resultats), et un esclave qui execute les ordres (transmission des données au bon moment). Il ne peut y avoir que 2 appareils qui communiquent ensemble ! (car il n'y a pas d'"adressage" dans ce type de liaison)
Dans ce type de communication, il y a 3 connexions: La masse, la transmission et la reception de données. Or, dans mes explications, il y a 3 appareils, et dans l'état actuel des choses, certains ports de communication sont reliés à plusieurs appareils. Par exemple, la broche de reception de la NANO est reliée au PC (pour recevoir les ordres), et à la carte UNO (pour recevoir les données). PROBLEME !!!!
La solution est de mettre en place 2 liaisons de communications. La première s'effectue (via le port USB) entre la carte NANO et le PC. La seconde voie de communication s'effectue via un câble soudé par mes soins entre les 2 cartes Arduino (UNO + NANO). Regardez le schéma ci-dessous, vous comprendrez mieux !
Montage sur plaquette d'essais pour tester le montage, les capteurs et autres fonctionnalités (bouton pour régler la fréquence d'enregistrement, diode pour controler l'état de la machine...)
Les tests sont bons. Soudure des câbles, branchements des différentes cartes (Arduino et Nano) et mise en boite. Station prête à être utilisée !
Réception des données avec le logiciel de programmation d'Arduino. La réception avec LabVIEW ne devrait pas tarder !