Etape 5: Aperçu de logiciels - partie B
Préambule
Pour compiler ce code source, vous aurez besoin des bibliothèques supplémentaires suivantes (il y a un peu) ;
PubSubClient.h
- Par : Nick o ' Leary
- Objectif : Permet à l’appareil de publier ou de s’abonner aux sujets MQTT avec un courtier de donnée
- À partir de : https://github.com/knolleary/pubsubclient
DHT.h
- Par : Adafruit
- But : Bibliothèque pour capteur de température/humidité DHT
- À partir de : https://github.com/adafruit/DHT-sensor-library
Bounce2.h
- Par : Thomas O Fredericks
- But : Commutateur entrée de rebondir dans le logiciel
- À partir de : https://github.com/thomasfredericks/Bounce2
LiquidCrystal_I2C_PCF8574.h
- Par : Steve Quinn
- But : Bibliothèque pour contrôler, lecture et écriture à l’écran LCD affiche
- De:
Adafruit_GFX.h
- Par : Adafruit
- Usage : Bibliothèque de Extended graphics pour une utilisation avec le ILI9341
- À partir de : https://github.com/adafruit/Adafruit-GFX-Library
Adafruit_ILI9341.h
- Par : Adafruit
- But : Bibliothèque pour l’écriture sur l’écran TFT ILI9341
- À partir de : https://github.com/adafruit/Adafruit_ILI9431
DS1307.h
- Par : Paul Stoffregen
- But : Pilote de bibliothèque pour l’horloge en temps réel DS1307Z +
- À partir de : https://github.com/PaulStoffregen/DS1307RTC
Time.h
- Par : Paul Stoffregen
- But : Bibliothèque pour une utilisation avec le CCF DS1307Z pour manipuler le temps
- À partir de : https://github.com/PaulStoffregen/Time
Adafruit_BMP085.h
- Par : Adafruit
- But : Bibliothèque d’accès au capteur de pression barométrique
- À partir de : https://github.com/adafruit/Adafruit-BMP085-Library
Tous les détails aussi donnés dans le code source ci-dessous.
Vous aurez aussi besoin de savoir ;
- L’adresse IP de votre courtier MQTT (au format AAA de l’IPv4. BBB. CCC. DDD): adresse IP default (Server)
- Une adresse IP libre d’utiliser pour votre IoT périphérique si vous préférez ne pas utiliser le 'USE_DHCP_FOR_IP_ADDR' #define dans le code.
Vue d’ensemble du code
Au démarrage, le logiciel se connecte au réseau Ethernet en utilisant les coordonnées de connexion préalable fournie ci-dessus.
Une fois connecté à un réseau local l’appareil ITO publiera ses détails aux sujets suivants MQTT ;
- /EthernetDevice/SwVerConfirm : Ce dernier contient un concaténée chaîne, virgules, formée par le nom du périphérique générique, unique adresse MAC du périphérique et le nom du fichier Arduino utilisé pour programmer l’appareil. dans ce cas, « WIZNet5100,de:ad:be:ef:fe:ed,MQTTEthernetAll6_5.ino ».
- /EthernetDevice/Temp1Status : Sur la connexion initiale au réseau cette rubrique publie un message « Connecté » au courtier. Par la suite, il est utilisé pour publier la température locale en précision de 2 décimales de degré Celsius. Mises à jour sont émises uniquement s’il y a un changement de température pour empêcher cette IoT de « boucher » le réseau.
- /EthernetDevice/Humd1Status : Semblable à Temp1Status, mais est une représentation des teneurs en humidité locale mise à l’échelle en pourcentage.
- /EthernetDevice/HeatInd1Status : Semblable à la fois Temp1Status et Humd1Status, mais en cet instant le logiciel calcule l’indice de chaleur de nouveau d’après les relevés de température et d’humidité.
- /EthernetDevice/Barometric1Status : Similaire à Temp1Status, Humd1Status et HeatInd1Status, mais est une représentation de la pression barométrique locale niveau mesuré en hPa ou mBar.
Puis, il s’abonne aux sujets suivants MQTT ;
- /EthernetDevice/SwVerCommand : Lorsque la notification est reçue à ce sujet l’appareil répondra avec une publication de /EthernetDevice/SwVerConfirm . Il s’agit d’une réponse de diffusion . C’est à dire. tous les appareils pourraient répondre.
- /EthernetDevice/de : ad : être : ef : fe : ed / SwVerCommand : lorsque la notification est reçue de ce sujet, l’appareil répond par une publication /EthernetDevice/SwVerConfirm . Il s’agit d’une réponse ciblée . C’est à dire. seulement cet appareil répondra.
- /EthernetDevice/Led1Command : Lorsque la notification est reçue de ce sujet, l’appareil a conduit sortie est définie en conséquence. Charge utile « 1 » = Led allumée, charge utile « 0 » = Led off. Une fois qu’une commande a été mises en œuvre le dispositif répondra en publiant l’état du voyant via la rubrique de /EthernetDevice/Led1Confirm 'On' ou 'Off'
- /EthernetDevice/Button1Status : lors de la réception de la notification de la publication sur ce sujet, l’appareil va répondre en publiant l’état de bouton actuel par un sujet de /EthernetDeviceButton1Command 'Pressed' ou 'Produit'. De cette façon, l’état du bouton peut être vérifiée à tout moment. Notez également si l’état du bouton change indépendamment, via un bouton, puis l’appareil va automatiquement publier un sujet /EthernetDevice/Button1Command .
- /EthernetDevice/SetTime : Lors de la réception de la notification d’une publication sur ce sujet l’appareil met à jour l’horloge système (DS1307Z +) avec cette valeur de temps. Charge utile doit être de la forme "HH: mm' (horloge de 24 heure).
- /EthernetDevice/SetDate : Lors de la réception de la notification d’une publication sur ce sujet l’appareil met à jour l’horloge système (DS1307Z +) avec cette valeur de date. Charge utile doit être au format ' DD/MM/YY ', r-u de forme, mais peut être facilement changé.
- /EthernetDevice/SetLoggingCommand : Lors de la réception de la notification d’une publication sur ce sujet l’appareil met à jour l’ordinateur d’état de journalisation. Une charge utile de 0 = étroite actuelle logfile, 1 = démarrage nouveau fichier journal. Un nouveau nom de fichier journal est formé par la concaténation de JJ/MM avec hh: mm à forme 'DDMMHHMM.csv'. De cette façon, un nom de fichier unique est formé à chaque ouverture. La bibliothèque de cartes Arduino SD a la limitation de convention de nom de fichier DOS 8.3 vieux, cela signifie qu’une période d’au moins une minute avant l’ouverture de nouveaux fichier doit s’écouler. Dans le cas contraire, il est possible d’écrasement des fichiers précédemment ouverts (dans la même minute). Pas un problème majeur, mais un intéressant de souligner.
- /EthernetDevice/SetLoggingPeriodCommand : Lors de la réception de la notification d’une publication sur ce sujet l’appareil met à jour le système variable iLoggingPeriodInMinutes, qui est utilisé pour régir la période à laquelle actuel Local Temp/humidité/BarometricPressure, Remote temperature/humidite est consigné sur la carte SD. Charge utile doit être de la forme "HH: mm' (horloge de 24 heure).
- /EthernetDevice/GetLoggingStatus : Lors de la réception de la notification d’une publication sur ce sujet, l’appareil répondra en publiant l’état actuel de l’exploitation forestière contrôle variable currentLoggingStatus via /EthernetDevice/GetLoggingStatusConfirm sujet. Une valeur de « 0 » = connexion Inactive (eLoggingInactive) et « 1 » = journalisation activée (eLoggingActive). Comme ce type énuméré a spécifiquement des valeurs pondérées de 0 et de 1 pour eLoggingInactive et eLoggingActive respectivement, en ajoutant simplement le numérique compensé d’Ascii '0', la valeur retournée sera un « 0 » ou 1'.
- /EthernetDevice/GetLoggingPeriodStatus : Lors de la réception de la notification d’une publication sur ce sujet, l’appareil répondra en publiant la période actuelle de journalisation au format 'HH: mm' (horloge de 24 heure) via un sujet /EthernetDevice/GetLogginPeriodConfirm .
- /WiFiDevice/Temp1Status : similaire à /EthernetDevice/Temp1Status mais il contient le périphérique distant de l’IoT WiFi température
- /WiFiDevice/Humd1Status : comme indiqué ci-dessus en /EthernetDevice/Humd1Status mais pour les niveaux d’humidité au périphérique distant de IoT WiFi.
Une fois terminé le logiciel maintenant gouttes dans une boucle de contrôle les connexions courtier ainsi que tout changement dans le statut de journalisation, journalisation période variations, logfile statut, bouton État met à jour (via les publications rubrique MQTT ou via une touche locale à fermer ou ouvrir le fichier de journalisation), température locale ou de taux d’humidité ou de nouvelles publications de température et d’humidité. Un résumé des variations barométriques, pression, température et humidité, les et distants, ainsi que des date, heure et nom de fichier .csv actuel sont affichés sur le système LCD en temps réel et répété avec des tendances tracées sur le système TFT.
Données d’enregistrement de la manipulation de fichier
Enregistrement de toutes les locales de température, humidité, pression barométrique et température à distance, humidité se faite sous forme de .csv (variable séparés par des virgules) c’est pour permettre une importation directe dans la Microsoft Excel (TM) telle qu’il devient relativement simple créer des graphiques agréable pour visualiser les données enregistrées.
Enregistrement est contrôlé grâce à l’utilisation d’une « Machine à États logiciel » qui enregistre les différents États peut occuper cette journalisation (ceux-ci reflètent le type énuméré d’eLoggingStatusType d’eLoggingInactive, eLoggingActive, eLoggingInitialise et eLoggingFault). Un schéma de cette machine de l’État a été inclus ci-dessus. Les cercles bleus sont les différents États et les lignes ou les « transitions » entre eux afficher n’importe quelle entrée légitime ou sortie entrant ou sortant de ces États. Le texte au-dessus de chaque transition montre la condition pour le déplacement entre les États et le texte ci-dessous le spectacle de transition toute action qui peut-être être nécessaires pour vous déplacer entre les États.
Changements à l’exploitation forestière sont réalisés en définissant la variable newLoggingStatus sur l’état de choix et puis en appelant la fonction updateLogging() . Qui est appelée automatiquement à chaque passage de la principale loop().
La logique de machine d’État à l’intérieur de la fonction updateLogging() s’occupera des transitions d’État nécessaires et des actions telles que la mise à jour des écrans LCD TFT et d’un changement de nom de fichier ou le nom du fichier journal de compensation si l’enregistrement est terminé.
Gère le défilement d’écran
Défilement d’écran est un sujet intéressant alors j’ai pensé que je voudrais ajouter quelques commentaires sur comment j’ai réussi.
Le deuxième diagramme ci-dessus j’ai dépeint une série typique de parcelles d’écran de photos 1... 5. ici vous pouvez voir le progrès de données tendance ligne (jaune) de gauche à droite sur l’écran jusqu'à ce que l’écran parcelle 7 est atteint et nous avons manquer de mémoire pour enregistrer que les données 7e plot point. Simple, nous pourrions faire un tableau un peu plus longtemps, que vous dites. Puis juste tracer le point. Eh bien nous juste ne pouvons tracer le nouveau point tel qu’il sera hors de l’écran vers la droite comme dans l’écran 6. Une solution serait d’utiliser des pointeurs de tête et la queue (marqué ici que H et T), puis juste effacer l’écran et re-tracer tous les points entre la queue et la tête. Cela fonctionne pour le défilement de droite à gauche comme dans l’intrigue de l’écran 7. Cependant, il y a une autre question fondamentale avec cette approche, à moins que nous possédons une machine de Turing (https://en.wikipedia.org/wiki/Turing_machine) nous ne pouvons pas continuer à ajouter à notre tableau indéfiniment. Nous avons besoin d’un algorithme plus efficace.
La solution consiste à déplacer le pointeur de la tête (ou queue) dos rond au début de notre tableau pour stocker ensuite tracer une fois il « tombe la fin » du tableau. De cette manière permet une mémoire tampon de taille fixe. L’écran est alors mise à jour d’exactement de la même manière comme décrit ci-dessus. Le tracé est fait de H-1 et T-1, mais il s’agit d’un détail mineur. Voir écran parcelles 8 et 9.
Nous avons en effet créé un tampon « circulaire » de la « linéaire ». Voir photo 3 ci-dessus.
C’est exactement l’algorithme que j’ai utilisé dans la fonction updateTrendScreen() pour obtenir l’écran pour faire défiler de droite à gauche.
Bien sûr, j’ai ajouté un peu de bricolage pour optimiser la mise à jour et faire circuler un peu mieux, mais son essentiellement la même.
J’ai laissé de côté une petite optimisation cosmétique, pouvez-vous repérer il ?