Table des matières:

Affichage de l'heure et de la météo Arduino 3-en-1 : 11 étapes
Affichage de l'heure et de la météo Arduino 3-en-1 : 11 étapes

Vidéo: Affichage de l'heure et de la météo Arduino 3-en-1 : 11 étapes

Vidéo: Affichage de l'heure et de la météo Arduino 3-en-1 : 11 étapes
Vidéo: Tutoriel Arduino #3: VU mètre, comment varier des LEDs en fonction de la température 2024, Novembre
Anonim

Par Boomer48Suivez plus par l'auteur:

Utilisation de l'ATtiny85
Utilisation de l'ATtiny85
Utilisation de l'ATtiny85
Utilisation de l'ATtiny85
Outil de partitionnement de tarte et d'élagage de polygones alimenté par Pi
Outil de partitionnement de tarte et d'élagage de polygones alimenté par Pi
Outil de partitionnement de tarte et d'élagage de polygones alimenté par Pi
Outil de partitionnement de tarte et d'élagage de polygones alimenté par Pi
Commandes numériques pour un ampli audio manuel
Commandes numériques pour un ampli audio manuel
Commandes numériques pour un ampli audio manuel
Commandes numériques pour un ampli audio manuel

J'aime les microcontrôleurs PIC et j'aime programmer en langage assembleur. En fait, au cours des deux dernières années, j'ai publié environ 40 projets sur mon site Web basés sur cette combinaison. Récemment, je commandais des pièces à l'un de mes fournisseurs américains préférés et j'ai repéré un Arduino Nano, avec un câble de programmation, pour seulement 1,20 $ de plus qu'une puce de processeur ATMEGA328 nue. J'en ai donc acheté deux. Ensuite, j'ai téléchargé l'IDE Arduino et dépoussiéré ma mémoire de programmation "C++".

Ce projet est un mash-up d'une horloge qui utilise le GPS pour le chronométrage et un récepteur RF qui décode les messages météo à partir d'un capteur AcuRite commun. Le résultat est un affichage du temps et de la température à petite échelle. L'horloge GPS et les routines météo sont configurées en tant que fichiers d'inclusion séparés, il est donc facile d'entrer dans la routine principale et de la configurer pour qu'elle n'exécute que la fonction d'horloge ou simplement la fonction météo. Décommentez simplement le "#define" approprié en haut de la routine principale si vous ne voulez qu'une des fonctions.

Si les deux fonctions sont utilisées, la ligne supérieure de l'écran LCD affiche l'heure locale et la ligne inférieure de l'écran LCD affiche l'humidité et la température en degrés Celsius et Fahrenheit. Si seule la fonction d'horloge est utilisée, la ligne supérieure affiche l'heure locale et la ligne inférieure affiche UTC. Si seule la fonction météo est utilisée, la ligne du haut affiche le premier capteur reçu et la ligne du bas affiche tout autre capteur reçu. J'ai ajouté cette capacité parce que j'ai deux capteurs météorologiques.

Étape 1: Capteur météorologique

Capteur météorologique
Capteur météorologique
Capteur météorologique
Capteur météorologique
Capteur météorologique
Capteur météorologique

Le capteur météo AcuRite utilisé ici envoie des informations sur la température et l'humidité toutes les 16 secondes. Au dos, le numéro de modèle est 000592TXR, mais il est généralement annoncé sous le nom de modèle 06002M. Ce capteur est utilisé par de nombreux modèles de stations météorologiques différents, il est donc facile à trouver et j'ai pu les obtenir sur eBay pour moins de 20 $. AcuRite vend des capteurs d'apparence similaire pour certaines de leurs stations météorologiques, mais ils peuvent ou non adhérer au même protocole de communication. Il y a une indication sur le Web que le capteur de température uniquement 00606 utilise le même format de message mais avec un octet d'humidité invalide.

Comme on le voit dans la première forme d'onde ci-dessus, les messages météo sont envoyés en rafales avec un écart de 2 ms entre les messages successifs. La deuxième forme d'onde illustrée ci-dessus développe une partie d'un message afin de voir les durées et les modèles de bits. Il y a quatre bits de synchronisation d'environ 600us de haut suivis de 600us de bas. Les bits de données sont représentés par 400us de haut suivi de 200us de bas (1) ou 200us de haut suivis de 400us de bas (0).

