/* ESP8266 + DHT22 + webserver + Barriere IR V2 Lesept -- 28/07/2019 & RER -- 15/09/2019 */ #include #include #include #include "DHT.h" #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // NETWORK: Static IP details... IPAddress ip(192, 168, 0, 71); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); // WIFI: const char* ssid = "***"; // Enter SSID here const char* password = "****"; //Enter Password here ESP8266WebServer server(80); // DHT Sensor #define DHTPin 2 // D4; // Initialize DHT sensor. DHT dht(DHTPin, DHTTYPE); float Temperature; float Humidity; unsigned long chronoDHT = 0; unsigned long duration = 5000ul; // timer MAJ condition météo // Barrière #define IRPinext D2 // D2 pour GPIO13 #define IRPinint D1 // D1 pour GPIO14 unsigned int passage = 0; // valeur initiale unsigned int entree = 0; // valeur initiale unsigned int sortie = 0; // valeur initiale unsigned int furtif = 0; // valeur initiale unsigned int eeprom; bool etatE = false; bool etatI = false; unsigned long TCE = 0; unsigned long TCI = 0; unsigned long TRE = 0; unsigned long TRI = 0; unsigned long lastTRE = 0; unsigned long lastTRI = 0; unsigned char etatTRI = 0; // peut avoir comme valeur 0 , 1 , 2 unsigned char etatTRE = 0; // peut avoir comme valeur 0 , 1 , 2 void setup() { Serial.begin(115200); delay(100); pinMode(DHTPin, INPUT); dht.begin(); Serial.println("Connecting to "); Serial.println(ssid); //connect to your local wi-fi network // Static IP Setup Info Here... WiFi.config(ip, gateway, subnet); WiFi.begin(ssid, password); //check wi-fi is connected to wi-fi network while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected..!"); Serial.print("Got IP: "); Serial.println(WiFi.localIP()); server.on("/", handle_OnConnect); server.onNotFound(handle_NotFound); server.begin(); Serial.println("HTTP server started"); chronoDHT = millis(); // pinMode(IRPinext, INPUT_PULLUP); // PULLUP au 5v automatique // pinMode(IRPinint, INPUT_PULLUP); // PULLUP au 5v automatique server.on("/bouton+1", handle_BoutonA); server.on("/bouton-1", handle_BoutonB); server.on("/boutonR", handle_BoutonR); // bouton reset eeprom EEPROM.begin(2); // 2 octets pour le int à sauver eeprom = EEPROM.read(1) * 256 + EEPROM.read(2); entree = eeprom; Serial.print("nombre d'entrée reprise de l'eeprom: "); Serial.println(entree); delay(100); // 38khz pinMode(D5, OUTPUT); } void loop() { server.handleClient(); // 38khz analogWriteFreq(38000); analogWrite(D5, 512); // Affichage T&H sur la console if (millis() - chronoDHT > duration) { chronoDHT = millis(); Temperature = dht.readTemperature(); // Gets the values of the temperature Humidity = dht.readHumidity(); Serial.print("Temperature: "); Serial.println(Temperature); Serial.print("Humidity: "); Serial.println(Humidity); } // Sauvegarde du nombre d'antrée dans l'eeprom si " entrée +10 " eeprom = EEPROM.read(1) * 256 + EEPROM.read(2); if (eeprom + 10 == entree) { EEPROM.write(1, uint8_t(entree / 256)); EEPROM.write(2, uint8_t(entree % 256)); EEPROM.commit(); } // Gestion de la barrière IR int IRE = digitalRead(IRPinext); delay(2); // Pour éviter les rebonds, mais attention, bloque la detection, a reduire avec condo ... int IRI = digitalRead(IRPinint); delay(2); // Pour éviter les rebonds, mais attention, bloque la detection, a reduire avec condo ... if (IRE == LOW && etatE == 0 && etatTRE == 0 ) { //TCE// 1ere coupure IR Extérieure TCE = millis(); etatE = 1; } if (IRE == HIGH && etatE == 1 && etatTRE == 0) { //TRE// 1er rétablissement IR Extérieure TRE = millis(); etatTRE = 1; etatE = 0; } if (IRE == LOW && etatTRE == 1 ) { //last TCE// dernière coupure IR Extérieure etatTRE = 2; } if (IRE == HIGH && etatTRE == 2) { //lastTRE// dernier rétablissement IR Extérieure lastTRE = millis(); TRE = 0; etatTRE = 1; } if (IRI == LOW && etatI == 0 && etatTRI == 0) { //TCI// coupure IR Intérieure TCI = millis(); etatI = 1; } if (IRI == HIGH && etatI == 1 && etatTRI == 0) { //TRI// 1er rétablissement IR Intérieur TRI = millis(); etatTRI = 1; etatI = 0; } if (IRI == LOW && etatTRI == 1) { //lastTCI// dernière coupure IR Extérieure etatTRI = 2; } if (IRI == HIGH && etatTRI == 2) { //lastTRI// dernier rétablissement IR Extérieure lastTRI = millis(); TRI = 0; etatTRI = 1; } //--------------------------------------// if (IRE && IRI && (millis() - TRE - lastTRE) > 1000 && (millis() - TRI - lastTRI) > 1000 && (TRE + lastTRE) > 0 && ((TRI + lastTRI) > 0 )) { //Serial.print("TCE "); //Serial.println(TCE); //Serial.print("TCI "); //Serial.println(TCI); //Serial.print("TRE "); //Serial.println(TRE); //Serial.print("TRI "); //Serial.println(TRI); //Serial.print("lastTRE "); //Serial.println(lastTRE); //Serial.print("lastTRI "); //Serial.println(lastTRI); if (TCE > TCI) { // cycle sortant if ((TRE + lastTRE) > (TRI + lastTRI)) { // oiseau sorti Serial.println("oiseau sorti"); Serial.print("Passage +1 : "); passage++; sortie++; Serial.println(passage); TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } else if ( (TRI + lastTRI) > (TRE + lastTRE)) { // oiseau regarde dehors et rerentré Serial.println("oiseau regarde dehors et rerentré"); TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } } else if (TCI > TCE ){ // cycle entrant if ( (TRI + lastTRI) > (TRE + lastTRE)){ // oiseau rentré Serial.println("oiseau rentré"); Serial.print("Passage +1 : "); passage++; entree++; Serial.println(passage); TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } else if ( (TRE + lastTRE) > (TRI + lastTRI)) { // oiseau regarde dedans et repart Serial.println("oiseau regarde dedans et repart (furtif +1)"); furtif++; TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } } } else { if ( etatTRE == 1 && TCI == 0 && (millis() - TRE) > 2000) { // oiseau passé à l'extérieur Serial.println("oiseau passé à l'extérieur (furtif +1)"); furtif++; TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } else if ( etatTRI == 1 && TCE == 0 && (millis() - TRI) > 2000) { // oiseau passé à l'intérieur Serial.println("oiseau passé à l'intérieur"); TRE = 0; TRI = 0; TCE = 0; TCI = 0; lastTRE = 0; lastTRI = 0; etatTRI = 0; etatTRE = 0; } } } //-----------------// void handle_OnConnect() { Temperature = dht.readTemperature(); // Gets the values of the temperature Humidity = dht.readHumidity(); // Gets the values of the humidity server.send(200, "text/html", SendHTML(Temperature, Humidity)); } void handle_NotFound() { server.send(404, "text/plain", "Not found"); } void handle_BoutonA() { if (entree > 0) entree++; // augmente le nombre d'entree handle_OnConnect(); // Mettre la page web à jour } void handle_BoutonB() { if (entree > 0) --entree; // diminue le nombre d'entree handle_OnConnect(); // Mettre la page web à jour } void handle_BoutonR() { // remets 0 à l'eeprom EEPROM.write(1, uint8_t(0)); EEPROM.write(2, uint8_t(0)); EEPROM.commit(); eeprom = EEPROM.read(1) * 256 + EEPROM.read(2); handle_OnConnect(); // Mettre la page web à jour } String SendHTML(float Temperaturestat, float Humiditystat) { String ptr = " \n"; ptr += "\n"; ptr += "ESP8266 Nichoir connecté\n"; ptr += "\n"; ptr += "\n"; ptr += "\n"; ptr += "
\n"; ptr += "

ESP8266 Nichoir connecté

\n"; ptr += "

"; ptr += entree; ptr += "

"; ptr += "

"; ptr += (int)Temperaturestat; ptr += "°C"; ptr += "

"; ptr += "

"; ptr += (int)Humiditystat; ptr += "%

"; ptr += "

_"; ptr += "

"; ptr += "

Entrées: "; ptr += entree; ptr += "

"; ptr += "

Sorties: "; ptr += sortie; ptr += "

"; ptr += "

Passages: "; ptr += passage; ptr += "

"; ptr += "

va & viens: "; ptr += passage / 2; ptr += "

"; ptr += "

furtif: "; ptr += furtif; ptr += "

"; ptr += "

Valeur eeprom: "; ptr += eeprom; ptr += "

"; ptr += "

"; ptr += "

"; ptr += "

"; ptr += "
\n"; ptr += "\n"; ptr += "\n"; return ptr; }