Conception d'un nichoir connecté ! soucis de LED IR modulé !

Bonjour,

Je me présente, j'ai 40 ans et fanatique d'oiseaux .... habitant dans le Grand EST !
J'ai actuellement en place dans mon nichoir une sonde DHT22 qui me renvoie la température et l'hygrométrie sur une page web : ça c'est parfait !

Etant fanatique d'oiseaux, je cherche a compter le nombre de passage de mes mésanges dans le nichoir.
Pour cela, je voudrais utiliser une nodeMCU V3. L'idée est que chaque contact de ma barrière IR arrivant sur un PIN de ma nodemcu incrémente un compteur et que ce compteur soit renvoyer sur une page web.

Mais voila..... je ne sais pas du tout coder!!
Pourriez vous m'aider voir m'écrire un petit bout de code me permettant de réaliser mon projet ?

Un grand merci d'avance.

Bonjour,

Pour ce qui est d'écrire ton code, il y a peu de chance que quelqu'un le fasse sans lui fournir un minimum d'efforts.

Tu es sur un site de passionnés qui veulent aider les autres à comprendre comment faire, et non pas faire à leur place.

Nous avons tous, pour la plupart, des projets déjà en cours, des suivis de projets venant d'autres personnes sur ce forum.

Il y a une grosse différence entre passer un peu de temps avec quelqu'un pour l'orienter, ou lui montrer comment corriger ses erreurs, et faire un énième code sans que la personne demandeuse n'en retienne un quelconque intérêt en dehors de son utilisation finale.

