Mon voyage dans le nuage IoT (12) : MQTT autonome

27 octobre 2016, 23:09
carte Pretzel avec bouton et LED
carte Pretzel avec bouton et LED

Après quelques épisodes consacrés à des programmes pour le PC, abandonnons ici cette quincaillerie encombrante et revenons aux microprogrammes embarqués sur de petites cartes. Légères et agiles, celles-ci sont bien adaptées aux messages MQTT chargés par exemple de valeurs de mesure.

C'est le cas de la carte Pretzel, utilisée dans l'épisode précédent, autonome grâce à son ATmega328. Elle peut être programmée depuis l'environnement de programmation Arduino via USB et avec le chargeur d'amorçage (Bootloader). On se souvient du dernier épisode où l'ATmega transfère au module de communication radio (WLAN) ESP8266 les chaînes de caractères provenant du PC. De même, le microcontrôleur renvoie au PC, via le port USB, les réponses reçues de la puce WLAN ; c'est mon programme sur le PC qui les affichait ensuite dans une fenêtre de texte.

Pour commencer, j'ai réutilisé ici ce programme sur le PC ainsi que le microprogramme standard que je viens d'évoquer. J'ai transféré une à une dans l'ATmega328 les différentes tâches du programme PC. Pour simplifier, j'ai connecté la carte Pretzel sur une plaque d'essai, avec un bouton qui me permet de déclencher les actions, ainsi qu'une LED témoin ; dans un premier temps, j'ai laissé la carte Pretzel connectée à l'ordinateur par USB.

Première étape : comme dans le dernier épisode, presque tout est piloté au moyen de boutons dans le programme PC, la réinitialisation de l'ESP8266, la connexion à mon réseau WLAN, la réception d'une communication TCP/IP avec le serveur d'essai MQTT sur Internet et l'envoi via cette connexion des commandes MQTT-CONNECT. Quand j'actionne le bouton, l'ATmega doit seulement ordonner l'envoi du message MQTT-PUBLISH ainsi que des données utiles (Payload) sur le topic déjà utilisé lors du dernier épisode ("/ElektorMyJourneyIoT/TestTopic/test"). J'ai écrit les octets nécessaires en les codant directement dans le croquis Arduino. Pour commencer, j'ai simplement ajouté au microprogramme standard (P01_SoftwareSerial) une requête d'état du bouton de la plaque d'essai. Ça a marché : une fois que le programme du PC a tout initialisé et dès que j'actionne le bouton, la carte Pretzel « autonome » publie le message, ce qu'il est facile de vérifier avec un autre client MQTT (par exemple avec mon programme PC de l'épisode 5).

Deuxième étape : du programme du PC, j'ai transféré les fonctions
TCPClient_Send(...)
MQTTClient_Send(...)
au croquis Arduino. Cela n'a pas été difficile, car les langages C# et C++ d'Arduino sont tous deux dérivés du C. Aux puristes qui fronceront les sourcils à la vue de mon code patatoïde, je ferai valoir qu'il a l'avantage de faciliter la lecture comparée des deux programmes (vous pouvez télécharger ci-dessous le croquis et le programme PC du dernier épisode).
Désormais, l'ATmega concocte lui-même les octets de la commande MQTT-PUBLISH.

Troisième étape : j'ai ensuite transposé les autres fonctions de mes petites bibliothèques TCP/IP et MQTT pour Arduino. J'ai réinitialisé l'ESP8266 depuis le PC puis je l'ai connecté à mon WLAN. Quand j'actionne le bouton sur la plaque d'essai, la carte Pretzel doit maintenant établir elle-même la communication TCP/IP au serveur de test, puis émettre une demande MQTT-CONNECT et enfin envoyer le message MQTT-PUBLISH. Cependant, cette opération doit pouvoir se répéter plusieurs fois de suite. Pour cela, la carte Pretzel doit évidemment savoir si les communications TCP/IP et MQTT sont chacune établies. En effet, le serveur de test interrompt la communication, par ex. si deux demandes MQTT-CONNECT de suite lui parviennent. Bien entendu, j'aurais pu évaluer la réponse ou les messages d'erreur de l'ESP8266 ainsi que du serveur de test, mais j'ai préféré repousser cette tâche à un épisode futur. Pour le premier cas, j'ai simplement fait en sorte que l'ESP8266 coupe la communication TCT/IP avant que j'en établisse une nouvelle. Il est alors tout à fait sûr que la communication MQTT au serveur de test est interrompue, et je peux de nouveau envoyer une demande MQTT-CONNECT suivie du message PUBLISH lui-même ; en prenant soin d'introduire un délai entre les deux. Ce n'est pas très élégant, mais l'envoi successif de messages fonctionne.

Quatrième étape : maintenant il ne reste que la réinitialisation et l'établissement de la connexion WLAN qui doivent être déclenchées depuis le PC par la connexion USB. J'ai finalement également codé les instructions AT directement dans le croquis Arduino, plus précisément dans la routine setup. En raccordant la carte Pretzel à la prise USB, et donc à l'alimentation, elle se connecte d'elle-même au réseau sans fil local. Ensuite, je fais allumer la LED.

Cela fonctionne : pour contrôler qu'un nouveau message MQTT est systématiquement envoyé après l'actionnement du bouton, j'ai juste ajouté un compteur de 0 à 9 et intégré le chiffre dans le message. Vous pouvez télécharger mon croquis ci-dessous et l'exécuter sur votre carte Pretzel, cependant vous devez intégrer dans votre code les données de connexion à votre réseau sans fil (SSID et mot de passe).

Dès qu'elle est mise sous tension (pour cela un bloc secteur 9 Vcc convient) la carte Pretzel doit se connecter à votre réseau. Chaque fois que vous actionnez le bouton, le message « button0 », « button1 » etc. est publié sur le Topic mentionné ci-dessus via le serveur de test HiveMQ.

Après cette étape décisive, il reste beaucoup à faire et bien assez de matière pour de prochains épisodes !

Jens Nickel

Jens Nickel (né en 1969) a étudié la physique à l’université de Stuttgart. Il a été attiré très tôt par l’écriture d’articles techniques. Passionné de journaux techniques et scientifiques, il a saisi l’occasion de transformer son passe-temps en métier grâce à... >>

Chargement des commentaires
articles apparentés