Le format du message se compose de 7 octets de données. Les deux premiers octets sont l'ID du capteur et ceux-ci ne changent pas (c'est-à-dire qu'il n'utilise pas de code tournant). Le dernier octet est une simple somme de contrôle additive des six premiers octets. Le troisième octet est un indicateur de niveau de batterie et doit toujours être de 44 hex si la batterie est bonne. Le quatrième octet est l'humidité et c'est une valeur non mise à l'échelle entre 0 et 99. Il est important de garder à l'esprit que le bit le plus significatif des octets 4, 5 et 6 est un bit de parité et ne fait pas partie de la mesure valeurs. Les octets 5 et 6 sont la température mise à l'échelle (Celsius), les 4 bits inférieurs de l'octet 5 étant concaténés avec les 7 bits inférieurs de l'octet 6 pour former une valeur de 11 bits. La température est toujours représentée par un nombre positif et ne devient négative que lorsque la mise à l'échelle est appliquée. La mise à l'échelle est (C/10) - 100. La division par 10 est requise car la résolution de la température est en dixièmes de degré. La soustraction est nécessaire car 100 est ajouté par le capteur afin de maintenir la valeur transmise positive.

Étape 2: récepteur RF

Récepteur RF
Récepteur RF
Récepteur RF
Récepteur RF

Le module RF que j'utilise pour ce projet est le RXB6. C'est un récepteur super hétérodyne par opposition aux récepteurs super régénératifs moins souhaitables. Si vous regardez les modules RF bon marché, vous constaterez que les cartes émetteur et récepteur sont souvent regroupées. La plupart de ces récepteurs groupés sont des types super régénératifs, ils ont donc tendance à avoir des caractéristiques de performance (y compris la portée) bien inférieures à celles des récepteurs super hétérodynes. Nous n'avons besoin que du module récepteur pour ce projet car nous recevrons des signaux d'un émetteur de capteur météo.

Étape 3: Antennes RF

Antennes RF
Antennes RF

Le RXB6 n'est pas livré avec une antenne. Vous pouvez acheter des antennes hélicoïdales à bon marché, mais il est également facile de fabriquer votre propre antenne. En fait, un câble de démarrage de planche à pain pourrait être glissé sur la broche d'antenne du module si vous ne voulez pas être trop fantaisiste. Idéalement, une antenne à fil droit aurait 1/4 de longueur d'onde, ce qui équivaut à environ 6,8 pouces. J'ai d'abord fait le truc du fil de liaison et n'ai eu aucun problème à ramasser mon capteur extérieur même si mon atelier d'électronique est dans mon sous-sol.

Une autre possibilité est de fabriquer votre propre antenne hélicoïdale. Il existe une variété de plans pour cela sur le Web, mais celui montré dans l'image ci-dessus est ce que j'ai fait. J'ai utilisé du fil à âme pleine provenant d'un morceau de câble Ethernet et l'ai enroulé autour de la tige lisse d'un foret de 5/32 pouces. Laissez l'isolation en place, à l'exception de la pointe qui se soude à la carte RF. Vous aurez besoin de 20 tours. Vous pouvez également utiliser un foret de 7/32 pouces et envelopper 17 tours à la place. N'importe lequel d'entre eux fonctionnera probablement très bien pour les plages que vous êtes susceptible d'avoir pour vos capteurs. La vraie clé est d'avoir un bon récepteur RF pour commencer. Les capteurs AcuRite ont également des émetteurs assez puissants.

Étape 4: Protocole de communication RF

Il existe différentes techniques de modulation pour transmettre des données, mais ces capteurs utilisent la plus simple qui est OOK (on-off-keying) ou ASK (amplitude-shift-keying). Étant donné que nous avons affaire à des bits de données 0/1 dans cet exemple, l'amplitude est complètement activée ou complètement désactivée. Ainsi, pour nos besoins, OOK et ASK sont identiques car OOK signifie que la porteuse RF est soit complètement activée, soit complètement désactivée. Le format du message est généralement défini par le fabricant du périphérique de transmission et ils peuvent utiliser à peu près n'importe quel débit de transmission, n'importe quel style de formatage de bits et n'importe quelle longueur de message. La bande 433 MHz est pleine de transmissions pour des choses comme les compteurs intelligents, etc. Le logiciel doit donc être réglé pour filtrer uniquement le format de message que nous voulons utiliser.

Étape 5: Données de temps

Données de temps
Données de temps

