Dans l'épisode 20 et l'épisode 21, nous avons vu comment utiliser un réseau local pour configurer des appareils fonctionnant sur l'Internet des objets (IdO, en anglais IoT = Internet of Things). L'ESP32 déploie son propre réseau local sur lequel un smartphone/une tablette/un PC peuvent se connecter. Un petit serveur Web que nous avons, comme à notre habitude, programmé depuis l'IDE Arduino fournit le site Web de configuration.
Dans les épisodes précédents, nous pouvions déjà mettre en place l'identifiant (SSID) et le mot de passe d'un routeur sans fil local. Après avoir transmis ces données, l'ESP32 pouvait se connecter et ainsi ouvrir la porte de l'Internet. Nous ne l'avons cependant pas utilisé. Comme application de démonstration, le microcontrôleur a simplement fourni un autre site Web accessible localement via le routeur sans fil et permettant de commander une LED.

Mesures du capteur dans le nuage

Dans cet épisode, nous allons de nouveau travailler dans le nuage. Dans l'épisode 18, nous avons montré comment envoyer les mesures d'un capteur via MQTT à la plateforme AllThingsTalk. Les données sont alors affichées sur une page Web spéciale, que tout le monde peut mettre en place – cela fonctionne alors bien entendu de partout dans le monde car cette page est hébergée sur l'Internet. Dans l'épisode 18, nous devions d'ailleurs indiquer le SSID et le mot de passe du réseau de notre routeur ainsi que le Device ID et le Device Token permettant l'authentification vis-à-vis de AllThingsTalk et que nous avions codé en dur dans le croquis Arduino.

De là à combiner les deux, il n'y avait qu'un pas, vite franchi : quelques copier-coller plus tard et moyennant quelques adaptations, j'ai obtenu le croquis que vous pouvez télécharger ci-dessous. Je vous suggère de le comparer avec celui publié dans le dernier épisode.
Dans la fonction Loop, vous reconnaissez le serveur Web de l'épisode précédent – mais cette fois il se contente d'écouter si une demande de fourniture de la page Web de configuration arrive via l'adresse 192.168.4.1 (donc l'adresse définie par l'ESP32 pour son propre réseau sans fil).


Le formulaire comprend cette fois-ci cinq champs textuels. Pour les essais, le premier champ permet, comme précédemment, de commuter la LED rouge située sur la plaque d'essai raccordée au kit ESP32 DevKitC. Dans les champs suivants, on saisit le SSID, le mot de passe, le Device ID et le Device Token. Les valeurs sont enregistrées durablement dans la mémoire flash de l'ESP32 et récupérées à chaque démarrage (voir la fonction Setup).

Une fois que l'utilisateur a transmis les réglages à la page Web, l'ESP32 essaie comme la dernière fois de se connecter dans la foulée au réseau sans fil. À ce moment, la LED RGB brille en jaune. En cas de succès, la variable
 
RouterNetworkDeviceState = NETWORKSTATE_LOGGED;

prend la valeur VRAI comme dans le dernier épisode. Je n'ai pas modifié le délai de 50 ms introduit dans le déroulement de la boucle principale. Dans la situation connecté, la brillance de la LED diminue légèrement à chaque tour de boucle afin de donner signe de vie. Pour la première fois, la LED est de couleur jaune. Il y a cependant une deuxième étape : tout d'abord, l'ESP32 essaie, via TCP/IP, puis MQTT, de se connecter au serveur AllThingsTalk. Pour réduire le trafic, en cas de défaut, cela ne se reproduit qu'une fois sur 40 dans le déroulement de la boucle, ce qui représente environ deux secondes. À cet effet, le programme emprunte une autre branche dans la fonction ConnectToATT(), que j'ai pour l'essentiel récupérée de l'épisode 18. Si la connexion via TCP et MQTT est établie, la couleur de la LED RGB passe au vert, dans le cas contraire au rouge (ces couleurs sont alors atténuées au tour de boucle suivant). En cas de succès, on a
 
