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