Débuter avec l’Arduino et Node-RED. Enregistrer et afficher des mesures en JSON depuis le port série
L’Arduino est très pratique pour récupérer des mesures depuis divers capteurs (présence de polluants, température, humidité, luminosité, indice UV, taux de CO ou de CO2…). Dans ce tutoriel, nous allons apprendre comment créer très rapidement un petit système d’enregistrement de données à l’aide de Node-RED. On pourra très simplement visualiser les mesures sous la forme d’un graphique ou les exporter dans un fichier CSV (fichier texte avec un point-virgule comme séparateur de données) pour faire des calculs statistiques à l’aide d’un tableur (LibreOffice, Excel, Number…).
C’est un tutoriel adapté pour débuter avec du code Arduino
Sommaire [masquer]
- 1 Matériel nécessaire
- 2 Ce que vous allez apprendre dans ce tutoriel Arduino
- 3 C’est quoi Node-RED ?
- 4 Installer le Node Dashboard pour Node-RED
- 5 Installer le Node Serial
- 6 Circuit Arduino
- 7 Code Arduino
- 8 Connexion au port série de l’Arduino avec Node-RED
- 9 Extraire les données du JSON venant de l’Arduino
- 10 Visualiser les mesures sur un graphique
- 11 Enregistrer les mesures dans un fichier csv
- 12 Flow complet du projet
Matériel nécessaire
Pour ce projet, vous aurez besoin :
- D’un Arduino Uno ou d’un clone (n’importe quel modèle conviendra). Vous pouvez également utiliser un ESP8266 mais celui-ci ne dispose que d’une entrée analogique. Vous pouvez également utiliser un ESP32
- D’un ordinateur sur lequel est installé Node-RED et l’IDE Arduino.
- Vous pouvez utiliser un PW Windows, un Mac ou un Raspberry Pi. Suivez ce tutoriel pour installer Node-RED sur votre ordinateur
- Lisez celui-ci pour installer l’IDE Arduino sur Raspbian si vous voulez utiliser un Raspberry Pi .
- Une (ou plusieurs capteurs). Ici, j’ai utilisé deux sondes pour mesurer l’humidité du sol. Une sonde classique YL-69 et une sonde de mesure de conductivité (marquée v1.2) revêtue d’une peinture de protection anti-corrosion.
Ce que vous allez apprendre dans ce tutoriel Arduino
Dans ce tutoriel, vous allez apprendre
- Comment récupérer (acquérir) les données d’un capteur analogique avec du code Arduino (C++)
- Comment envoyer les mesures sur le port série
- Comment mettre en forme des mesures au format JSON pour les exploiter facilement depuis Node-RED
- Découvrir Node-RED
- Vous connecter sur le port série d’un Arduino Uno (fonctionne également avec un ESP8266 ou un ESP32)
- Apprendre les notions de base de programmation javascript sous Node-RED
Vous pouvez également lire cet article précédent.
Le tutoriel est également disponible en vidéo sur Youtube
C’est quoi Node-RED ?
Node-RED est un environnement de développement polyvalent par assemblage de bloc fonctions développé par IBM. C’est un projet plus évolué que Scratch 2. Node-RED est aujourd’hui utilisé pour développer des applications professionnelles. Il permet de faire du prototypage d’application très rapidement (à condition d’avoir un peu l’habitude, sinon c’est plus long…). C’est également un excellent outil d’apprentissage intermédiaire entre Scratch et du code traditionnel. Il est possible de coder en Javascript avec le Node function(fonction).
Vous pouvez commencer par lire ces tutoriels si vous débutez ou ne connaissez pas encore Node-RED
- Débuter avec Node-Red sur Raspberry Pi 3, installation, démarrage automatique
- Installer Node-RED sur Raspbian Stretch Lite (tutoriel avec Raspberry Pi Zero W) ou Armbian sur Orange Pi
- Node-RED : installer, désinstaller facilement des modules avec le gestionnaire de palette
Installer le Node Dashboard pour Node-RED
Il est très facile de créer un graphique (chart en anglais) pour visualiser les mesures en provenance de l’Arduino. Ouvrez le menu de Node-RED (icône dans le coin supérieur droit) pour accéder au gestionnaire de Palette
Dans le champ de recherche, saisissez le mot clé dashboard.
Installez le plugin node-red-dashboard (page GitHub). Il en existe plusieurs autres. C’est l’un des premiers, il est très complet et très facile à utiliser (aucune notion de programmation nécessaire). Pour découvrir toutes les fonctionnalités du plugin dashboard, lisez ce premier tutoriel (bouton, liste, interrupteur, slider, formulaire de saisie) et le second (jauge, graphiques, notifications, template HTML).
Installer le Node Serial
Depuis la version 0.20, il est nécessaire d’installer le node Serial qui permet de communiquer via le port série. Comme précédemment, faites une recherche sur le mot clé Serial et installez le package officiel node-red-node-serialport.
Circuit Arduino
Rien de bien compliqué pour le circuit, il suffit d’alimenter le capteur et de récupérer le signal sur la broche analogique de l’Arduino. Ici, le YL-69 (ou FC-28) est connecté sur la broche A4. Le second capteur sur la broche A5.
Code Arduino
On va simplement lire à intervalle régulier (ici toutes les 5s, 5000ms), la valeur du signal analogique (de 0 à 1023) pour chaque sonde d’humidité du sol. Ensuite on envoi la sortie sur le moniteur série de l’IDE Arduino.
#define wait 5000 void setup(){ // Init serial port (115200 bauds) Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: int a4 = analogRead(A4); //v1.2 int a5 = analogRead(A5); //YL-69 Serial.print("v1.2: "); Serial.print(a5); Serial.print(" YL-69: "); Serial.println(a4); delay(wait); }
Formater les données en JSON
On pourrait envoyer directement les mesures sur le port série de l’Arduino avec un séparateur, par exemple un caractère spécial (|, -, #…) mais cette stratégie implique que l’on sache précisément la position de chaque données. Aucun problème avec une ou deux données, ça devient plus compliqué lorsqu’il y en à une dizaine. Autre problème, la conversion de chaine de caractères qui est un éternel problème en informatique.
Pour éviter tous ce problème, nous allons mettre en forme les données et indiquer à chaque fois à quoi elle correspond. Pour cela, nous allons utilise le format JSON. l’avantage, c’est qu’il est supporté par tous les langages modernes. C’est même la structure de données par défaut du javascript, langage sur lequel repose Node-RED.
Le JSON est une mise en forme structurée des données de type clé = valeur. Chaque ligne de données est séparée par une virgule (sans la dernière ligne). Une valeur peut être une chaine de caractères (une image sera une chaine), un nombre (entier ou décimal), un tableau (chaine, nombre), une structure (qui contiendra elle même des données sous la forme clé = valeur). Voici un exemple. Tout d’abord en ligne, c’est ce que le code Arduino va généré
{"sonde1":22.1,"sonde2":64.1,"unites":{"sonde1":"°C","sonde2":"%"}}
On peut déplier la structure pour la rendre plus lisible (et trouver une erreur)
{ "sonde1":22.1, "sonde2":64.1, "unites": { "sonde1": "°C", "sonde2": "%" } }
Pour vérifier votre code, je vous conseille d’utiliser le site jsonlint.com qui est gratuit.
Jsonlint indique la ligne (et la cause d’une erreur mais ce n’est pas très explicite). Ici il faut mettre une virgule à la place du point virgule
Pour de gros projet, comme par exemple cette station météo avec interface WEB, je vous conseille d’utiliser la librairie ArduinoJSON. Elle permet de stocker les données au format JSON dans la mémoire de l’Arduino. C’est très pratique pour extraire des données, des réglages, enregistrer un historique dans la mémoire SPIFFS ou une carte SD.
Ici, on va faire plus simple et directement construire une chaine de caractères et l’envoyer sur le port série ce qui donne le code suivant
#define wait 5000 void setup(){ // Init serial port (115200 bauds) Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: int a4 = analogRead(A4); //v1.2 int a5 = analogRead(A5); //YL-69 Serial.print("{\"v1_2_raw\":"); Serial.print(a5); Serial.print(",\"YL69_raw\":"); Serial.print(a4); Serial.println("}"); delay(wait); }
Ce qui donne maintenant sur le moniteur série
{"v1_2_raw":250,"YL69_raw":301}
Vérifions avec Jsonlint si tout est correct
Parfait, on peut continuer sur Node-RED maintenant.
Connexion au port série de l’Arduino avec Node-RED
Connectez-vous à Node-RED depuis un navigateur internet à l’adresse localhost:1880 ou depuis un autre ordinateur (IP:1880)
Le code Node RED est appelé Flow. On va commencer par se connecter à l’Arduino à l’aide du Node (la brique de programmation) Serial (dans la palette Input, puisqu’on veut lire les mesures). Glissez-déposer le node sur la page blanche et faites un double clic sur le Node Serial pour ouvrir le panneau de configuration.
Cliquez sur le crayon pour ajouter une nouvelle connexion. Utilisez la loupe pour lister les ports COM. Ici l’Arduino est connecté sur un Raspberry Pi 3, donc le chemin vers l’Arduino est au format Linux. Sur Windows, ce sera un port COMx.
Dans le code Arduino, la ligne de code Serial.begin(115200) permet d’initialiser la vitesse à 115200 bauds, indiquez la vitesse sous Baud Rate. Enregistrez, c’est tout ce qu’il y à faire
Cherchez le Node Debug
Reliez le Node Serial au Node debug. Pour cela, placez la souris sur le carré qui symbolise la sortie de Node Serial, un fil orange apparaît. Allez l’accrocher à l’entrée du node debug. Vous venez de créer votre premier flow.
Déployez le flow et cliquant sur Deploy et ouvrez l’onglet debug pour visualiser les données qui arrivent de l’Arduino. Attendez quelques secondes en fonction de la temporisation programmée dans le code Arduino.
Extraire les données du JSON venant de l’Arduino
Pour le moment, on récupère une chaine de caractère sur le port série de l’Arduino, on va la convertir en un objet JSON exploitable par Node-RED à l’aide du node JSON. Placez le sur le flow et reliez-le au port série.
On va maintenant extraire chaque mesure avec un peu de code javascript. Placez un node Function et reliez le à la sortie de node JSON
Ouvrez la fonction et collez ce code javascript.
msg.payload = msg.payload.YL69_raw; return msg;
Node-RED transfert des messages (msg) au format JSON entre chaque Node (noeud du programme). Les données se trouvent dans la clé payload. La première ligne extrait la mesure du capteur YL-69 (ou FC-28) et écrase le payload actuel.
msg.payload = msg.payload.YL69_raw;
La fonction retourne le message (msg)actualisé. Il ne renvoi plus que la mesure du premier capteur
Faites la même chose pour le second capteur en ajoutant un second flow
Visualiser les mesures sur un graphique
Cherchez le node chart et placer le sur le flow
Reliez les des fonctions au node chart. Ouvrez le panneau de configuration du graphique. Cliquez d’abord sur le crayon pour créer un groupe. Pour en savoir plus sur l’organisation des groupe, lisez cet article.
Ensuite vous pouvez modifier certains paramètres :
- Group : sélectionnez le groupe que vous venez de créer
- Size : taille
- Label : libellé
- X-axis : nombre de points ou période de temps
- Name : le nom qui apparait sur le flow
Enregistrez, déployez et allez l’adresse localhost:1880/ui (ou IP:1880/ui) pour visualiser les mesures de vos capteurs connectés à l’Arduino
Enregistrer les mesures dans un fichier csv
Maintenant, si vous voulez exploiter vos données sur un tableur Excel ou LibreOffice, vous pouvez les enregistrer au format csv (fichier texte dont le séparateur de données est un point-virgule). Pour cela, on va ajouter une nouvelle fonction qui va simplement renvoyer un ligne dont chaque données est séparée par un point virgule. Voici l’ordre des colonnes
- date au format année/mois/jour (supporté par tous les tableurs)
- heure au format hh:mm:ss
- valeur de la sonde v1.2
- valeur de la sonde YL-69 ou FC-28
var date = new Date().toLocaleDateString(); var time = new Date().toLocaleTimeString(); var output = date + ";" + time + ";" + msg.payload.v1_2_raw + ";" + msg.payload.YL69_raw; msg.payload = output; return msg;
Cherchez le node file et placez un node input sur le flow
Sur le panneau de configuration, indiquez le chemin de destination. Par défaut le fichier est enregistré dans le répertoire de Node-RED. Cochez Add newline to each payload pour ajouter une nouvelle ligne au fichier à chaque nouvel enregistrement
Déployez, après quelques minutes, voici à quoi va ressembler le fichier CSV
2018-5-21;10:04:22;250;302 2018-5-21;10:04:26;251;302 2018-5-21;10:04:30;251;302 2018-5-21;10:04:34;250;302 2018-5-21;10:04:38;251;302 2018-5-21;10:04:42;250;303 2018-5-21;10:04:46;250;302 2018-5-21;10:04:50;250;302 2018-5-21;10:04:54;250;303 2018-5-21;10:04:58;250;303 2018-5-21;10:05:02;250;302 2018-5-21;10:05:06;253;308 2018-5-21;10:05:10;252;305 2018-5-21;10:05:14;250;302 2018-5-21;10:05:19;251;303 2018-5-21;10:05:23;251;302 2018-5-21;10:05:27;250;302 2018-5-21;10:05:31;250;302 2018-5-21;10:05:35;250;302 2018-5-21;10:05:39;250;302 2018-5-21;10:05:43;250;302
Flow complet du projet
Voici le flow complet du projet
et le code correspondant.
[{"id":"9435a9fc.ab96d8","type":"serial in","z":"3639e7d1.f1c3e8","name":"Arduino Uno","serial":"c237b06b.eb7ca","x":130,"y":360,"wires":[["4c310d82.46f3d4","1f6f19ed.d8ead6"]]},{"id":"1f6f19ed.d8ead6","type":"json","z":"3639e7d1.f1c3e8","name":"","property":"payload","action":"","pretty":false,"x":330,"y":480,"wires":[["2499ca17.61eff6","df59b710.dc7648","6ee454f.ffd6bac","b292e47a.faf158"]]},{"id":"2499ca17.61eff6","type":"function","z":"3639e7d1.f1c3e8","name":"Format Arduino sensors Data","func":"var date = new Date().toLocaleDateString();\nvar time = new Date().toLocaleTimeString();\n\nvar output = date + \";\" + time + \";\" + msg.payload.v1_2_raw + \";\" + msg.payload.YL69_raw;\nmsg.payload = output;\nreturn msg;","outputs":1,"noerr":0,"x":560,"y":480,"wires":[["62e4634a.85417c"]]},{"id":"62e4634a.85417c","type":"file","z":"3639e7d1.f1c3e8","name":"","filename":"/home/pi/moisture_sensors.csv","appendNewline":true,"createDir":false,"overwriteFile":"false","x":830,"y":480,"wires":[]},{"id":"df59b710.dc7648","type":"function","z":"3639e7d1.f1c3e8","name":"Extract v1.2 data","func":"msg.topic = \"v1.2\";\nmsg.payload = msg.payload.v1_2_raw;\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":540,"wires":[["c4ed7b7f.b766a8"]]},{"id":"6ee454f.ffd6bac","type":"function","z":"3639e7d1.f1c3e8","name":"Extract YL-69 data","func":"msg.topic = \"YL-69\";\nmsg.payload = msg.payload.YL69_raw;\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":600,"wires":[["c4ed7b7f.b766a8"]]},{"id":"c4ed7b7f.b766a8","type":"ui_chart","z":"3639e7d1.f1c3e8","name":"","group":"bb260e6b.77d62","order":0,"width":"9","height":"10","label":"Arduino YL-69 + v1.2 data","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"bezier","nodata":"","dot":false,"ymin":"0","ymax":"1023","removeOlder":"60","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":780,"y":560,"wires":[[],[]]},{"id":"b292e47a.faf158","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":420,"wires":[]},{"id":"4c310d82.46f3d4","type":"debug","z":"3639e7d1.f1c3e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":310,"y":360,"wires":[]},{"id":"c237b06b.eb7ca","type":"serial-port","z":"","serialport":"/dev/ttyUSB1","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"bb260e6b.77d62","type":"ui_group","z":"3639e7d1.f1c3e8","name":"Capteurs d'humidité - Moisture sensors","tab":"fe82c1e5.b7118","disp":true,"width":"9","collapse":false},{"id":"fe82c1e5.b7118","type":"ui_tab","z":"3639e7d1.f1c3e8","name":"Home","icon":"dashboard"}]
Copiez le code précédent. Ouvrez le menu de NodeRED puis Import -> Clipboard
Collez le code et choisissez ou vous voulez le coller puis Import
Voilà, si vous avez aimé NodeRED et que vous voulez allez encore plus loin, voici d’autres articles sur le sujet
0 comentarios:
Publicar un comentario