J'imagine que ta passion pour les oiseaux ne te laisse pas forcement du temps où même l'envie d'approfondir tes connaissances sur le codage et le choix de composants électroniques, mais en passant un peu de temps pour comprendre le fonctionnement de ces cartes, cela pourrait te donner des idées, et surtout les compétences pour concrétiser ton projet et bien d'autres (comme par exemple prendre une photo de l'oiseau sur le déclenchement de la cellule).

Tu ne trouveras pas forcément quelqu'un pour te modifier ton code ici, mais je suis sûr que toutes les questions que tu poseras ne resteront pas sans réponses.

Dans un premier temps, analyse le code que tu utilises actuellement pour comprendre son fonctionnement.
Tu peux t'aider de ce site pour apprendre.
Pose des questions si tu as des doutes ou que tu ne comprends pas quelque-chose.

Propose un nouveau code (entre balises comme indiqué dans les messages épinglés) et la liste de ton matériel.
On t'aidera à le faire évoluer jusqu'au résultat attendu.

Bon courage...

rer67:
...

Etant fanatique d'oiseaux, je cherche a compter le nombre de passage de mes mésanges dans le nichoir.
Pour cela, je voudrais utiliser une nodeMCU V3. L'idée est que chaque contact de ma barrière IR arrivant sur un PIN de ma nodemcu incrémente un compteur et que ce compteur soit renvoyer sur une page web.

Mais voila..... je ne sais pas du tout coder!!
Pourriez vous m'aider voir m'écrire un petit bout de code me permettant de réaliser mon projet ?

Un grand merci d'avance.

Bonjour
Trés bonne réponse d'ensemble de Zlika
accessoirement , les mésanges sont des "piafs adorables" que j’apprécie beaucoup
çà m'est même arrivé d'en remettre en marche
:grin:

Si je comprends bien, tu as déjà un système qui affiche les données d'un capteur DHT sur un serveur Web. Quel matériel utilises-tu pour ça ?

Le plus simple serait d'utiliser le NodeMCU V3 pour le DHT et la barrière infrarouge. Si ton DHT n'est pas branché sur le NodeMCU, commence par porter ton premier code sur cet appareil. Ensuite, cherche des tutoriels sur l'utilisation de la barrière infrarouge avec le NodeMCU.

Tu fais alors un sketch pour mettre la barrière en œuvre. Lorsque ça fonctionne, ll reste à fusionner les deux codes.

Bonjour,

Merci de vos encouragements.
pour vous montrer un peu le contexte et ma passion :
mon site web
ma chaine youtube
vous y trouverez des videos et une page sur la technique de mon nichoir.

Ce que j'ai actuellement :

  • un capteur DHT22
  • nodemcu V3

avec cela j'affiche les données de temp et d'hygro à l'intérieur du nichoir : ( dans le petit nichoir blanc en bas )

le code à été mis en lua avec esplorer sur la node :

PIN = 4
SSID = "******"
PASSWORD = "*******"

local dht = require 'dht'

function readDht()    
    status,temp,humi,temp_decimial,humi_decimial = dht.read(PIN)
    if( status == dht.OK ) then
        print("DHT Temperature:"..temp..";".."Humidite"..humi)
    elseif( status == dht.ERROR_CHECKSUM ) then
        print( "DHT Checksum error." );
    elseif( status == dht.ERROR_TIMEOUT ) then
        print( "DHT Time out." );
    end
    return temp,humi
end


function wait_for_wifi( )
   tmr.alarm (1, 1000, 1, function ( )
      if wifi.sta.getip ( ) == nil then
         print ("Waiting for Wifi connection")
      else
         tmr.stop (1)
         print ("ESP8266 mode is: " .. wifi.getmode ( ))
         print ("The module MAC address is: " .. wifi.ap.getmac ( ))
         print ("Config done, IP is " .. wifi.sta.getip ( ))
      end
   end)
end

function connect()
    wifi.setmode(wifi.STATION)
    wifi.sta.config(SSID, PASSWORD, 1)
    wait_for_wifi( )
end

function http_conn(sock)
    sock:on("receive",function(sock,payload) 
        print(payload) -- for debugging only
       --generates HTML web site
        temp,humi =readDht()
        sock:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
   <!DOCTYPE HTML>\
    <html><head><meta content="text/html;charset=utf-8"><title>ESP8266</title></head>\
   <body bgcolor="#ffffff">\
   <h3><font color="black">\
   <input style="border: hidden; border: 0"type="text"size=1 name="j"value="'..temp..'"> 
\
   <input style="border: hidden; border: 0"type="text"size=1 name="p"value="'..humi..'"> 
</font></h3>\
  </body></html>')
    sock:on("sent",function(sock) sock:close() end)
    end)
end 
   
connect()
svr = net.createServer (net.TCP, 30)
svr:listen (80, http_conn)
readDht()

comme vous le constatez le serveur est dans la nodemcu directement et je viens chercher ces infos toutes les 5 minutes pour actualiser mon LIVE sur youtube.

A cela je cherche donc à ajouter un compteur de passage de l'oiseau à travers le trou d'envol de 32mm ( mesange charbonnière ).

Je comptait mettre une barrière IR à l'arrière du trou d'envol relié à un nodemcu supplémentaire ( car je ne sait pas faire de "sketch" ;). L'idée étant d'ajouter sur la page qui est sur mon serveur le nombre de passage de l'oiseau.
je compterais les aller et retour mais en divisant par 2 cette valeur et en affichant l'entier inférieur cela devrait être OK .....

J'ai trouvé des codes sur le web mais rien ne me permettant de realiser le montage souhaité. Je suis fan de bricolage mais mes connaissances en codage sont quazi inexistant.

sur ce forum j'ai trouvé ce code de mika47 : lien de la discution : ici

#include <LiquidCrystal.h>
//const int Pin_p= 8;
//const int Pin_m= 9;
// définition des bornes 
#define valeurMin 0
#define valeurMax 10

int Pin_plus=0;
int Pin_moins=0;
int j=0;

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {

 lcd.begin(20, 4);
 
 pinMode(11,INPUT);
 pinMode(12,INPUT);
 digitalWrite(11, HIGH);
 digitalWrite(12, HIGH);
 j=0;
 lcd.clear();
 lcd.setCursor(0,1);
 lcd.print(j);
 lcd.clear();
 //lcd.print(j);
//delay(100);
}

void loop() {
 if (digitalRead(11)==LOW)
 {
   if (j<valeurMax)j++;

   lcd.clear();
   lcd.setCursor(0,1);
   lcd.print(j);
   delay(100);
   while((digitalRead(11)==LOW));
 }
 if (digitalRead(12)==LOW)
 {
   if (j>valeurMin)j--;
   lcd.clear();
   lcd.setCursor(0,1);
   lcd.print(j);
   delay(100);
   while((digitalRead(12)==LOW));
}
}

qui si je remplace le bouton + par ma cellule et si je retire l’écran LCD pour simplement ajouter la valeur du compteur sur ma page web devrait théoriquement faire l'affaire ...
j'ai également lu que parfois y avait des rebonds dans les comptages et que certains on mis un temps de qq millisecondes avant de compter l’impulsion suivante ...

qu'en pensez- vous ?

J'en reviens au fait que j'en demande beaucoup peut être mais certainement comme moi qui aide d'autres passionnés à oberver et construire des nichoirs vidéo, il y a surement sur ce forum des personnes prêtes à m'aider un peu plus que la normale ;). Un peu de pub pour le forum est toujours possible si j'arrive à réaliser mon souhait ..:slight_smile:

