Arduino Node-Red
Arduino Node-Red
Arduino Node-Red
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…).
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
o 7.1 Formater les données en JSON
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
o
12.0.1 Partager :
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.
o Vous pouvez utiliser un PW Windows, un Mac ou un Raspberry Pi.
Suivez ce tutoriel pour installer Node-RED sur votre ordinateur
o 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.
Amazon.fr
WINGONEER de la Soil hygromètre Humidité de détection d'eau Sensor Module YL...
8,49€
Amazon.fr
AZDelivery UNO R3 avec un câble USB pour Arduino , compatible à 100% avec...
9,99€
Amazon.fr
Raspberry Pi 3 Modèle B +
49,90€
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
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.
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);
}
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.
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
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
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.
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
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
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":"","prop
erty":"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":"For
mat 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":"","file
name":"/home/pi/moisture_sensors.csv","appendNewline":true,"createDir":fals
e,"overwriteFile":"false","x":830,"y":480,"wires":[]},
{"id":"df59b710.dc7648","type":"function","z":"3639e7d1.f1c3e8","name":"Ext
ract 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":"Ext
ract 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":"Arduin
o YL-69 + v1.2
data","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate"
:"bezier","nodata":"","dot":false,"ymin":"0","ymax":"1023","removeOlder":"6
0","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":f
alse,"colors":
["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#94
67bd","#c5b0d5"],"useOldStyle":false,"x":780,"y":560,"wires":[[],[]]},
{"id":"b292e47a.faf158","type":"debug","z":"3639e7d1.f1c3e8","name":"","act
ive":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"fa
lse","x":530,"y":420,"wires":[]},
{"id":"4c310d82.46f3d4","type":"debug","z":"3639e7d1.f1c3e8","name":"","act
ive":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"fal
se","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":"Capt
eurs 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
Voilà, si vous avez aimé NodeRED et que vous voulez allez encore plus loin, voici
d’autres articles sur le sujet