J'utilise une unité GPS bon marché afin d'obtenir des données temporelles précises qui redémarreront automatiquement après une panne de courant. J'ai plusieurs unités GPS (sans écrans) qui produisent les phrases NMEA standard, mais la plus petite et la moins chère des unités que j'ai est le NEO-6M. Le module NEO-6M est facile à interfacer avec l'Arduino car il utilise un port série de niveau TTL. La seule vraie différence est que la norme NMEA spécifie un débit en bauds série de 4800, mais le NEO-6M est par défaut de 9600 bauds. Vous pouvez exécuter le programme gratuit « u-center » pour modifier le débit en bauds, mais je l'ai simplement laissé aux paramètres d'usine par défaut. Il existe également un programme utilitaire gratuit appelé GPSInfo (publié par Globalsat) qui est très pratique pour afficher les informations GPS sur le PC. Vous pouvez connecter l'unité GPS à un câble USB vers TTL standard pour le vérifier ou pour le configurer à l'aide d'un PC. Gardez à l'esprit que la puce GPS du module fonctionne en réalité à 3,3 volts (via un régulateur de tension intégré), donc si vous souhaitez vous connecter à son port RXD, vous devez passer de 5 volts à la baisse. Le port TXD peut se connecter directement à l'Arduino ou au PC.

Étape 6: Fuseaux horaires

L'affichage de l'heure GPS est une chose facile à faire tant que vous souhaitez simplement afficher l'UTC (Universal Time Coordinated). Les phrases NMEA sont composées de caractères ASCII qui peuvent être directement affichés sur l'écran LCD. La partie heure est au format HHMMSS. FF (heures, minutes, secondes et fractions de seconde). Pour notre horloge, la partie fractionnaire n'est pas utile, nous n'avons donc besoin que de six caractères. Le problème est que vous devez ensuite convertir à votre heure locale et au format AM/PM de 12 heures si vous le souhaitez. Mais parfois, ce sont les problèmes qui rendent la vie intéressante, c'est donc l'objet de cette partie du logiciel.

En ce qui concerne les fuseaux horaires, vous pourriez penser qu'il y en aurait simplement 24 dont 12 à l'est de l'emplacement UTC (+ zones) et 12 d'entre eux à l'ouest de l'emplacement UTC (- zones). En fait, il y en a quelques-uns bizarres qui sont des heures fractionnaires et un couple qui dépasse la « limite » de 12 heures. S'il vous arrive de vivre dans l'une de ces zones, je m'excuse car mon logiciel ne prend en compte que les 24 zones horaires complètes. Certains d'entre nous utilisent également l'heure d'été une partie de l'année, mais cela n'est pas automatiquement pris en compte dans le logiciel. Cela nécessiterait une table de consultation des dates futures, une complexité supplémentaire du logiciel et la nécessité de mettre à jour le logiciel si les semaines de l'année pour le basculement changeaient. Au lieu de cela, le matériel utilise un commutateur de contact momentané pour permettre un réglage facile du fuseau horaire (décalage UTC).

Étape 7: Schéma

Schématique
Schématique

Le schéma est illustré ci-dessus et comprend les connexions pour une interface LCD 1602 à 4 bits. Les données série du récepteur RF sont à des niveaux logiques numériques, elles sont donc connectées directement à l'une des broches d'entrée de données Arduino. La broche est configurée dans le logiciel pour exécuter une fonction d'interruption en cas de changement afin que nous puissions mesurer les largeurs d'impulsion. La sortie GPS TXD est directement connectée à l'entrée Arduino RX.

Il y a deux commutateurs utilisés. Comme mentionné précédemment, un interrupteur à contact momentané permet de régler le décalage UTC. Le commutateur peut être enfoncé à tout moment pour entrer dans le mode de réglage. Initialement, l'écran affichera un décalage UTC invalide de "+77". Reportez-vous à la section « Logiciel de l'horloge » pour les instructions de réglage du décalage UTC.

Le deuxième interrupteur est un simple interrupteur marche/arrêt. En position « off », l'heure sera affichée au format 12 heures (AM/PM) et en position « on » l'heure sera affichée au format 24 heures. Ce commutateur peut être modifié à tout moment pour basculer entre les formats.

Si seule la fonction d'horloge est souhaitée, le module récepteur RF n'a pas besoin d'être connecté. Si seule la fonction météo est souhaitée, le GPS et les deux commutateurs n'ont pas besoin d'être connectés.

Étape 8: Logiciel LCD

