Vous êtes sur la page 1sur 11

Capteurs + Arduino + NodeRed + JSON + Dashboard + Excel +

Ubidots

Dans ce Tp, 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
- Comment visualiser les mesures d’un capteur
- Comment enregistrer les mesures dans un fichier CSV
- Supervision à distance via Ubidots
Vous aurez besoin :

- D’un Arduino Uno


- D’un ordinateur sur lequel est installé Node-RED
- Capteurs : humidité de sol + Température + Pluie + Gaz

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. Il faut télécharger le compilateur Arduino ( https://www.arduino.cc/ )
Code Arduino
define wait 5000
void setup(){
Serial.begin(115200);
}
void loop() {
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);
}
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é

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).
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

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.
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.topic = "YL-69";
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.

Visualiser les mesures sur un graphique


Cherchez le node chart et placer le sur le flow
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
Flow complet du projet
Capteur de température DHT22
#include <DHT.h>;
//Constants
#define DHTPIN 7 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
//Variables
int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
void setup()
{
Serial.begin(9600);
dht.begin();
}
void loop()
{
delay(2000);
//Read data and store it to variables hum and temp
hum = dht.readHumidity();
temp= dht.readTemperature();
//Print temp and humidity values to serial monitor
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
delay(10000); //Delay 2 sec.
}
Fonction température

var temp1= msg.payload[6]-48;

var temp2= msg.payload[7]-48;

var temp3= msg.payload[9]-48;

var temp4= msg.payload[10]-48;

var result = (temp1*1000)+ (temp2*100) + (temp3*10) + temp4;

result = result/100;

var result1 = {payload:result};

return[result1];

Fonction humidité

var hum1= msg.payload[0]-48;

var hum2= msg.payload[1]-48;

var hum3= msg.payload[3]-48;

var hum4= msg.payload[4]-48;

var result = (hum1*1000)+ (hum2*100) + (hum3*10) + hum4;

result = result/100;

var result1 = {payload:result};

return[result1];
Capteur de pluie
int capteur=A0;
int sortie=13;
int detection;
int cde_led;

void setup() {
pinMode(sortie,OUTPUT); // broche "sortie" (13) en SORTIE led L
pinMode(capteur,INPUT); // broche "capteur" (A0) en ENTREE
// initialisation de la liaison série à 9600 bits/seconde
Serial.begin(9600);
while (!Serial) {
} // ne rien faire tant que la liaison série n'est pas établie
(carte LEONARDO)
}

void loop() {
detection=analogRead(capteur); // on lit la broche capteur
"analogique"
Serial.print("valeur capteur : ");
Serial.println(detection); // afficher la valeur de detection sur la
liison série
cde_led=detection/4; // detection 10 bit (max 1023) -> cde_led 8 bit
(max 255)
analogWrite(sortie,cde_led); // on allume plus ou moins la LED L
suivant cde_led
delay(1000); // attendre 1s avant de refaire la mesure
}
Supervision à distance

Vous aimerez peut-être aussi