Projet Station Météo Pro : nouvelle sonde pour l’abri jardin
J’ai rapidement constaté quelques problèmes avec mon cable de 70m et ma sonde DS18b20. J’ai décidé de faire une sonde wifi avec un capteur plus précis. Explications.
Problème de longueur
Comme décrit dans l’article précédent, je me suis fait avoir sur la longueur du protocole i2c qui ne supporte pas plus de 50cm de câble … J’étais mal barré avec mes 70 mètres 🙂
J’ai donc essayé des sondes DS18b20, mais je me suis heurté très rapidement aux problèmes de distance aussi : des écarts de valeurs dans la même minute, des ratés de mesure, … bref le résultat était tout aussi décevant.
Une sonde wifi
Mais le câble n’était pas perdu pour autant. Il m’a servi d’alimentation pour la sonde wifi. Je suis parti sur un Wemos D1 mini pro, avec antenne externe. Je l’ai couplé à une sonde SHT31, la meilleure qui existe. Je lui ai donc mis un câble de 50cm pour avoir une bonne stabilité.
J’ai raccordé l’extrémité du câble à mon alimentation 12V qui sert pour la station météo. Mais le wemos D1 mini pro tourne en 5V. Je lui ai donc collé un régulateur de tension 12V-5V pour plus de stabilité.
Pour le câblage c’est extrêmement simple. En i2c, on a 4 fils :
- 5V
- GND
- SCL (D1)
- SDA (D2)
J’ai utilisé le principe du deep sleep pour faire des cycles de 20 sec. Ainsi, le wemos reboote toutes les 20 sec et exécute le code pour envoyer les données. Ne pas oublier, une fois le code chargé, de relier les bornes D0 et RST pour que le deep sleep fonctionne (voir ici).
Code source
Le code est lui aussi somme toute très simple. On se connecte au wifi, on récupère les valeurs du SHT31 et on appelle le webservice de la station météo.
Attention : pour pouvoir communiquer avec le wemos D1 mini pro, il faut installer le driver spécifique CP210 sur son PC/Mac. Vous pouvez le trouver ici : https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
/*
Station Meteo Pro - sonde de temperature déportée
avec :
- Wemos D1 mini pro (drivers : //https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
- SHT31
Le programme récupère la température et l'humidité et l'envoie en wifi sur le serveur :
Source : https://www.sla99.fr
Site météo : https://www.meteo-four38.fr
Date : 2019-11-22
Changelog :
22/11/2019 v1 version initiale
*/
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_SHT31.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "xxxxx";
const char* password = "xxxx";
Adafruit_SHT31 sht31 = Adafruit_SHT31();
char server[] = "192.168.1.2";
WiFiClient client;
String KEY_WS="546766543445677";
void setup() {
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
//démarrage SHT31
if (! sht31.begin(0x44)) {
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
double temp = sht31.readTemperature();
double hum = sht31.readHumidity();
Serial.print(temp);
Serial.print(" ");
Serial.println(hum);
String url = "/stationmeteo/temp.php?key="+KEY_WS+"&temp="+String(temp)+"&hum="+String(hum);
HTTPClient http;
String Link = "http://192.168.1.2:81"+url;
http.begin(Link);
int httpCode = http.GET();
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
http.end();
Serial.println("Going into deep sleep for 20 seconds");
ESP.deepSleep(20e6);
}
void loop() {
}
Tout le code de la station se trouve sur github : https://github.com/doddyfab/Arduino_StationMeteoPro
Traitement de la données
Sur mon synology, l’url http://192.168.1.2:81/stationmeteo/temp.php est appelé. Ce script php génère un fichier texte avec les valeurs.
<?php
$REFKEY = '546766543445677';
if(isset($_GET['key'])){
$key = $_GET['key'];
if($key == $REFKEY){
if(isset($_GET['temp'])){
$temp = $_GET['temp'];
$hum = $_GET['hum'];
$file = 'temp.txt';
$line = $temp.';'.$hum;
file_put_contents($file, $line);
echo 'data added to '.$file;
}
}
else{
echo 'Mauvaise clé utilisée';
}
}
else{
echo 'Erreur formatage URL';
}
?>
L’autre script appelé par la station météo récupère le contenu du fichier en lieu et place des valeurs de température et humidité de la sonde du toit. Le reste est inchangé.
Voici donc ce que ca donne au niveau architecture de la station avec ce nouveau module
Conclusion
A voir sur le long terme, mais une sonde de qualité dans un abri de qualité, on devrait se rapprocher de valeurs réelles acceptables pour nous, passionnés de météo !
Edit du 03/12/2019
Dès les premières températures négatives, je me suis retrouvé avec des valeurs de températures de 42949672. Je suis devenu fou en ne comprenant pas pourquoi … il s’avère que le capteur est un SHT31-D … le modèle -D n’accepte que des températures de 0 à 90°C … Le SHT31-A accepte lui des températures de -40°C à +125°C. La description Amazon était donc trompeuse et je me suis fait avoir !
Bref, pour ne pas m’avouer vaincu, je suis reparti avec un capteur DHT22. Le cablage est simple. Data sur D2 (= GPIO4), VCC 5V et GND). Il faut ajouter une résistance de 2,2Kohm entre data et vcc.
Ensuite, il faut utiliser la librairie DHTesp, faite exprès pour les ESP8266. Le code est après très simple, le voici :
/*
Station Meteo Pro - sonde de temperature déportée
avec :
- Wemos D1 mini pro (drivers : //https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
- DHT22
Le programme récupère la température et l'humidité et l'envoie en wifi sur le serveur :
Source : https://www.sla99.fr
Site météo : https://www.meteo-four38.fr
Date : 2019-12-03
Changelog :
03/12/2019 v1 version initiale
*/
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "DHTesp.h"
#include <ESP8266HTTPClient.h>
const char* ssid = "xxxxx";
const char* password = "xxxxx";
DHTesp dht;
char server[] = "192.168.1.2";
WiFiClient client;
String KEY_WS="134567654345670012";
void setup() {
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
dht.setup(4, DHTesp::DHT22); // Connect DHT sensor to GPIO2
delay(dht.getMinimumSamplingPeriod());
float hum = dht.getHumidity();
float temp = dht.getTemperature();
Serial.print(temp);
Serial.print(" ");
Serial.println(hum);
String url = "/stationmeteo/temp.php?key="+KEY_WS+"&temp="+String(temp)+"&hum="+String(hum);
HTTPClient http;
String Link = "http://192.168.1.2:81"+url;
http.begin(Link);
int httpCode = http.GET();
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
http.end();
Serial.println("Going into deep sleep for 20 seconds");
ESP.deepSleep(20e6);
}
void loop() {
}
Le code est dispo sur Github.
Après quelques finitions, tout est remis en boite et fonctionnel ! Reste à me battre avec le vendeur Amazon … mais ca c’est une autre histoire !
Edit 10/01/2021
J’ai acheté un SHT35 pour améliorer la précision. Et j’ai eu le même problème avec les températures négatives !! Mais le problème vient de la bibliothèque, pas du capteur !!!! Voici l’article sur sa mise en oeuvre et la bonne bibliothèque à utiliser !
Bonjour,
Voila plusieurs applis (tutos pour moi) que je consulte sur votre site avec beaucoup d’intérêt car ils sont très bien documentés donc parfaitement compréhensibles;
Je m’amuse de mon coté a concevoir une balance connectée pour 1 ruche que j’ai au fond du jardin (70 m). Je voudrais stocker les mesures (6 mesures /jour) sous forme de fichier CSV dans la memoire SPIFFS de l’ESP8266 ESP12 pour ensuite les recuperer par WIFi sur demande de mon PC tous les 2 ou 3jours, mais je bute sur le formatage des données (Date, heure, min, sec,poids, temperature,humidité).Comment faire ?? est ce que JSON conviendrait ?
Encore merci de vos demos et conseils.
alain.sisteron
Bonjour Alain, et merci pour votre retour positif 🙂 J’essaye d’expliquer au mieux et ce n’est pas toujours simple.
Pour le format, je stockerais plutôt en format CSV, surtout si il y a peu de données par ligne. Ca fait 1 ligne par mesures soit 6 lignes par jour, c’est assez économique.
Par contre, la restitution faite par l’ESP8266 peut se faire en JSON (quand votre pc viendra l’interroger) et c’est bien plus facile pour récupérer les valeurs en effet. Restera à post-traiter les données récupérer et faire le ménage dans la mémoire de votre ESP8266 une fois que la récupération sera validée (acquittement).
N’hésitez pas si je peux vous aider, ou si vous avez d’autres questions, c’est avec plaisir.
Fabien
Bonjour,
Merci pour votre réponse et les conseils qui vont avec. Est ce que dans vos projets vous envisagez de remplacer la connexion permanente par une connexion a la demande, ce qui évite une liaison permanente (les abeilles n’aiment sans doute pas baigner dans les ondes Wifi) et aussi l’utilisation d’un serveur ( base de données).
Encore bravo pour vos réalisations super intéressantes.
Alain
Bonsoir Alain,
Le deep sleep est bien une connexion à la demande, qui est « timée ». L’ESP est quasi éteint quand il ne travaille pas.
Si l’on veut que l’arduino soit en écoute et être déclenché à la demande, il doit etre connecté au wifi (voir MQTT sur le poele à granulé).
Sinon, il faut déclencher le reveil de l’ESP via un composant externe genre capteur de luminosité et qui lancera l’ESP pour une séquence définie.
Bonjour,
J’ai essayé le code utilisant le DHT22 avec un ESP12. Il fonctionne tres bien mais pour avoir le reveil apres 20 sec; il faut relier D0 et RST.