======Projets domotique en cours======
=====Sondes températures et autres avec ESP=====
J'ai testé plusieurs sondes de température :
* [[CAP180|BMP 180]] (+ pression) - La plus précise
* [[CAP367|DS18B20]] - (+0.5)
* [[CAP548|DTH11]] (+ humidité) - (+1.5 à +2)
{{ :meteo_exterieur_bb.png?400 |}}
=====Description du projet=====
Un ESP 8266 récupère les informations de :
* Température DS18B20
* Température DTH11
* Humidité DTH11
* Pression BMP180
* Température BMP180
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====
* [[https://www.maison-et-domotique.com/69216-gestion-chauffage-central-avec-jeedom/]]
* [[https://www.electrotoile.eu/jeedom_planifier_tache.php]]
* [[https://blog.domadoo.fr/guides/plugin-thermostat-jeedom-controle-total-chauffage/]]
====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=====
/**
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
// Paramètres WiFi
#include
#include
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
#include
#define PIN_DS18B20 2 // Pin pour capteur Tmp
OneWire oneWire(PIN_DS18B20);
DallasTemperature sensors(&oneWire);
int virtualDS18B20 = 30;
// Paramètres DHT11
#include
#include
#include
#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
#include
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();
}
}
}