J'ai tendance à utiliser l'un des deux types d'interfaces LCD. L'une est l'interface standard à 4 bits et l'autre est une interface à 3 fils qui utilise un registre à décalage. J'ai conçu cette interface lorsque je travaillais avec de petits microcontrôleurs PIC dotés d'un nombre limité de broches d'E/S. J'ai utilisé l'interface 4 bits pour ce projet, mais j'ai mon propre fichier d'inclusion LCD au lieu d'utiliser la bibliothèque LCD Arduino générique. Cela réduit la consommation de mémoire et la complexité du code et me permet également de modifier le code pour des projets spécifiques comme celui-ci.

Étape 9: Logiciel d'horloge

L'unité GPS émet des phrases NMEA-0183 standard qui sont des chaînes ASCII contenant diverses informations. Pour cette application, j'ai choisi la phrase GGA pour obtenir les informations de temps car c'est la phrase que j'ai utilisée pour un projet GPS précédent. Les champs d'informations dans les phrases NMEA sont séparés par des virgules. Ainsi, une fois l'en-tête de phrase GGA détecté, le logiciel compte normalement les virgules et appelle la routine appropriée pour chaque champ d'informations GPS souhaité. Seules les informations de temps sont nécessaires ici et elles sont dans le champ après la première virgule, donc aucun comptage n'est nécessaire.

Les six chiffres de l'heure (HHMMSS) sont mis en mémoire tampon puis traités une fois tous reçus. Le GPS peut produire des messages incomplets au début de sorte que la routine de mise en mémoire tampon vérifie que chaque caractère est une valeur numérique ASCII. Si un caractère incorrect est reçu, le message est rejeté. Cela peut également se produire en de rares occasions pendant le fonctionnement normal, en particulier si la communication du port série chute un peu. Je n'ai vu cela qu'une seule fois et tout ce qui s'est passé, c'est que le temps s'est arrêté pendant une seconde, puis a sauté de deux secondes au lieu d'une.

Si le logiciel est configuré pour n'afficher que l'heure, la première ligne de l'écran LCD affichera l'heure locale et la deuxième ligne affichera UTC. Pour UTC, le logiciel envoie simplement les caractères ASCII directement à la routine d'affichage, avec les deux points (:) insérés de manière appropriée.

Afin de convertir l'UTC en heure locale, le décalage UTC (fuseau horaire) doit être appliqué. Étant donné que l'heure UTC du GPS est au format ASCII, le logiciel convertit les caractères d'heure ASCII en décimales, puis ajoute le décalage UTC. Le décalage UTC est stocké sous la forme d'une valeur BCD positive avec un bit de signe, il est donc d'abord converti en une valeur entière, puis annulée si le bit de signe est défini. Une fois la valeur de l'heure locale calculée, une table de recherche est utilisée pour la convertir en BCD, puis le BCD est reconverti en ASCII pour affichage. La table de recherche doit gérer le format UTC de 24 heures ainsi que +/- 12 fuseaux horaires. Pour ce faire, les heures UTC de 0000 à 2300 occupent les 24 entrées du milieu du tableau avec 12 entrées avant et 12 entrées après pour tenir compte des fuseaux horaires. Une table est au format 12 heures, j'ai donc également ajouté une table de recherche pour la partie AM/PM de l'affichage. L'autre tableau est au format 24 heures. Comme mentionné précédemment, un interrupteur marche/arrêt permet de sélectionner le format 12 heures ou 24 heures.

Le fuseau horaire est extrait de l'EEPROM lors de l'initialisation et affiché brièvement. S'il n'a pas été défini au moins une fois, la routine de définition est appelée. La routine de réglage peut également être appelée à tout moment en appuyant sur l'interrupteur à contact momentané. La routine de réglage initialise l'affichage à "UTC OFFSET +77". Une brève pression sur le commutateur changera la valeur en « -00 ». Si un fuseau horaire positif est requis, un autre appui court changera la valeur en « +00 ». Un appui long (> 1 seconde) fera passer le mode de réglage à l'étape suivante. À ce stade, chaque pression courte incrémentera la valeur de l'heure jusqu'à un maximum de 12. Après avoir atteint le fuseau horaire souhaité, maintenez le commutateur enfoncé pendant plus d'une seconde, puis relâchez-le. Le logiciel enregistrera alors la valeur UTC dans l'EEPROM et affichera brièvement "OFFSET SAVED". Si vous faites une erreur lors de l'entrée, il suffit de sortir, puis d'appuyer à nouveau sur le commutateur pour le réinitialiser.

Le NEO-6M ne nécessite pas une bonne position pour afficher l'heure, il devrait donc émettre des messages dès qu'il reçoit un satellite. Jusque-là, l'écran affichera « NO DATA ».

Étape 10: Logiciel météo