Merci d'avance.

J'aime bien le projet, mais je ne connais pas le Lua et pas trop la syntaxe pour afficher des données sur un site Web, en tout cas pas s'il est trop compliqué...

Par contre, je sais que ce que tu veux faire peut être fait avec un seul NodeMCU, sur lequel tu connectés ton DHT et la barrière IR. Je peux juste t'aider pour faire un code, ou sketch, en C pour le NodeMCU.

Qu'en dis-tu ?

lesept:
J'aime bien le projet, mais je ne connais pas le Lua et pas trop la syntaxe pour afficher des données sur un site Web, en tout cas pas s'il est trop compliqué...

Par contre, je sais que ce que tu veux faire peut être fait avec un seul NodeMCU, sur lequel tu connectés ton DHT et la barrière IR. Je peux juste t'aider pour faire un code, ou sketch, en C pour le NodeMCU.

Qu'en dis-tu ?

hello Le7 !

mais si une partie du code est déjà en lua, je ne peux pas ajouter une autre partie en C, non ?
faut-il tout faire en C alors ?

merci,

Tout en lua ou en C

Comme tu connais le C il faudrait donc convertir ce que j'ai en lua en C puis ajouter le code de la barrière Ir c'est ça ?

Oui
Je tenterai de faire une première version demain matin.
En attendant, je te conseille de lire des tutos : eskimon, openclassrooms par exemple

Bonjour
Voici une première version du code :

/*
   ESP8266 + DHT22 + webserver
   Barriere IR viendra pus tard
   Lesept -- 28/07/2019
*/

#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"
ESP8266WebServer server(80);

#include "DHTesp.h"
DHTesp dht;
#define DHTPin 4
float temp = 0;
float humi = 0;

unsigned long chrono = 0;
const unsigned long duration = 5000ul; // Mesure T&H toutes les 5 secondes

void setup() {
  Serial.begin(115200);
  dht.setup(DHTPin, DHTesp::DHT22);

  Serial.println("Waiting to connect…");
  WiFi.begin("Network name", "Password");  //Connect to the WiFi network
  while (WiFi.status() != WL_CONNECTED) {  //Wait for connection
    delay(500);
    Serial.print("");
  }
  Serial.print("\nIP address: ");
  Serial.println(WiFi.localIP());  //Print the local IP
  Serial.println ("Acces au serveur en ajoutant :80");

  server.on("/other", []() {   //Define the handling function for the path
    server.send(200, "text / plain", "Other URL");
  });
  server.on("/", handleRootPath);    //Associate the handler function to the path
  server.begin();                    //Start the server
  Serial.println("Server listening");

  chrono = millis();
}

void loop() {
  server.handleClient();         //Handling of incoming requests

  if (millis() - chrono > duration) {
    chrono = millis();
    TempAndHumidity measurement = dht.getTempAndHumidity();
    temp = measurement.temperature;
    humi = measurement.humidity;
    Serial.print("Temperature: ");
    Serial.println(temp);
    Serial.print("Humidity: ");
    Serial.println(humi);
  }
}