MQTTClient_Connected = true;

ce qui signale au programme que les mesures du capteur ont été envoyées.
 

ESP32 avec photocapteur

Pour mesurer quelque chose de sensé, j'ai connecté une photorésistance à la broche 36 de l'ESP32 (voir le schéma).



Pour lire la tension sur la broche, il est facile d'utiliser la fonction standard d'Arduino analogRead(numéro_broche). La plage de mesure de l'ADC va de 0 à 1 V, avec une résolution de 12 bits. Après la mesure, le programme élimine 6 bits, de sorte qu'il reste un nombre compris entre 20 et 63 environ, il représente la luminosité de l'environnement. Nous envoyons alors ce nombre à AllThingsTalk ; plus précisément il est lié au MQTT-Topic sous le nom de capteur « light » dans la fonction SendSensorDateToATT(…). J'ai repris la montée d'une température fictive de l'épisode 18, et cette valeur est également envoyée au serveur (sous le nom de capteur temperature). À cela, il y a une raison simple.
Même avec un Device ID ou un Device Token erronés, le courtier MQTT d'AllThingsTalk prend la demande de connexion MQTT-Connect au pied de la lettre. Mais si l'on veut publier ces mesures de capteur, ce n'est bien évidemment pas accepté. Pour autant, nous ne pouvons pas le détecter puisque la commande MQTT-Publish ne renvoie rien. La simple suite de chiffres croissants montre au moins sur la page Web de visualisation si des mesures de capteurs parviennent ou non.


 

Bibliothèques  MQTT- et TCP 

Si vous regardez le croquis du présent épisode, vous verrez, le cas échéant, que les fonctions MQTT et TCP/IP ont disparu. Je les ai transférées dans une bibliothèque de classe (de la même manière que les fonctions LED RGB de l'épisode précédent).
Cette section de code
 
#include <TCPClient.h>
TCPClient attTCPClient = TCPClient();
#include <MQTTClient.h>
MQTTClient attMQTTClient = MQTTClient();

lit les bibliothèques et construit aussitôt les objets permettant d'accéder aux fonctions correspondantes. Dans la fonction Setup, on trouve également l'instruction
 
attMQTTClient.myTCPClient = attTCPClient;

Cela transfère l'objet TCPClient à l'objet MQTTClient, qui, dans le programme principal, est utilisé pour la communication via TCP. La bibliothèque MQTT accède en effet aussi aux fonctions de la bibliothèque TCP/IP. Les logiciels réseau et protocole sont souvent construits avec ce type hiérarchique ; c'est pourquoi, pour le débutant dans ce domaine, cela vaut bien la peine de se mettre à la programmation objet.

Prototype de nœud de capteurs ESP32

Essayez tout cela vous-même ! Une plaque d'essai et les composants nécessaires doivent se trouver dans le bric-à-brac de tout électronicien. Le sous-dossier des bibliothèques du téléchargement doit être placé dans le sous-dossier libraries de l'IDE Arduino. Compilez et chargez le programme dans l'Arduino ; une fois que la LED verte est allumée en permanence, connectez-vous au réseau ESP32_MyJourneyIoT et appelez 192.168.4.1 depuis le navigateur. Saisissez alors les valeurs correspondantes dans les champs textuels. Dans le champ Device Token, seule la chaîne de caractères placée derrière maker: doit être saisie, cette chaîne sera complétée dans le croquis .
Maintenant, la LED RVB devrait briller avec une diminution cyclique progressive de brillance, en jaune dans un premier temps, puis en vert. Les mesures des capteurs devraient apparaître sur votre page Web ATT (voir l'épisode 18), si votre Device ID et votre Device Token sont corrects.

J'ai aussi essayé de connecter mon prototype à une batterie USB pour faire un appareil IdO capable d'envoyer des mesures de luminosité dans le nuage en toute autonomie.

La suite au prochain épisode !