Le microcontrôleur PIC a la capacité d'activer/désactiver une minuterie à l'aide d'une impulsion externe. Cette même impulsion d'entrée peut également être utilisée comme interruption externe pour signaler une lecture de la durée de l'impulsion. L'Arduino n'a pas cette capacité exacte, j'ai donc utilisé la fonction d'interruption lors du changement. Sur un front de l'impulsion de message RF, le temps actuel de la microseconde est enregistré par le gestionnaire d'interruption. Sur le front opposé, le temps écoulé est calculé pour déterminer la largeur d'impulsion.

Le logiciel a une définition « DEBUG » qui permet d'afficher le format de données brutes des messages reçus. Il existe également une définition pour spécifier la broche d'entrée Arduino pour le flux série du récepteur RF. Le logiciel est configuré pour calculer les paramètres de registre d'interruption sur changement appropriés en fonction de cette définition. Le calcul ne fonctionne que pour les broches numériques Arduino. Une broche analogique pourrait être utilisée à la place, mais cela nécessiterait un codage dur des valeurs de registre.

Le gestionnaire d'interruption détermine si le compte capturé est suffisamment long pour être une impulsion de démarrage. Comme mentionné précédemment, l'écart entre plusieurs messages est de 2 ms, c'est donc ce que le logiciel recherche. En raison de tout le trafic à 433 MHz, le filtrage initial dans le logiciel garantit que le temps mesuré est d'au moins 1,8 ms mais pas supérieur à 2,4 ms. Une fois le démarrage détecté, le logiciel recherche les bits de synchronisation (600us) et compte pour s'assurer que quatre d'entre eux sont reçus. Une fois ces tests réussis, le logiciel recherche les temps de bits appropriés de 200us et 400us.

Les bits reçus sont transformés en octets et chaque octet est enregistré. Après la réception de sept octets, la somme de contrôle du message est vérifiée avant qu'un traitement ultérieur ne soit autorisé. Si des octets bruts doivent être sortis (mode de débogage), alors les octets sont convertis en caractères ASCII et envoyés à l'écran LCD. Si des sorties d'humidité et de température sont souhaitées, les conversions appropriées sont effectuées.

Les deux octets de données centigrades dans le message RF sont mélangés pour former une valeur de 11 bits. La partie inférieure est décalée d'un bit vers la gauche pour éliminer le bit de parité et l'aligner sur les bits de la partie supérieure. Les deux octets sont formés en une variable mot de 16 bits, puis le tout est décalé d'un bit vers la droite pour obtenir l'alignement final des bits. La variable mot est ensuite convertie en une variable à virgule flottante pour les calculs mathématiques.

Un gros avantage d'utiliser C++ sur l'Arduino par rapport au langage assembleur sur le PIC est qu'il simplifie les calculs mathématiques. Comme mentionné précédemment, la conversion centigrade est (C/10) -100. Le résultat est converti en une chaîne et envoyé à l'écran LCD pour affichage. Le calcul Fahrenheit est (C * 1,8) + 32. Le résultat est à nouveau converti en une chaîne et envoyé à l'écran LCD pour affichage. Dans les deux cas, la conversion de chaîne inclut le signe négatif (le cas échéant) et la virgule décimale. Une vérification est effectuée pour la virgule décimale pour s'assurer qu'un seul caractère après la virgule est envoyé à l'affichage. Cette vérification est nécessaire car la chaîne peut avoir une longueur de 3 à 5 caractères.

J'ai deux capteurs AcuRite, j'ai donc ajouté une vérification dans le logiciel pour m'assurer que les données de l'un n'écrasent pas les données de l'autre si le logiciel est configuré pour ne faire que la fonction météo. Le premier capteur reçu après la mise sous tension s'affiche sur la ligne 1 et l'autre est affiché sur la ligne 2. En utilisant le mode de débogage, je peux voir quel est l'ID de chaque capteur afin que je puisse faire une simple vérification dans le code si je voulait traiter les données de l'un d'eux.

Le logiciel surveille l'état de la batterie (octet 3) et affiche un message s'il indique une batterie faible. Ce message écrase toutes les autres données de ce capteur.

Étape 11: Affichages

Affiche
Affiche
Affiche
Affiche
Affiche
Affiche

Voici quelques exemples d'affichage pour les différentes fonctions. J'ai quelques autres Instructables mais la plupart de mes projets de microcontrôleur PIC peuvent être trouvés sur mon site Web à l'adresse: www.boomerrules.wordpress.com

Conseillé: