Débuter avec l’IoT Cloud d’Arduino

Vos premiers pas dans le monde des objets connectés

| Arduino_Genuino | Ubi de Feo | umbobaldi | albertian | marcopass |

Traducteur

f-leb

Dans ce tutoriel, vous allez concevoir un projet simple pour connecter une carte Arduino MKR 1000 (ou MKR WiFi 1010) à la plateforme IoT Cloud d’Arduino. L’objectif sera de contrôler ou de surveiller votre dispositif Arduino par Internet depuis le cloud Arduino dédié au monde des Objets.

Pour cela, vous ajouterez votre carte à la plateforme en tant qu’objet connecté (thing) afin qu’elle soit reconnue dans le cloud. Vous affecterez un ensemble de propriétés (properties) à votre objet (thing), qui seront autant d’interfaces vers des capteurs, LED, moteurs et beaucoup d’autres composants auxquels vous souhaitez accéder par le cloud.

Vous pouvez retrouver la version originale de ce tutoriel rédigé par l’Arduino Team en suivant ce lien : IoT Cloud - Getting Started (licence CC BY-NC-SA).

Commentez

- Titre : Débuter avec l’IoT Cloud d’Arduino

- Auteurs : Arduino_Genuino, Ubi de Feo, umbobaldi, albertian, marcopass

- Traducteur : f-leb

- Parution : 11 mars 2019

- Public visé :

- Licence : Le contenu de cet article est rédigé par Arduino Team et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- I. Matériels, applications et services nécessaires dans ce projet

- II. Créer un objet connecté et contrôler une LED via le cloud

- III. Ajouter un potentiomètre et l’associer à une propriété de type Int

- IV. Ajouter un bouton-poussoir et l’associer à une propriété de type Boolean

- V. (BONUS) – Gérer les rebonds du bouton-poussoir avec une bibliothèque extérieure

- VI. Conclusion

- VII. Annexe

- VIII. Note de la rédaction Developpez

I - Matériels, applications et services nécessaires dans ce projet

- Arduino MKR 1000, MKR 1010 ou Arduino MKR IoT Bundle

- Plaque d’essai pour prototypage rapide

- LED rouge (5 mm – 20 mA)

- Résistances 150 Ω et 10 kΩ. Celle de 150 Ω permettra de limiter le courant qui traverse la LED quand elle sera alimentée (3,3 V). L’autre résistance de 10 kΩ sera utilisée en pull-down avec le bouton-poussoir.

- Potentiomètre rotatif

- Bouton-poussoir 12 mm

- Arduino Web Editor

- Arduino IoT Cloud

II - Créer un objet connecté et contrôler une LED via le cloud

Pour commencer, vous allez créer un circuit assez simple comportant une LED câblée à une carte Arduino MKR 1000 (ou MKR WiFi 1010). Comme indiqué sur le schéma, connectez la patte positive de la LED au connecteur Digital Pin 2 de la carte, et la patte négative en série avec une résistance 150 Ω à la masse Ground. Notez bien que l’alimentation amenée sur la plaque d’essai provient du connecteur Vcc, et non du connecteur 5V de la carte MKR 1000. Si malencontreusement vous alimentez au 5V, vous pourriez endommager la carte, plus tard dans le tutoriel, quand vous ajouterez le bouton-poussoir.

Montage avec une LED reliée au connecteur Digital Pin 2 de la carte MKR 1000 Arduino

Maintenant que la LED est câblée, il faut configurer le dispositif pour l’Internet des Objets (ou IoT pour Internet of Thing). Pour cela, il faut commencer par configurer la carte Arduino afin qu’elle puisse communiquer avec le cloud. Pour ce projet, vous pouvez choisir indifféremment la carte MKR 1000 ou MKR WiFi 1010. Rendez-vous dans l’Arduino IoT Cloud et consultez le guide Getting Started pour vous aider à configurer votre carte, lui donner un nom et récupérer les clés qui permettront de sécuriser votre connexion au cloud en passant par un canal chiffré.

Création d'un nouvel objet

Sélection d'une carte

Configuration pour une connexion sécurisée au cloud

Connexion de la carte au PC, elle devrait automatiquement être reconnue

Donnez un nom à votre carte

Cliquez sur [Configure]

Quelques instants plus tard, la carte est configurée !

Une fois configurée, vous pourrez créer votre premier objet (thing). Votre carte MKR sera automatiquement sélectionnée pour être associée à votre objet, et tout ce qu’il vous reste à faire est de lui donner un nom. On choisira ici d’appeler notre objet IoTCloud_Tutorial_Thing.

Notre carte est présélectionnée

Et on clique sur le bouton [CREATE]

Vous serez alors redirigé vers la page d’édition de votre objet, où vous pourrez créer et ajouter ses propriétés (ou properties, des interfaces vers vos capteurs et actionneurs auxquels vous souhaitez accéder depuis le cloud).

L’objectif est d’allumer ou éteindre une LED depuis le cloud en cliquant sur un widget graphique en forme d’interrupteur dans votre navigateur Internet. Pour cela, vous devez créer une propriété (property) en cliquant sur le bouton [+] comme indiqué sur l’image ci-dessous :

Ajout d'une propriété avec le bouton [+]

On choisira light comme nom significatif de la propriété (ce nom sera repris comme nom de variable dans le croquis Arduino).

On prendra ON/OFF (Boolean) pour le type de la propriété.

Vous pouvez laisser le champ Permission à Read and Write, de manière à autoriser l’utilisateur à basculer l’interrupteur ON/OFF de la LED depuis le navigateur en cliquant dessus. Vous laisserez également le champ Update à When the value changes, pour répercuter tout changement de valeur de la propriété dans le cloud. Finalement, cliquez sur le bouton [CREATE].

Édition des propriétés

Vue du tableau de bord de l'objet connecté

Depuis la vue d’édition des priorités, vous pouvez maintenant cliquer sur [EDIT CODE]. Cela vous redirigera vers l’éditeur de code avec un croquis fonctionnel de votre objet généré automatiquement.

Le croquis porte le même nom que votre objet, suivi de la date de création et éventuellement d’un numéro de version si le nom du croquis existe déjà. En plus du fichier principal main.ino, la copie d’écran ci-dessus montre trois fichiers supplémentaires dans des onglets :

- ReadMe.adoc : un fichier texte contenant des informations à propos du croquis, de l’auteur et du projet lui-même ;

- thingProperties.h : le code généré par l’Arduino IoT Cloud quand vous avez ajouté la propriété light. Il n’y a pas besoin de modifier le code, mais il sera intéressant d’y jeter un œil pour voir les variables du fichier principal (.ino) qui seront synchronisées avec le cloud ;

- Secret : cet onglet permet de renseigner les valeurs des variables SECRET_SSID et SECRET_PASS, qui sont les identifiant et mot de passe du réseau WiFi auquel votre carte doit se connecter.

Regardons le code plus en détail :

thingProperties.h

1. #include <ArduinoIoTCloud.h>

2. #include <WiFiConnectionManager.h>

4. char ssid[] = SECRET_SSID;    // Network SSID (name)

5. char pass[] = SECRET_PASS;    // Network password (use for WPA, or use as key for WEP)

7. #define THING_ID "22daf5e7-4ed2-4228-adca-14d162c26826"

9. void onLightChange();

11. bool light;

13. void initProperties(){

14. ArduinoCloud.setThingId(THING_ID);

15. ArduinoCloud.addProperty(light, READWRITE, ON_CHANGE, onLightChange);

16. }

18. ConnectionManager *ArduinoIoTPreferredConnection = new WiFiConnectionManager(SECRET_SSID, SECRET_PASS);

Ligne 1 : importation de la bibliothèque ArduinoIoTCloud, nécessaire pour synchroniser les variables locales du croquis avec leurs propriétés IoT Cloud.

Ligne 2 : la bibliothèque WiFiConnectionManager s’occupe de la connexion WiFi et de son maintien en continu.

Ligne 4-5 : ces valeurs sont extraites de l’onglet Secret.

Ligne 7 : l’identifiant unique de l’objet (thing).

Ligne 9 : cette ligne déclare une fonction à appeler chaque fois que la valeur de la propriété light est modifiée depuis le tableau de bord. On appelle ce type de fonction : fonction de rappel (ou callback).

Ligne 11 : déclaration de la variable light.

Ligne 13 : cette fonction sera appelée depuis le bloc setup() du fichier principal .ino.

Ligne 14 : indique l’objet auquel il faut se connecter.

Ligne 15 : indique au croquis de traiter la variable light en tant que propriété (property) de l’objet (thing), et d’exécuter la fonction de rappel onLightChange chaque fois que la valeur de la propriété est modifiée depuis l’Arduino IoT Cloud. La permission est définie à READWRITE conformément à celle choisie lors de la création de la propriété.

Ligne 18 : initialise le gestionnaire de connexion avec les identifiant (SECRET_SSID) et mot de passe (SECRET_PASS) du point d’accès WiFi, définis dans l’onglet Secret.

IoTCloud_Tutorial_Thing_feb20a.ino

1. /*

2. Sketch generated by the Arduino IoT Cloud Thing "IoTCloud_Tutorial_Thing"

3. https://create.arduino.cc/cloud/things/22daf5e7-4ed2-4228-adca-14d162c26826

5. Arduino IoT Cloud Properties description

7. The following variables are automatically generated and updated when changes are made to the Thing properties

9. bool light;

11. Properties which are marked as READ/WRITE in the Cloud Thing will also have functions

12. which are called when their values are changed from the Dashboard.

13. These functions are generated with the Thing and added at the end of this sketch.

14. */

16. #include "thingProperties.h"

18. void setup() {

19. /*

20. The following function allows you to obtain more information

21. related to the state of network and IoT Cloud connection and errors

22. the higher number the more granular information you’ll get.

23. The default is 0 (only errors).

24. Maximum is 3

25. */

26. setDebugMessageLevel(2);

28. // Initialize serial and wait for port to open:

29. Serial.begin(9600);

30. // This delay gives the chance to wait for a Serial Monitor without blocking if none is found

31. delay(1500);

33. // Defined in thingProperties.h

34. initProperties();

36. // Connect to Arduino IoT Cloud

37. ArduinoCloud.begin(ArduinoIoTPreferredConnection);

38. }

40. void loop() {

41. ArduinoCloud.update();

42. // Your code here

45. }

48. void onLightChange() {

49. // Do something

50. }

Comme dans tout croquis Arduino, on retrouve les deux fonctions void setup(){...} et void loop() {...}. La fonction setup() est appelée une seule fois à la mise sous tension ou après un reset de la carte. La fonction loop()s’exécute en boucle indéfiniment, tant que la carte est alimentée.

Ligne 16 : importe les fonctions et variables déclarées dans thingProperties.h comme pour toute bibliothèque importée.

Ligne 26 : fixe le niveau de détail des messages du journal de suivi (log) qui seront affichés dans le Moniteur Série (Serial Monitor). Actuellement fixé à 2, on peut le changer avec une valeur comprise entre 0 (qui n’affiche que les messages d’erreur) et 3 (qui affiche TOUT le contenu du journal). Si quelque chose ne fonctionne pas avec la connexion, que ce soit avec le WiFi ou le Cloud, il sera plus simple de trouver la solution si le niveau de détail des messages est élevé. Pour le moment, on peut laisser tel quel.

Ligne 29 : initialise le Moniteur Série, pour affichage ou lecture de données.

Ligne 31 : attendre 1,5 seconde pour donner le temps nécessaire au Moniteur Série de s’initialiser.

Ligne 34 : initialise les propriétés définies dans thingProperties.h.

Ligne 37 : initialise la connexion à l’Arduino IoT Cloud avec le gestionnaire de connexion passé en paramètre.

À l’intérieur de la boucle loop(), on trouve :

Ligne 41 : beaucoup de choses se passent en coulisses derrière cette ligne. Cela inclut la synchronisation des valeurs des propriétés entre le cloud et la carte, la gestion de la connexion au réseau et le Cloud, et d’autres choses encore. Si la valeur d’une propriété change dans le programme, la bibliothèque va automatiquement détecter la modification et la notifier dans le Cloud, puis le résultat sera répercuté dans le tableau de bord. Et inversement, lorsque la valeur d’une propriété est modifiée depuis le tableau de bord, la valeur sera automatiquement répercutée dans le programme de la carte.

