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

Wemos D1 mini pro

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

Alimentation 12V rail din (image : https://www.planete-domotique.com)

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.

Le wemos avec le regulateur dans une boite plexo

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+"&amp;temp="+String(temp)+"&amp;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

Architecture station météo

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+"&amp;temp="+String(temp)+"&amp;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 !

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.