Introduction
Ce montage permet de surveiller l’humidité de la terre de votre plante préférée, en permanence. Le micro-processeur se réveille quelques secondes par heure, il lit la valeur du capteur d’humidité et l’envoie sur la box eedomus. Le reste du temps, il « dort », pour ne pas consommer d’énergie. Il est alimenté par une batterie qui assure plus d’une année d’autonomie, avec une seule recharge.
Il y a bien sûr le module Koubachi ou le Parrot Flower, mais bon, ce montage, certes un peu plus rudimentaire, revient à environ 5€ !
Cette solution se base sur le matériel suivant
• Un module « NodeMCU ESP8266 », acheté sur Wish pour 3€
• Une sonde « Capacitive Soil Moisture Sensor v1.2 », achetée sur AliExpress, pour environ 1$
• Une batterie 9800mAh 3.7V 18650 Lithium ion batteries Rechargeable, AliExpress, pour environ 1.5$ (5.97$ pour 4 pièces)
• Un socle pour la batterie, AliExpress, 0.57$
• Et un petit boitier plastique
Le NodeMCU ESP8266
Pour mettre en route l’environnement de développement pour le NodeMCU ESP8266, je me suis basé sur les mini tutos que vous trouverez à cette adresse :
https://easycoding.tn/index.php/nodemcu/
La mise en œuvre est simple et rapide : en moins d’une heure, je pouvais déjà actionner la led interne du NodeMCU, et une heure plus tard, je pouvais faire la même chose, mais par Wifi. Bref, c’est un module assez impressionnant.
La sonde « Capacitive Soil Moisture Sensor v1.2 »
Il existe plusieurs types de sondes, mais il est important de bien acheter ce modèle, selon les tests effectués par Andreas Spiess (voir la référence ci-dessous)
Spécifications
• Operating Voltage: 3.3 ~ 5.5 VDC
• Output Voltage: 0 ~ 3.0VDC
• Operating Current: 5mA
Cette sonde est connectée par 3 pins sur le NodeMCU : Ground, VCC et A0, A0 délivrant une tension proportionnelle à l’humidité mesurée.
Important : Si le NodeMCU peut bien être mis en « deep sleep », et ne consommer que peu dans ce mode, il faut trouver une solution pour que la sonde soit aussi coupée entre les mesures. Pour cela, voici ma solution un peu, je l’admets, osée, mais ça fonctionne si bien : afin de couper l’alimentation du module de la sonde, je l’alimente directement depuis un GPIO !
Au niveau du courant : selon les spécifications, la sonde consomme 5mA. Le NodeMCU ESP8266 est capable de délivrer 12mA par GPIO. Donc, c’est OK !
Au niveau de la tension : Le NodeMCU délivre environ 2.8V, ce qui est au-dessous des 3.3V demandé par la sonde. Cette sonde fonctionne avec un circuit TL555C. Les spécifications de ce circuit indiquent un VCC minimum de 2V. Donc, avec nos 2.8V, on est couvert ! Mais attention, il faut calibrer correctement, car évidemment les tensions min/max produites par la sonde sur la pin A0 sont différentes si la sonde est alimentée en 5V ou en 2.8V.
Calibration : Les mesures donne, complètement à sec et dans un verre d’eau :
5V
• Au sec: 845mV
• Dans l’eau: 415mV
2.8V
• Au sec: 560mV
• Dans l’eau: 260mV
Le programme calcule simplement une valeur de 0 à 10, 0 étant sec et 10 étant « dans l’eau ». La variable « Humidité » contient donc 0 à 10. La formule est la suivante :
Humidité =Round( (TensionMaxSec - ValeurLue) * 10/TensionMinHumide)
Le deep-sleep
Le NodeMCU, en mode deep-sleep, peut être réveillé pour un événement externe ou un timer interne qui continue à fonctionner pendant le deep-sleep. Pour utiliser ce timer, il faut connecter la pin D0 (GPIO16) sur la pin RST.
Le programme
Le programme fonctionne ainsi
• Se réveille toutes les heures par le timer interne
• Se connecte sur le WiFi
• Prends 10 mesures, toutes les 30ms
• Calcule la valeur moyenne avec ces 10 échantillons
• Envoie l’information à la box eedomus
• S’endort (deep-sleep), en coupant l’alimentation de la sonde, pour une heure
- Code : Tout sélectionner
/*
[Description]
Pilot the Humidity sensor "Moisture Sensor V1.2
Sleep on hour, then wake up, send the info to the eedomus
[Version] Version 1.0 - CEN, December 2018
[IP] 192.168.0.50
[Last update] 10.12.2018
*/
//Definition of the pins
#define Pin_Analog A0
#define Power 12 //GPIO12 =D6 Power for the probe module
//Si alimenté par USB
//#define TensionMaxSec 845.0
//#define TensionMinHumide 415.0
//Si alimenté par GPIO12
#define TensionMaxSec 560.0
#define TensionMinHumide 260.0
#include "MyCredentials.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//For debug purpose, compiler commands
#define DEBUG //Comment this line to remove all debug lines
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
//Update "MyCredendials or specify here
//const char* ssid = "XXXX"; //WiFi ID
//const char* password = "XXXX"; //WiFi PWD
//Static IP, Gateway, Subnet and Hostname
IPAddress staticIP (192,168,0,50);
IPAddress gateway (192,168,0,1);
IPAddress subnet(255,255,255,0);
const char* Chostname = "ThierryPlant1";
//Variables
HTTPClient http; //Declare an object of class HTTPCLient
int httpCode;
int WiFiConnectionCount = 0; //Number of reconnection to the WiFi network
float ProbeValue;
int Humidity;
String s; //Contain http answer
//eedomus information
//On eedomus, create "Etat": Nom=HumidityPlant, Usage Autre capteur, Pièce Séjour, Unité=Humidité, Type de donnée=Nombre décimal
//Dans paramètres experts de cet "Etat", récupérer le code API (7 chiffres-AAAAAAA)
//Récupérer l'adresse IP de la box eedomus (XXX.XXX.XXX.XXX)
//L'authentification sur eedomus se fait avec un api_user et un api_secret, à récupérer depuis "Mon compte" du portail eedomus.
//L'api_user (6 caractères-BBBBBB) et l'API secret (16 caractères-CCCCCCCCCCCCCCCC)
//La valeur a envoyé se trouve dane le paramètre "Value="-ZZ
//==>http://XXX.XXX.XXX.XXX/api/set?action=periph.value&periph_id=AAAAAAA&value=ZZ"&api_user=BBBBBB&api_secret=CCCCCCCCCCCCCCCC;
//Update "MyCredendials or specify here
//const char* eedomusH= "http://XXX.XXX.XXX.XXX/api/set?action=periph.value&periph_id=AAAAAAA&value=";
//const char* eedomusF= "&api_user=BBBBBB&api_secret=CCCCCCCCCCCCCCCC";
void setup() {
pinMode(Power,OUTPUT); //Power on the probe module
digitalWrite(Power,1);
Serial.begin(115200); delay(10); //Debug serial line
//Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
delay(500); //Wait 500ms to be sure that the probe module is ready before we read value
}
void loop() {
//////////////////////////////////////////////////
//Pull the Humidity probe, take 10 sample every 50ms and calculate the average
//////////////////////////////////////////////////
ProbeValue=0;
for(int i=0;i<10;i++) { //Take 10 samples
ProbeValue=ProbeValue+analogRead(Pin_Analog);
delay(50);
}
ProbeValue=ProbeValue/10; //Take the average
DEBUG_PRINT("Value read from the probe: ");DEBUG_PRINTLN(ProbeValue);
Humidity=round((TensionMaxSec-ProbeValue)*(10.0/TensionMinHumide)); //Round it to a scale 0 to 10
if (Humidity<0) Humidity= 0;
if (Humidity>10) Humidity=10;
DEBUG_PRINT("Humidity, Scale 0 to 10: ");DEBUG_PRINTLN(Humidity);
//////////////////////////////////////////////////
//Send the information to the eedomus box
//////////////////////////////////////////////////
s=eedomusH + String(Humidity) + eedomusF; //s contains the http string to be sent
http.begin(s);
httpCode = http.GET(); //Send
http.end(); //Close connection
DEBUG_PRINT("s= ");DEBUG_PRINTLN(s);
//////////////////////////////////////////////////
//Deep sleep for 1h
//////////////////////////////////////////////////
digitalWrite(Power,0); //Stop power on the module. This is probably not needed
//ESP.deepSleep(20000000,WAKE_RF_DEFAULT); //Sleep for 20sec for debug purpose
ESP.deepSleep(3690000000+145*1000000,WAKE_RF_DEFAULT); //Deep sleep for 1h (3600000000). To be more or less at 1h, I have added 145
delay(1000);
DEBUG_PRINTLN("If you read this, Deep sleep doesn't work");
}
Le schéma électronique
La configuration eedomus
• Création d'un état virtuel
o Nom: HumidityPlant1
o Usage : Autre capteur
o Pièce: Séjour
o Unité : Humidité
o Type de donnée : Nombre décimal
• Dans paramètres experts de cet "Etat", récupérer le code API (7 chiffres-AAAAAAA)
• Récupérer l'adresse IP de la box eedomus (XXX.XXX.XXX.XXX)
• L'authentification sur eedomus se fait avec un api_user et un api_secret, à récupérer depuis "Mon compte" du portail eedomus.
• L'api_user (6 caractères-BBBBBB) et l'API secret (16 caractères-CCCCCCCCCCCCCCCC)
• La valeur a envoyer se trouve dans le paramètre "Value="-ZZ
• ==>http://XXX.XXX.XXX.XXX/api/set?action=periph.value&periph_id=AAAAAAA&value=ZZ"&api_user=BBBBBB&api_secret=CCCCCCCCCCCCCCCC;
• Choisir une bonne icone pour cet état
Le boitier
Simplement dans une petite boite plastique que je laisse pendre derrière le pot
Références
• Le choix de la bonne sonde par l’excellent Andreas Spiess : https://www.youtube.com/watch?v=udmJyncDvw0
• Le mode « Deep sleep », par l’excellent toujours Andreas Spiess : https://www.youtube.com/watch?v=6SdyImetbp8
• Spécifications de la sonde : https://www.dfrobot.com/wiki/index.php/ ... KU:SEN0193