void handleRootPath() {   //Handler for the root path
  String message;
  // message = "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n";
  message = "<!DOCTYPE HTML><html><head><meta content=\"text/html;charset=utf-8\"><title>ESP8266</title></head>";
  message += "<body bgcolor=\"#ffffff\"><h3><font color=\"black\">";
  message += "<input style=\"border: hidden; border: 0\"type=\"text\"size=1 name=\"j\"value=";
  message += String(temp,1);
  message += "\"> 
<input style=\"border: hidden; border: 0\"type=\"text\"size=1 name=\"p\"value=";
  message += String(humi,1);
  message += "\"> 
</font></h3></body></html>";
  server.send(200, "text/html", message);
  //  server.send(200, "text/plain", "Hello world");
}

Il faut que tu installes une bibliothèque pour la lecture du DHT22 : DHTEsp. Tu peux le faire par le biais du gestionnaire de bibliothèques :

Ce code ne fait pour l'instant que lire la DHT toutes les 5 secondes, afficher les valeurs sur la console (à régler à 115200 baud) et tenir à jour un serveur web. Il te donne son adresse IP et tu peux l'ouvrir via un browser en allant sur http://adresse_ip:80

Pour l'instant, c'est minimaliste ; il affiche juste les valeurs de température et d'humidité.

Je n'ai pas compilé ni testé, je te laisse faire...
Pense à renseigner tes ssid & password dans la ligne Wifi.begin
A+

Bonjour le7 !

Un grand merci, je vais me familiariser avec le logiciel arduino et essayer de charger cela, je tiens informé.
@ toute

re,

j'ai bien télécharger la bibliothèque :

puis j'ai televerser le code.
dans le moniteur je vois bien le rafrachissement toutes les 5 secondes :

et la page web est bien acessible.
cependant j'ai "NAN" au lieu de la valeur numerique ...
(j'ai également essayer avec la bibliotheque V 1.0.6 mais c'est idem)

Le DHT22 est bien sur le PIN D4 de la NODEMCU

Il y a un problème avec la sonde, est-ce qu'elle fonctionnait correctement avant ?
Essaye l'exemple DHT_ESP8266.ino de la bibliothèque

J'ai trouvé un tuto qui fait exactement la même chose, en plus joli et avec une autre bibliothèque. Tu peux le tester : s'il fonctionne, on ajoutera le comptage. Ca fait gagner un peu de temps...

ok je teste cela.
j'avais ressayer en lua et tout etait ok : donc niveau sonde c'est ok .

avec ce code j'obtient cela sur le serveur :

le DHTtester de cette bibliotheque fonctionne par contre :

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"

#define DHTPIN 2     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

le DHT_esp8266 de ta bibliothe fonctionne aussi :

#include "DHTesp.h"

#ifdef ESP32
#pragma message(THIS EXAMPLE IS FOR ESP8266 ONLY!)
#error Select ESP8266 board.
#endif

DHTesp dht;

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)\tHeatIndex (C)\t(F)");
  String thisBoard= ARDUINO_BOARD;
  Serial.println(thisBoard);

  // Autodetect is not working reliable, don't use the following line
  // dht.setup(02);
  // use this instead: 
  dht.setup(02, DHTesp::DHT22); // Connect DHT sensor to GPIO 17
}

void loop()
{
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.print(dht.toFahrenheit(temperature), 1);
  Serial.print("\t\t");
  Serial.print(dht.computeHeatIndex(temperature, humidity, false), 1);
  Serial.print("\t\t");
  Serial.println(dht.computeHeatIndex(dht.toFahrenheit(temperature), humidity, true), 1);
  
}

j'ai trouvé!!
SUPER CONTENT !!!

c'etait une erreur de PIN ! (entre la ref de PIN et le numero GPIO)
il fallait mettre la ref GPIO

#include "DHTesp.h"
DHTesp dht;
#define DHTPin 2
float temp = 0;
float humi = 0;

ton code fonctionne donc jusqu'ici !