home castoo
chapitre electronique
Electronique carte Yunshan HW622

MQTT MOSQUITTO NODE-RED INFLUXDB
Projet mesure quantité reserve
recupérateur eau

novembre 2019

Un petit projet pour découvrir (survoler) MQTT.

But initial du montage :

J'ai installé il y a quelques temps une citerne qui récupère l'eau de pluie de mon toit, j'aimerais savoir à tout moment la quantité d'eau en réserve. J'ai lu qu'il était possible d'utiliser un capteur d'ultrasons SR-04 pour mesurer la distance entre l'eau et le haut de la cuve alors je vais tester...
Le montage sera basé sur un Esp-8266 qui permettra d'envoyer les données vers un serveur.

But complémentaire :

Je vais profiter de ce petit montage pour redécouvrir MQTT qui est normalisé et permet de regrouper des données sur un serveur domotique.
Je ne détaillerais pas ici l'installation des différentes applications sur le raspberry ce qui est fait sur de nombreux sites mais je vais tracer la mise en oeuvre minimale de ceux-ci afin de vous donner envie de les utiliser si ceci n'est pas déjà fait !
Nous allons donc découvrir :
MOSQUITTO qui va nous permettre d'envoyer les données collectées par l'Esp-8266 vers le raspberry par un protocole efficace, rapide et normalisé. NODE-RED qui va permettre à l'aide d'une interface graphique de cheminer les données vers différentes cibles. INFLUXDB qui est une base de données directement interfacable avec NODE-RED. Dans un autre projet nous découvrirons GRAFANA qui permet de réaliser des graphiques à partir des données collectées...

Je profite de cet article pour dire un grand BRAVO aux développeurs de ces applications magnifiques et utiles qui sont misent dans le domaine public pour notre plus grand plaisir !

Les étapes de la réalisation


esp8266-12e sr-04


Le montage est simple, il est ici en test, on retrouve l'Esp-8266-12 qui est monté sur un suport bien pratique. Le capteur d'ultrasons SR-04. Un petit écran OLED en I2C et une interface USB/TTL pour la programmation de l'ESP. Le schéma est classique et le programme pour le test vous est donné en bas d'article.

esp8266-12e sr-04

Un petit schéma pour mieux s'y retrouver !

schema esp8266-12e sr-04

cablage esp


Une fois fonctionnel le montage est transféré sur une plaque à trous pour des tests plus faciles. Le SR-04 donne des résultats de mesure plus fiable avec une alimentation en 5 volts plutôt qu'en 3v3 comme celle de l'ESP, j'utilise donc ici une petite carte ESP alimenté par une micro-USB c'est bien pratique car le pas des broches est en 2.54 et la conversion du 5v en 3.3 est déjà réalisée. Il y a même un petit bouton de reset, bien pratique ! Le petit LCD affiche au démarrage un logo castoo puis une barre de chargement le temps de la connexion puis des tops départ pour l'envoie des données. Le programme que je vous livre est expérimental, à vous de le transformer en un programme de course...

esp8266-12e sr-04

raspberry et mosquitto


Une fois que vous aurez installé MOSQUITTO sur votre RASPBERRY vous pouvez vérifier que le processus est bien lancé (voir photo) puis lancer la reception du flux avec une commande : mosquitto_sub -h localhost -t "#" -v (visualisation de tous les flux entrants) les données doivent apparaitre.
Si problèmes, vérifier la cohérence des données de parametrage dans le programme de l'esp. Vous pouvez également vérifier l'activité au niveau du réseau en pistant dans le fichier de log de mosquitto les adresses de la forme 10.3.141.xxx
sudo cat /var/log/syslog | grep 10.3.141

node-red coté pi


Une fois les données bien receptionnées sur mosquitto vous devez installer NODE-RED sur le RASPBERRY et lancer le programme avec la commande : sudo node-red-start il faut être attentif aux commentaires affichés par cette commande. Vous allez pouvoir utiliser l'adresse IP des commentaires pour vous connecter à l'interface graphique de NODE-RED. Pour cela utilisez un "Chrome" ou un "Firefox" sur votre micro ou encore "SAFARY" sur votre IPad.

node-red sur PC


Une fois l'adresse IP recherchée une magnifique interface graphique apparait ! Chapeau bas les développeurs !
Dans la partie gauche les entrées sorties possible, au centre une zone d'édition des contraintes que vous allez pouvoir créer et à droite une zone de commentaire qui peux également servir de zone d'affichage pour la mise au point de scenario.

node-red sur PC


