Table des matières

Projets domotique en cours

Sondes températures et autres avec ESP

J'ai testé plusieurs sondes de température :

Description du projet

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.

Liens intéressants

Séquence d'initialisation

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

Changement d'un Id capteur

**[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 -> 

Programme

MeteoJeedom2.ino
/**
   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();
    }
  }
}