Lignes 48-50 : l’implémentation de la fonction de rappel (callback) qui sera sollicitée à chaque fois que la valeur de la propriété light est modifiée. Ici, on doit ajouter le code qui doit être exécuté quand on modifie la propriété depuis le tableau de bord.

Voyons les lignes de code qu’il faut rajouter afin d’allumer ou éteindre une LED lorsqu’on clique sur le bouton ON/OFF depuis le tableau de bord.

Premièrement, on doit définir le connecteur de la carte où est connectée la LED. Ajoutez cette déclaration avant la fonction setup() :

#define LED_PIN 2

Dans la fonction setup(), on doit configurer le connecteur en sortie (OUTPUT) :

pinMode(LED_PIN, OUTPUT);

Finalement, dans la fonction onLightChange(), on affiche l’état de la variable light dans le Moniteur Série et on bascule l’état ON/OFF de la LED. Notez que ce type de fonction de rappel est automatiquement généré lors de la définition d’une propriété avec les permissions Read and Write.

void onLightChange() {
digitalWrite(LED_PIN, light);
Serial.print("The light is ");
if (light) {
Serial.println("ON");
} else {
Serial.println("OFF");
}
}

Et c’est tout. Il ne reste plus qu’à téléverser le croquis en cliquant sur le bouton Upload.

Téléversement du code (upload)

Vous pouvez vérifier si tout fonctionne en ouvrant le Moniteur Série à gauche.

Avec le niveau de détail fixé à 2 du journal de suivi, le Moniteur Série affiche les informations sur la progression de la connexion au réseau et à l’IoT Cloud.

Arduino Create Editor - Moniteur Série

Après la connexion au WiFi et l’accès sécurisé à la plateforme IoT Cloud, des données commencent à être échangées avec la carte :

[ 144313 ] Connecting to "xxxxxx"
[ 148284 ] Connected to "xxxxxx"
[ 148284 ] Acquiring Time from Network
....
[ 148690 ] Network Time: 1550057496
[ 148910 ] Connecting to Arduino IoT Cloud...
[ 152212 ] Connected to Arduino IoT Cloud

Un message d’erreur sera affiché si une des étapes échoue. Si cela arrive, vous pouvez faire un reset de la carte et recommencer, mais si vous avez bien suivi toutes les étapes, il est peu probable que cela se produise :-)

En cliquant sur le bouton [GO TO IOT CLOUD], vous serez redirigé vers la page de contrôle de votre objet. À partir de là, on clique sur le bouton d’accès au tableau de bord (dashboard) :

Vue du tableau de bord

Vous devriez apercevoir un widget représentant l’état de la propriété light, et il devrait être initialement à l’état OFF.

Il vous reste à cliquer dessus encore et encore, et constater que la LED s’allume puis s’éteint, et s’allume à nouveau, s’éteint, etc.

Mission accomplie !

III - Ajouter un potentiomètre et l’associer à une propriété de type Int

Maintenant qu’on a confirmation que tout fonctionne, on peut ajouter de nouvelles propriétés à notre objet. On commencera par lier une nouvelle propriété à un potentiomètre câblé au circuit existant. Le potentiomètre est relié à l’alimentation et à la masse, et son curseur au connecteur Analog Pin A1 de la carte Arduino.

Ajout d’un potentiomètre analogique au circuit

Pour ajouter une nouvelle propriété, il faut procéder comme expliqué plus haut : dans la vue d’édition des propriétés de l’objet, cliquez sur le bouton [+] et donnez le nom angle à la propriété. Sélectionnez le type Int avec des valeurs comprises entre 0 et 270 (champs Min Value et Max Value). La permission sera fixée à Read Only et la propriété sera mise à jour sur changement de la valeur. On devra mettre un Delta strictement supérieur à 0 si l’on veut régler la fréquence des mises à jour. Par exemple, avec un Delta égal à 5, la valeur de la propriété sera mise à jour depuis le cloud seulement si la différence entre la nouvelle et l’ancienne valeur est supérieure à 5, sinon le changement sera ignoré.

Cliquer sur le bouton [CREATE] ajoutera la nouvelle propriété à l’objet en cours, et permettra de revenir à la fenêtre d’édition.

Entre temps, le croquis a été mis à jour pour refléter les changements. Cliquez sur [EDIT CODE] pour revenir dans l’éditeur de code et regardez dans le code de l’onglet thingProperties.h, vous noterez que deux nouvelles lignes sont apparues.

Déclaration de la variable angle représentant la valeur de la propriété qui vient d’être créée :

int angle;

Connexion de la variable angle à sa propriété correspondante, avec la permission READ (impossibilité de modification depuis le tableau de bord). Avec cette permission READ uniquement, il n’y a pas de fonction de rappel générée, d’où le paramètre NULL. Le dernier argument représente la valeur du paramètre Delta discuté plus haut :

ArduinoCloud.addProperty(angle, READ, ON_CHANGE, NULL, 5.000000);

Pour faire interagir le potentiomètre avec le cloud, il faut définir le connecteur de la carte avec lequel il sera connecté dans le fichier principal .ino :

#define POTENTIOMETER_PIN A1

Ensuite, dans la boucle loop(), on lit la valeur sur l’entrée analogique où est relié le potentiomètre, et on rééchelonne la plage des valeurs entre 0 et 270. Ainsi, en tournant le bouton du potentiomètre, la valeur de la propriété sera modifiée et répercutée dans le tableau de bord.

int angleSensor = analogRead(POTENTIOMETER_PIN);
angle = map(angleSensor, 0, 1023, 0, 270);

Il ne reste plus qu’à téléverser le code (Upload) dans la carte et constater le résultat sur le tableau de bord en tournant le bouton du potentiomètre. La valeur devrait évoluer entre 0 et 270 (mais la plage de valeurs peut dépendre du potentiomètre et de la qualité de sa fabrication).

IV - Ajouter un bouton-poussoir et l’associer à une propriété de type Boolean

Pour conclure ce tutoriel, on ajoutera une dernière propriété ! Cette nouvelle propriété sera associée à un bouton-poussoir qui complétera le circuit selon le schéma ci-dessous : une broche du bouton sera reliée au rail d’alimentation (Vcc), l’autre broche sera reliée au connecteur Digital Pin 5 (le fil blanc) et à la masse au travers d’une résistance pull-down 10 kΩ. Cette configuration tire le connecteur au niveau logique bas (LOW) lorsque le bouton est relâché, et au niveau logique haut (HIGH) lorsque le bouton est pressé.

Depuis l’éditeur, cliquez sur [GO TO IOT CLOUD] et créez une nouvelle propriété nommée toggle, de type ON/OFF (Boolean), permission Read Only et Updtate When the value changes.

Une fois de plus, cliquez sur [EDIT CODE] pour revenir à l’éditeur de code. Un coup d’œil rapide dans le code du fichier thingProperties.h fait apparaître une nouvelle variable toggle, associée à sa propriété via ArduinoCloud.assProperty(…).

Dans le fichier principal .ino, on définit un nouveau connecteur et deux variables définissant l’état du bouton (qui seront explicitées plus bas dans ce tutoriel) :

#define BUTTON_PIN 5
int btnState;
int btnPrevState = 0;

La variable btnPrevState (état précédent du bouton) est nécessaire, car on doit mettre à jour la propriété seulement sur changement d’état lorsque l’utilisateur presse le bouton, et non quand il relâche la pression sur celui-ci.

Ensuite, dans la fonction setup() , on configure le connecteur relié au bouton en entrée (INPUT) :

pinMode(BUTTON_PIN, INPUT);

Et finalement, on rajoute ces quelques lignes à la fin de la boucle loop() :

btnState = digitalRead(BUTTON_PIN);
if (btnPrevState == 0 && btnState == 1) {
toggle = !toggle;
}
btnPrevState = btnState;

De cette façon, le bouton agit comme un interrupteur à bascule et vous verrez l’état de la bascule commuter TRUE/FALSE dans le tableau de bord à chaque pression sur le bouton-poussoir.

Étonnant, n’est-ce pas ? Téléversez le code (Upload) et testez par vous-même en appuyant sur le bouton pour vous en rendre compte.

Du chemin a été parcouru depuis le début de ce tutoriel, et vous avez maintenant les moyens de réaliser de puissantes applications pour vos objets connectés. On vous propose quand même de poursuivre et simplifier la gestion du bouton-poussoir en utilisant une bibliothèque extérieure.

V - (BONUS) – Gérer les rebonds du bouton-poussoir avec une bibliothèque extérieure

Quand vous utilisez des boutons-poussoirs comme on a vu précédemment, vous pouvez être confronté au fameux problème des « rebonds », un phénomène de transition lors de l’établissement mécanique du contact entre parties métalliques, où le signal va osciller quelques millisecondes entre les deux états logiques haut et bas. Ce phénomène peut mettre en défaut le fonctionnement normal de votre croquis, et sa prise en compte par un système anti-rebond logiciel peut rendre le code peu lisible (variables temporaires pour mémoriser l’état précédent du bouton, temporisations, etc.) Imaginez alors le code si vous aviez plusieurs boutons à gérer de la sorte…

Une solution plus rapide consiste à utiliser une bibliothèque logicielle dédiée à la gestion des boutons, incluant un système anti-rebonds (debouncing library). La bibliothèque FTDebouncer que l’on peut installer par l’intermédiaire du gestionnaire de bibliothèques (library manager) est une de ces solutions.

Il suffit de se rendre dans le menu Libraries dans la barre de menus sur le côté, saisir « FTDebouncer » dans le champ de recherche et d’appuyer sur Entrée : la bibliothèque apparaîtra et vous pourrez alors l’inclure dans votre croquis en pressant le bouton INCLUDE.

Vous verrez alors une ligne supplémentaire dans le code du fichier principal .ino :

#include <FTDebouncer.h>

Avant le setup(), vous remplacerez les définitions de variables relatives à l’état du bouton…

int btnState;
int btnPrevState = 0;

… avec la déclaration d’une instance de la classe FTDebouncer :

FTDebouncer buttons;

Puis vous remplacerez la ligne d’initialisation…

pinMode(BUTTON_PIN, INPUT);

…par les deux lignes suivantes :

buttons.addPin(BUTTON_PIN, LOW);
buttons.init();

Au début de la boucle loop(), vous ajouterez la commande…

buttons.update();

…et vous supprimerez ces lignes relatives à la gestion du bouton :

btnState = digitalRead(BUTTON_PIN);
if (btnPrevState == 0 && btnState == 1) {
toggle = !toggle;
}
btnPrevState = btnState;

Finalement, à la fin du croquis, vous ajouterez les fonctions suivantes :

void onPinActivated(uint8_t pinNr){
Serial.println(pinNr);
toggle = !toggle;
}
void onPinDeactivated(uint8_t pinNr){
Serial.println(pinNr);
}

Grâce à la bibliothèque FTDebouncer, la fonction onPinActivated() sera appelée quand le bouton est pressé (une seule fois). Quand cela se produit, la propriété toggle change d’état en basculant (bascule à True si False et vice-versa) grâce à l’opérateur ! (opérateur logique NON)

Si on veut exécuter du code en particulier lorsque le bouton est relâché, une fonction onPinDeactivated() est même prévue pour cela.

VI - Conclusion

Ceci termine ce tutoriel détaillé pour débuter avec l’Arduino IoT Cloud.

Si vous avez des retours à faire, vous pouvez vous rendre sur les pages du forum de la communauté Arduino et poser vos questions sur les discussions ouvertes à l’occasion.

Nous travaillons très dur pour créer des outils faciles d’accès pour notre communauté afin qu’elle puisse développer des applications connectées, et de plus en plus de cartes Arduino seront supportées au fur et à mesure des évolutions du projet.

Merci de votre attention, nous veillons toujours à créer davantage de contenus pour une plus grande satisfaction de la communauté.

Bien à vous,

The Arduino Team

VII - Annexe

- Schéma du circuit

- Code complet : Arduino_IoT_Cloud_Example

- FT Debouncer Library sur GitHub

VIII - Note de la rédaction Developpez

Vous pouvez retrouver la version originale de ce tutoriel rédigé par l’Arduino Team en suivant ce lien : IoT Cloud - Getting Started

Nous remercions les membres de la rédaction pour le travail de traduction et relecture qu’ils ont effectué, en particulier : f-leb et naute.