Nous allons donc récupérer dans la partie gauche un pavé mqtt (flux de données) et un pavé debug (pour affichage). On voit sur la partie droite apparaitre nos données, mais pour cela il faut paramètrer l'entrée mqtt ce qui est décrit dans l'écran suivant...

node-red sur PC

Les parametres sont très simple il suffit de mentionner "localhost" (l'adresse de la carte du raspberry mosquitto) et le nom du flux, dans notre cas "ReserveEau". Pour le pavé debug il n'y a rien à paramètrer par contre vous devez relier les deux pavés par une ligne de jonction à l'aide de la souris.
C'est pas cool node-red ! Bon voir les données s'afficher dans un coin de l'écran c'est bien mais on a maintenant envie d'aller un peu plus loin...

node-red et mosquitto

Un petit arrêt sur image permet de voir que toutes les données qui arrivent sur mosquitto dans la fenêtre du Raspberry sont immédiatement disponible sur la fenêtre debug de node-red.

influxdb

Voyons maintenant le programme INFLUXDB que vous aurez chargé précédemment. Celui-ci va nous permettre de créer notre base de données. Au lancement de l'interface SQL il est necéssaire de préciser le rfc3339 afin d'avoir des dates propres ! Le mode SQL est repérable au prompt qui devient le signe ">". Les commandes utilisables ici sont donc des commandes du langage SQL : CREATE, ALTER, DROP, SELECT, SHOW, USE...
Voir les commandes de l'exemple sur l'image, il est possible de créer une base de donnée beaucoup plus évoluée que sur l'exemple qui permettra entre autre de limiter l'enregistrement aux X derniers jours ou mois... voir doc de l'application.

influxdb

Pour disposer du pavé influxdb dans node-red vous devez ajouter la librairie à l'aide du menu en haut à droite de node-red (voir doc node-red). Une fois ceci fait nous allons diriger le flux mqtt vers cette entrée influxdb afin de mémoriser les infos dans la base de données que nous venons de créer.

influxdb

Pour paramétrer ce pavé influxdb il faut préciser l'adresse du serveur (le même que mosquitto dans mon exemple) avec le port IP et le nom de la base de donnée. Il faut également donner l'accès à la base de données avec le login et le mot de passe que vous avez créé.

influxdb graphique

Node-Red permet également d'afficher très facilement des graphiques... On en reparle...



Le code de base qui doit vous permettre de démarrer pour vos propres projets...


// Mesure de profondeur de la cuve d'eau de pluie
// Avril 2019
// Castoo

#include "ESP8266WiFi.h"
#include "PubSubClient.h"
#include "Wire.h"
#include "SSD1306Wire.h"
#include "logo_castoo.h"
// l'adresse I2C (ici 0x3C) peut être différente en fonction du module utilisé
SSD1306Wire  display(0x3c, 4, 5);

const char* box = "raspi-mqtt"; // Nom du ssid du serveur raspberry Mosquitto
const char* m_passe = "xxxxxxxxxxxxxxxx"; // Passe WiFi
const char* mqtt_server = "10.3.141.1"; // Adr de serveur mosquitto
const char* mqtt_user = "admin"; // login sur serveur mosquitto
const char* mqtt_password = "xxxxxxxxxxx"; // Passe sur serveur mosquitto
int counter = 1;
int trigPin = 14;
int echoPin = 12;
char msg_envoye[50];
char str_mesure[15];

WiFiClient espClient; // déclaration Objet wifi
PubSubClient client(espClient); // déclaration objet mosquitto

// ---------------- Affiche barre de progression sur le lcd ---------------
void drawProgressBarDemo() {
	int progress = (counter / 5) % 100;
	display.drawProgressBar(0, 32, 120, 10, progress);
	display.setTextAlignment(TEXT_ALIGN_CENTER);
	display.drawString(64, 15, String(progress) + "%");
}

// ---------------------- Affiche le logo sur le lcd -----------------------
void drawImageLogo() {
    display.drawXbm(1, 1, logo_castoo_width, logo_castoo_height, logo_castoo);
}

// ------------------- Cnx au serveur Raspberry Mosquitto ------------------
void setup_wifi() {
	delay(10);
	WiFi.begin(box, m_passe);
	while (WiFi.status() != WL_CONNECTED) { 
		delay(500); 
	}
	randomSeed(micros());
}

// ----------------------------- Cnx à mosquitto ------------------------
void reconnect() {
  while (!client.connected()) {
    String clientId = "ESP8266CuveEau-";  // Creatation d'un ID aléatoire (identification ESP sur mosquitto)
    clientId += String(random(0xffff), HEX);
    if (!client.connect(clientId.c_str(),  mqtt_user, mqtt_password)) {	delay(5000); }
  }
}

// -------------------------- Mesure de la distance ----------------------
float distanceM(){
	digitalWrite(trigPin, LOW);
	delayMicroseconds(3);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	float tUs = pulseIn(echoPin, HIGH);
	return tUs  / 58.8235;
}

// ---------------- Calcul de la moyenne des mesures --------------------
float moyenneTableau(float tableau[], float tailleTableau){
    float somme=0;
    for(int i=0; i < tailleTableau; i++){
        somme=somme+tableau[i];
    }
	somme = somme / (tailleTableau);
    return somme;
}

void setup(){
	pinMode(trigPin, OUTPUT); // Broche triger en sortie
	pinMode(echoPin, INPUT); // Broche echo en entree
	// initialisation de l'ecran (voir la documentation de la librairie)
	display.init();
	display.flipScreenVertically();
	display.setFont(ArialMT_Plain_24);
	display.setTextAlignment(TEXT_ALIGN_CENTER);
	display.clear();
	drawImageLogo();
	display.display();
	delay(2000);
	setup_wifi(); // cnx wifi
	client.setServer(mqtt_server, 1883); // cnx mosquitto
	delay(2000);
	display.clear();
	counter = 1;
	while(counter < 500){
		drawProgressBarDemo();
		counter = counter+1;
		display.display();
		delay(10);
	}
}

void loop(){
	display.clear();
	float mesure[10];
	float resultat = 0;
	for(int cpt = 0; cpt < 10; cpt++){
		mesure[cpt] = distanceM();
		delay(10);
	}
	resultat = moyenneTableau(mesure, 10);
	snprintf (str_mesure, 50, "P : %d cm", int(resultat));
	display.drawString(64, 22, str_mesure);
	display.display();
	if (!client.connected()) { reconnect(); }
	client.loop();
	snprintf (msg_envoye, 50, "Profondeur %d cm", int(resultat));
	client.publish("ReserveEau", msg_envoye);
	delay(100000);
}
	




Le petit logo CASTOO en téléchargement pour affichage sur le LCD OLED:
Logo CASTOO (fichier logo_castoo.h).

Doc HC-SR04 Lien vers site Gotronic qui met à dispo un document bien fait.

Voilà un petit projet que je devrais pouvoir mettre en oeuvre l'été prochain pour arroser mon jardin en toute quiétude. Dans la version définitive je n'aurai plus besoin de l'écran et l'alimentation se fera par pile rechargée par des petits capteurs solaire (comme sur mon anémomètre). Pour maitriser l'alimentation par pile les données ne seront plus émises qu'une fois toutes les deux heures et le montage s'endormira comme le rends possible l'alimentation maitrisée voir Alim. TPL 5110...
J'espère que si vous ne connaissiez pas MQTT vous aurez l'envie d'en savoir plus, pour cela le mieux est de se rendre sur le site des concepteurs de ces magnifiques applications...

accueil electronique

Bricolage Robotique Informatique Peinture Voyage
Téléc. portail Le robot "mécano" Astuces informatique Henri Bertrou Auvergne
Bat. Iphone 6S Le robot "solaire" Réseau couche app. Jean-Michel Castille Floride
Robot piscine Servo et IR" Réseau Les couches New York
Xiaomi M365 Le robot "thymio" Réseaux Outils L'Ouest américain
Mac Mini Le robot "Rovio" Unités grandeur inf. L'Ile Maurice
Putty SSH Windows L'Italie / Venise
Bases Raspberry Tunisie
Termius IPhone/IPad Grece
Le vieux ZX 81
...
Navigation La Rochelle CNC / Imp3D Electronique Programmation
Rencontre dauphins Les Minimes Construction CNC Alim. TPL 5110 Doc. programme
Analyse NMEA 0183 Le Vieux port CNC du commerce Carte ESP8266 Indent programme
graph. NMEA 0183 L'Ile de Ré Martyr CNC ESP8266 1 relai Prog. objet
Analyse trames AIS A visiter Réa. imp. 3D ESP8266 Alarme Prog. procédurale
Analyse AIS TCP-IP Cura impression 3D ESP8266 MQTT
Sortie en ketch Plateau CR10 ESP8266 Temp.
Echange GPS C80 Anémomètre.
HP Sun-Odyssey CNC / 3D en vrac MCP9808 Librairie
LCD yanmar Saisie Oled
Testeur nmea esp1 i2c