J'ai testé plusieurs sondes de température :
Un ESP 8266 récupère les informations de :
et les transmet aux capteurs virtuels d’une box Jeedom toute les 3 secondes.
La connexion se fait en WiFi au travers de points d’accès préalablement enregistrés.
Les id des capteurs virtuels sont configurable sur la console série via un menu.
La configuration est sauvegardée en EEPROM.
22:07:18.792 -> r$ $⸮⸮⸮#⸮$⸮|##⸮#l⸮##|⸮⸮#⸮ 22:07:19.667 -> 22:07:19.667 -> ==Boot== 22:07:19.667 -> Id des capteurs virtuels 22:07:19.667 -> virtualDS18B20 = 30 22:07:19.667 -> virtualDHT11TMP = 32 22:07:19.667 -> virtualDHT11HUM = 33 22:07:19.667 -> virtualBMP180TMP = 41 22:07:19.667 -> virtualBMP180PRE = 42 22:07:19.667 -> 22:07:19.667 -> Connexion au WiFi 22:07:19.667 -> WiFi connecte : Livebox-3B58 22:07:19.667 -> Adresse IP du module ESP : 192.168.1.15 22:07:19.667 -> Adresse IP du point d'accès : 192.168.1.1 22:07:19.667 -> 22:07:19.667 -> ---------- 22:07:19.667 -> connexion au serveur : 192.168.1.8 22:07:19.667 -> POST Device 30 value -127.00 22:07:19.667 -> POST Device 32 value 26.30 22:07:19.667 -> POST Device 33 value 95.00 22:07:19.667 -> POST Device 41 value 25.00 22:07:19.667 -> POST Device 42 value 1015.00 22:10:19.135 ->
**[ENTREE]** 22:36:55.119 -> ===== Curent config (saut de ligne) ===== 22:36:55.119 -> virtualDS18B20 = 30 22:36:55.119 -> virtualDHT11TMP = 32 22:36:55.119 -> virtualDHT11HUM = 33 22:36:55.119 -> virtualBMP180TMP = 41 22:36:55.119 -> virtualBMP180PRE = 42 22:36:55.119 -> 22:36:55.119 -> W = Write config 22:36:55.119 -> Q = Quit config 22:36:55.119 -> L = List config 22:36:55.119 -> 1 xxxxx = id virtualDS18B20 22:36:55.119 -> 2 xxxxx = id virtualDHT11TMP 22:36:55.119 -> 3 xxxxx = id virtualDHT11HUM 22:36:55.119 -> 4 xxxxx = id virtualBMP180TMP 22:36:55.119 -> 5 xxxxx = id virtualBMP180PRE 22:36:55.119 -> **1 20[ENTREE]** 22:37:32.059 -> data = 49 value = 20 22:37:32.059 ->
/** Sonde météo La sonde peut gérer : - un capteur DS18B20 (temp) - un capteur DHT11 (temp et humi) Les PINs dédiées sont fixes mais les capteurs virtuels programmables Les paramètres du serveur sont aussi programmables @version 0.1 du 09/02/2019 @author Morceau Jean-Louis @copyright CC0 1.0 Universal */ #include <EEPROM.h> // Paramètres WiFi #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> ESP8266WiFiMulti wifiMulti; WiFiClient client; const char* host = "192.168.1.8"; const int httpPort = 80; const String apiKey = "*******************************"; #define httpSuite "Connection: Keep-Alive\r\n\r\n" #define httpStop "Connection: close\r\n\r\n" // Paramètres DS18B20 #include <OneWire.h> #include <DallasTemperature.h> #define PIN_DS18B20 2 // Pin pour capteur Tmp OneWire oneWire(PIN_DS18B20); DallasTemperature sensors(&oneWire); int virtualDS18B20 = 30; // Paramètres DHT11 #include <DHT.h> #include <DHT_U.h> #include <Adafruit_Sensor.h> #define PIN_DHT 0 // Digital pin connected to the DHT sensor #define TYPE_DTH DHT11 // DHT 11 DHT_Unified dht(PIN_DHT, TYPE_DTH); uint32_t delayDHT; int virtualDHT11TMP = 32; int virtualDHT11HUM = 33; // Bibliothèque pour capteur BMP180 #include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; #define SCL 5 #define SDA 4 int virtualBMP180TMP = 41; int virtualBMP180PRE = 42; // variables byte high, low, data, digit; unsigned long previousMillis = 0; const long interval = 180000; // Toutes les 3 minutes int readEeprom (int adresse) { high = EEPROM.read(adresse); //read the first half low = EEPROM.read(adresse + 1); //read the second half return (high << 8) + low; //reconstruct the integer } void writeEeprom () { int vers = EEPROM.read(0) + 1; EEPROM.write(0, vers); EEPROM.write(1, highByte(virtualDS18B20)); EEPROM.write(2, lowByte(virtualDS18B20)); EEPROM.write(3, highByte(virtualDHT11TMP)); EEPROM.write(4, lowByte(virtualDHT11TMP)); EEPROM.write(5, highByte(virtualDHT11HUM)); EEPROM.write(6, lowByte(virtualDHT11HUM)); EEPROM.write(7, highByte(virtualBMP180TMP)); EEPROM.write(8, lowByte(virtualBMP180TMP)); EEPROM.write(9, highByte(virtualBMP180PRE)); EEPROM.write(10, lowByte(virtualBMP180PRE)); EEPROM.commit(); } void setup() { // initialisation du port série Serial.begin(115200); delay(200); Serial.println("\n\n==Boot=="); //Serial.setDebugOutput(true); //Lecture eeprom EEPROM.begin(512); /*if (! EEPROM.read(0)) Serial.println ("EEPROM vide"); else { virtualDS18B20 = readEeprom (1); virtualDHT11TMP = readEeprom (3); virtualDHT11HUM = readEeprom (5); virtualBMP180TMP = readEeprom (7); virtualBMP180PRE = readEeprom (9); }*/ Serial.println ("Id des capteurs virtuels"); Serial.print ("virtualDS18B20 = "); Serial.println (virtualDS18B20); Serial.print ("virtualDHT11TMP = "); Serial.println (virtualDHT11TMP); Serial.print ("virtualDHT11HUM = "); Serial.println (virtualDHT11HUM); Serial.print ("virtualBMP180TMP = "); Serial.println (virtualBMP180TMP); Serial.print ("virtualBMP180PRE = "); Serial.println (virtualBMP180PRE); Serial.println(); // initialisation de la connexion wifi wifiMulti.addAP("Livebox-3B58", "***************"); wifiMulti.addAP("MILLAU_LAB", "***************"); wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); connectWifi (); // Initialisation du capteur de DS18B20 sensors.begin(); // Initialisation DHT11 dht.begin(); sensor_t sensor; delayDHT = sensor.min_delay / 1000; // Initialisation BMP180 //Wire.begin(SDA, SCL); if (!bmp.begin()) Serial.println("BMP180 introuvable ! Verifier le branchement "); } /** Connection au wifi */ void connectWifi() { // on affiche le wifi sur lequel on veut se connecter Serial.print("Connexion au WiFi "); while (wifiMulti.run() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); // on affiche les paramètres Serial.print("WiFi connecte : "); Serial.println(WiFi.SSID()); Serial.print("Adresse IP du module ESP : "); Serial.println(WiFi.localIP()); Serial.print("Adresse IP du point d'accès : "); Serial.println(WiFi.gatewayIP()); } /** Contrôle et relance de la connexion wifi */ void testWifi() { if (wifiMulti.run() != WL_CONNECTED) { Serial.println("Connetion WiFi perdu."); WiFi.disconnect(); connectWifi(); } } /** Envoie d'une requette HTTP POST au serveur @param idDevice Id du capteur virtuel @param value Valeur à transmettre @param mode Fin de la connexion */ void setHttpData (int idDevice, float value, bool mode) { String data = "/core/api/jeeApi.php?apikey=" + apiKey; data += "&plugin=virtual&type=virtual&id=" + String(idDevice); data += "&value=" + String(value); String header = String("POST ") + data + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + (mode ? httpStop : httpSuite); client.print(header); Serial.print ("POST Device "); Serial.print (idDevice); Serial.print (" value "); Serial.println (value); //Serial.println (header); } void loop() { // Gestion de l'attente unsigned long currentMillis = millis(); if ((previousMillis == 0) || (currentMillis - previousMillis >= interval)) { previousMillis = currentMillis; // On vérifie que la connexion est ok, sinon on passe en mode erreur Serial.print("\n----------\nconnexion au serveur : "); Serial.println(host); if (!client.connect(host, httpPort)) { Serial.println("La connexion avec le serveur a échouée."); testWifi(); } // Envoi de la température DS18B20 sensors.requestTemperatures(); // Send the command to get temperatures float temp = sensors.getTempCByIndex(0); // We use the function ByIndex. Get the temperature from the first sensor only. setHttpData (virtualDS18B20, temp, false); // Envoi des infos DHT11 sensors_event_t event; dht.temperature().getEvent(&event); if (isnan(event.temperature)) Serial.println(F("Error reading temperature!")); else setHttpData (virtualDHT11TMP, event.temperature, false); dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) Serial.println(F("Error relative humidity!")); else setHttpData (virtualDHT11HUM, event.relative_humidity, false); // Envoi des infos BMP180 setHttpData (virtualBMP180TMP, bmp.readTemperature(), false); setHttpData (virtualBMP180PRE, bmp.readSealevelPressure(378) / 100, false); // vider le fuffer reception //delay(1000); //while(client.available()) client.readStringUntil('\r'); } // Modification de la configuration if (Serial.available() > 0) { delay(200); while (Serial.available() > 0) Serial.read(); newConfig (); } } /** Affiche les infos de configuration */ void listConfig () { Serial.println (); Serial.println ("===== Curent config (saut de ligne) ====="); Serial.print ("virtualDS18B20 = "); Serial.println (virtualDS18B20); Serial.print ("virtualDHT11TMP = "); Serial.println (virtualDHT11TMP); Serial.print ("virtualDHT11HUM = "); Serial.println (virtualDHT11HUM); Serial.print ("virtualBMP180TMP = "); Serial.println (virtualBMP180TMP); Serial.print ("virtualBMP180PRE = "); Serial.println (virtualBMP180PRE); Serial.println (); Serial.println (" W = Write config"); Serial.println (" Q = Quit config"); Serial.println (" L = List config"); Serial.println (" 1 xxxxx = id virtualDS18B20"); Serial.println (" 2 xxxxx = id virtualDHT11TMP"); Serial.println (" 3 xxxxx = id virtualDHT11HUM"); Serial.println (" 4 xxxxx = id virtualBMP180TMP"); Serial.println (" 5 xxxxx = id virtualBMP180PRE"); Serial.println (); } /** Lit l'ID du capteur demandé @return ID */ int getCongig () { digit = Serial.read(); // Caractère vide int val = Serial.parseInt(); Serial.print(" value = "); Serial.println(val); return val; } /** Mise à jour de la config */ void newConfig () { listConfig (); data = 'X'; while (data != 'Q') { if (Serial.available() > 0) { data = Serial.read(); // cmd Serial.print("data = "); Serial.print(data); switch (data) { case 'L': listConfig (); break; case 'Q': Serial.print (" Quitter la config"); break; case 'W': Serial.print (" Sauvegarder la config"); break; // writeEeprom(); case '1': virtualDS18B20 = getCongig (); break; case '2': virtualDHT11TMP = getCongig (); break; case '3': virtualDHT11HUM = getCongig (); break; case '4': virtualBMP180TMP = getCongig (); break; case '5': virtualBMP180PRE = getCongig (); break; default: Serial.println (" Cmd inconnue"); } do { digit = Serial.read(); } while ((Serial.available() > 0) && (digit != '\n')); Serial.println(); } } }