lesept:
OK, mais qu'as-tu commandé ?
Voici une mise à jour avec un début de traitement de la barrière. Mon idée est que si un oiseau coupe la barrière IR, il peut rester un certain temps devant la barrière voire passer devant plusieurs fois avant de se décider à entrer ou sortir. Donc, j'ai (essayé) mis une temporisation d'une seconde pendant laquelle j'attends de voir s'il l'oiseau coupe la barrière : s'il n'y a pas de coupure après ce délai, j'incrémente le compteur.
Qu'en penses-tu ?
/*
ESP8266 + DHT22 + webserver + Barriere IR
Lesept -- 28/07/2019
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
/Put your SSID & Password/
const char* ssid = ""; // Enter SSID here
const char password = "*"; //Enter Password here
ESP8266WebServer server(80);
// DHT Sensor
uint8_t DHTPin = D4;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
// Barrière (ou switch)
#define IRPin D7 // pour GPIO13
unsigned int compteur = 0;
bool wasHigh = false;
bool etatChrono = false;
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
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");
}
void loop() {
server.handleClient();
// 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);
}
// Gestion de la barrière IR
int IRval = digitalRead(IRPin);
if (IRval == HIGH) { // détection
wasHigh = true;
Serial.println("Detection oiseau");
if (millis() - chrono < 1000ul) etatChrono = false;
} else {
if (wasHIGH && !etatChrono) { // Lancement d'une attente d'une seconde
chronoIR = millis();
etatChrono = true;
}
if (etatChrono && millis() - chronoIR > 1000ul) { // Fin de l'attente
Serial.print("Compteur +1 : ");
compteur++;
Serial.println(compteur);
wasHIGH = false;
etatChrono = false;
}
}
}
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");
}
String SendHTML(float Temperaturestat, float Humiditystat) {
String ptr = " \n";
ptr += "<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
ptr += "ESP8266 Weather Report\n";
ptr += "html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr += "p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr += "\n";
ptr += "\n";
ptr += "\n";
ptr += "<div id="webpage">\n";
ptr += "
ESP8266 Bird watch
\n";
ptr += "
Temperature: ";
ptr += (int)Temperaturestat;
ptr += "C
";
ptr += "
Humidity: ";
ptr += (int)Humiditystat;
ptr += "%
";
ptr += "
Compteur: ";
ptr += compteur / 2;
ptr += "
";
ptr += "\n";
ptr += "\n";
ptr += "\n";
return ptr;
}
A tester...
J'ai ajouté la temp et humi dans la console, mais je pense que tu n'en as pas besoin dans la version finale car tu n'auras plus un PC connecté au NodeMCU.
Ta 'logique' de comptage est bonne, a la première coupure de barrière tu attends 1 seconde puis
si 2eme passage on recommence l'attente de 1 seconde ........ puis si plus de 1s sans coupure = j’incrémente..
c'est bien cà.
J'ai vu que le contact de coupure est sur GPIO 15 (D8) le calcul de lance t-il au passage à 3.3V ou au passage à 0 ? ..... en obersevant le code "if (IRval == HIGH) { // détection
wasHigh = true;" jeme dit que c'est a l'etat haut (3.3v) qu'il compte ...? c'est bien ca ?