Capteurs non reconnu sur ESP8266

Bonjour a tous,

J'ai un projet qui tournait sur un ESP8266 avec trois capteur, un DHT 22, un DHT21 et un BME280, qui envoyait mes données sur une page web par le wifi.
Mais depuis quelques jours,j'ai bien ma page web qui s'affiche, mais pas les données des 3 capteurs, Le BME en IC me donne un résultat "0" et les deux autres capteur "nan".

Je trouve bizarre car un capteur ça m'a déjà arrivé, mais les trois en même temps, la probabilités que chaque capteur ai un problème en même temps est assez faible.
Ma question est de quoi cela peut venir?

Je sais que je ne donne pas assez d'info pour trouver le problème, mais je ne sais pas quoi donner comme info.
Mon programme fait un peu moins de 500 lignes donc je n'ai pas osé le mettre tout de suite.

Sachant que le module esp8266 fonctionne car mon programme est bien stocké dedans et défile sur le moniteur série .
le wifi aussi puisque ma page HTLM es consultable depuis son adresse IP.
Les capteur son bien alimenté en 3.3V.
Et que tout fonctionnait il y a quelques jour.

Demandé moi les infos nécessaire au diag.

Merci d'avance si vous voyez un angle de recherche de la panne.

Problème de fil débranché ou endommagé quelque part - genre GND.ou alim erratique à vérifier

Postez le circuit

Faire un petit programme qui interroge les 3 capteurs et affiche les valeurs - et uniquement ça.

Merci J-M-L,
Je n'ai pas de schéma pour l'instant, quel logiciel me conseillerais tu pour en faire un?

Assez simple de préférence

Merci biggil oui je vais regarder ça également, je reviens avec des infos dés que j'ai testé.

Pas besoin de logiciel
Un crayon une règle et une feuille
Des rectangles pour les composants avec leur référence à l’intérieur
Des traits tracés à la règle qui partent des pins que vous numérotez (pas forcément à leur emplacement réel sur le rectangle)
Et les symboles courants pour les résistances, condensateurs, alim etc

Vous vérifiez que ça correspond bien à votre montage

Vous postez une photo du dessin et du montage
Si vous pouvez rajouter les liens vers les composants utilisés c’est encore mieux

Le code peut aussi être utile - avec les balises de de code.

  • utiliser le menu de l’IDE pour copier pour le forum et collez ici

Ou copiez le code indenté et coller le ici puis

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l’icône </> dans la barre d’outils pour indiquer que c’est du code

(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Voici le schema au plus simple, je n'ai pas dessiné VIN et GND:

Voici le code, désolé pour la lecteure car il ne doit pas etre simple a lire, car j'ai rajouté des elements de code au fur et a mesure de l'avancement du projet.

/*********

   Programme OK 14/07/2020
  Rui Santos
  Complete project details at https://randomnerdtutorials.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/
*********/

// Import required libraries
//
#include <Arduino.h>
//#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <time.h>
#include <FS.h>
#include <Wire.h> //*Include the Wire library which allows to use the I2C interface*
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h> //*library to easily take readings from the sensor*
#include <ESP8266WiFi.h>           // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#define SEALEVELPRESSURE_HPA (1028)

// Parametre server MySQL
IPAddress server_addr(205, 156, 171, 133); // IP of the MySQL *server* here
char user[] = "user";              // MySQL user login username
char passw[] = "password";        // MySQL user login password
// Sample query
//char INSERT_SQL[] = "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('BME280','Extériur',newT1,newH1)";
WiFiClient client;                 // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

char* date;

// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";
byte etatDEL12 = 0;
long dateCourante;
long dateCourante2;
long dateCourante3;
const int ledpin = 12;
unsigned long mtemps = 0; // mémorisation du temps + 500ms

boolean s = true; // état de la sortie


#define DHTPIN1 0     // Interieur dht21 Digital pin connected to the DHT sensor
#define DHTPIN2 4     // D2 et D1 SCL+SDA BME Digital pin connected to the DHT sensor
#define DHTPIN3 14     // cave DHT 22 Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
#define DHTTYPE1    DHT11     // DHT 11
#define DHTTYPE2    DHT22     // DHT 22 (AM2302)
#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht2(DHTPIN1, DHTTYPE2);  // interieur
DHT dht1(DHTPIN2, DHTTYPE);   // exterieur
DHT dht3(DHTPIN3, DHTTYPE);  // Cave
Adafruit_BME280 bme; //*Declare the bpm variable, an easy to remember reference for the device*

unsigned long delayTime;

// current temperature & humidity, updated in loop()
float t1 = 0.0; // temperature exterieur
float h1 = 0.0; // humidité extérieur
float p1 = 0.0; // pression atmospherique
float t2 = 0.0; // température intérieur
float h2 = 0.0; // humidité interieur
float t3 = 0.0; // température cave
float h3 = 0.0; // humidité cave

// the IP address for the shield:
IPAddress ip(192, 168, 0, 30);
// Create AsyncWebServer object on port 80
AsyncWebServer server(1030);

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000;

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 2rem; }
    p { font-size: 1.5rem; }
    .units { font-size: 1rem; }
    .dht-labels{
      font-size: 1.2rem;
      vertical-align:middle;
      padding-bottom: 5px;
    }
    
  </style>
</head>
<body>
  <h2>Temperature Humidité</h2>
  <span id="date">%Date%</span>

<p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature Exterieur</span> 
    <br>
    <span id="temperature1">%TEMPERATURE1%</span>
    <sup class="units">&deg;C</sup>
  </p>

  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature Interieur</span> 
    <br>
    <span id="temperature2">%TEMPERATURE2%</span>
    <sup class="units">&deg;C</sup>
  </p>
  
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature Cave</span> 
    <br>
    <span id="temperature3">%TEMPERATURE3%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity Exterieur</span>
    <br>
    <span id="humidity1">%HUMIDITY1%</span>
    <sup class="units">%%</sup>
  </p>

   <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity Interieur</span>
    <br>
    <span id="humidity2">%HUMIDITY2%</span>
    <sup class="units">%%</sup>
  </p>

   <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity Cave</span>
    <br>
    <span id="humidity3">%HUMIDITY3%</span>
    <sup class="units">%</sup>
  </p>

<i class="fa-solid fa-gauge-high"></i>
  
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("date").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/date", true);
  xhttp.send();
}, 1000 ) ;


setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature1").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature1", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature2").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature2", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature3").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature3", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity1").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity1", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity2").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity2", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity3").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity3", true);
  xhttp.send();
}, 10000 ) ;

</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var) {
  //Serial.println(var);
  if (var == "TEMPERATURE INTERIEUR") {
    return String(t1);
    return String(t2);
    return String(t3);
  }
  else if (var == "HUMIDITE INTERIEUR") {
    return String(h1);
    return String(h2);
    return String(h3);
  }
  return String();
}

void setup() {
  // Serial port for debugging purposes
  Serial.begin(115200);
  while (!Serial); // wait for serial port to connect. Needed for Leonardo only

  dht1.begin();
  dht2.begin();
  dht3.begin();
  bme.begin();  //*Try to start the device*
  dateCourante2 = millis();
  pinMode(ledpin, OUTPUT);
  // IP statique
  IPAddress dnServer(89, 2, 0, 1);
  IPAddress ip(192, 168, 0, 30);
  IPAddress gateway(192, 168, 0, 1);
  IPAddress subnet(255, 255, 255, 0);

  WiFi.config(ip, dnServer, gateway, subnet);
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println(".");
  }

  Serial.print("Connecting to SQL...  ");
  if (conn.connect(server_addr, 3306, user, passw))
    Serial.println("OK.");
  else
    Serial.println("FAILED.");

  // create MySQL cursor object
  cursor = new MySQL_Cursor(&conn);


  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html, processor);
  });

  server.on("/date", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(date).c_str());
  });

  server.on("/temperature1", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(t1).c_str());
  });
  server.on("/temperature2", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(t2).c_str());
  });
  server.on("/temperature3", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(t3).c_str());
  });
  server.on("/humidity1", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(h1).c_str());
  });

  server.on("/humidity2", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(h2).c_str());
  });
  server.on("/humidity3", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(h3).c_str());
  });

  // Start server
  server.begin();

  configTime(1 * 3600, 0, "0.fr.pool.ntp.org");
  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");

}

void loop() {
  time_t now = time(nullptr);
  Serial.println("Final time:");  Serial.println(now);
  Serial.println(ctime(&now));
  //time_t now = time(nullptr);
  //Serial.println(ctime(&now));
  date = ctime(&now);
  delay(1000);


  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    // Read temperature as Celsius (the default)
    float newT1 = bme.readTemperature();
    float newT2 = dht2.readTemperature();
    float newT3 = dht3.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //float newT = dht.readTemperature(true);
    // if temperature read failed, don't change t value
    if (isnan(newT1)) {
      Serial.println("Failed read !");
    }
    else {
      t1 = newT1;
      Serial.println(t1);
      t2 = newT2;
      Serial.println(t2);
      t3 = newT3;
      Serial.println(t3);
    }
    // Read Humidity
    float newH1 = bme.readHumidity();
    float newH2 = dht2.readHumidity();
    float newH3 = dht3.readHumidity();
    // if humidity read failed, don't change h value
    if (isnan(newH1)) {
      Serial.println("Failed  read !");
    }
    else {
      h1 = newH1;
      Serial.println(h1);
      h2 = newH2;
      Serial.println(h2);
      h3 = newH3;
      Serial.println(h3);
    }
    // Read Presure
    float newP1 = bme.readPressure() / 100.0F;
    // if humidity read failed, don't change h value
    if (isnan(newP1)) {
      Serial.println("Failed  read !");
    }
    else {
      p1 = newP1;
      Serial.println(p1);
    }
  }
  if (t1 < 17) {
    unsigned long temps = millis(); // lecture du temps système, utiliser une variable comme "temps" permet de l'utiliser pour d'autres action dans le programme


    if ( temps >= mtemps )  // si le temps est écoulé
    {
      digitalWrite( ledpin , s ); // allume la led selon l'état du bit "s"
      s = !s;      // inverse l'état de "s"
      mtemps = mtemps + 100; // mémorise le temps +100
    }
  }

  else {
    unsigned long temps = millis(); // lecture du temps système, utiliser une variable comme "temps" permet de l'utiliser pour d'autres action dans le programme


    if ( temps >= mtemps )  // si le temps est écoulé
    {
      digitalWrite( ledpin , s ); // allume la led selon l'état du bit "s"
      s = !s;      // inverse l'état de "s"
      mtemps = mtemps + 2000; // mémorise le temps +500
    }

  }


  //BME280
  char var_t1[6];
  dtostrf(t1, 3, 1, var_t1);
  char var_h1[7];
  dtostrf(h1, 3, 1, var_h1);
  char var_p1[7];
  dtostrf(p1, 3, 1, var_p1);
  //DHT22
  char var_t2[6];
  dtostrf(t2, 3, 1, var_t2);
  char var_h2[7];
  dtostrf(h2, 3, 1, var_h2);
  //DHT21
  char var_t3[6];
  dtostrf(t3, 3, 1, var_t3);
  char var_h3[7];
  dtostrf(h3, 3, 1, var_h3);
  Serial.println("");
  Serial.println(var_t2);
  Serial.println(var_h2);
  Serial.println(var_t3);
  Serial.println(var_h3);
  String tab_var[7];
  String tab_var2[] = {var_t1, var_h1, var_p1, var_t2, var_h2, var_t3, var_h3};
  Serial.println(tab_var2[7]);
  Serial.println("");
  for (int i = 0; i < 7; i++) {
    if (tab_var2[i] == "nan") {

      tab_var2[i] = "0";

    }
    tab_var[i] = tab_var2[i];
    Serial.println(tab_var[i]);
  }

  Serial.println(tab_var[7]);



  //char insert_Sql_1[140];
  //char insert_Sql_2[140];
  //char insert_Sql_3[140];
  //
  //sprintf(insert_Sql_1, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('BME280','Extérieur',%s,%s,%s)", tab_var[0], tab_var[1],tab_var[2]);
  //sprintf(insert_Sql_2, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('DHT11','Intérieur',%s,%s,'0')", tab_var[3], tab_var[4]);
  //sprintf(insert_Sql_3, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('DHT21','Cave',%s,%s,'0')", tab_var[5], tab_var[6]);
  //  if (conn.connected()){
  //    cursor->execute(insert_Sql_1);
  //    cursor->execute(insert_Sql_2);
  //    cursor->execute(insert_Sql_3);
  //  }
  //
  //  delay(10000);
}

Cette ligne n'est pas correcte et modifie la coloration syntaxique.

Merci pour l'info terwal je viens de corriger

j'ai l'impression que l'esp8268 ne détecte pas correctement le signal du capteur, quand je démarre l'esp si je prend un programme qui ne fait tourner que le DHT22 l'esp marque " error ready", mais si je débranche et rebranche le capteur il indique la température.
Comment faire pour que le signal soit mieux perçu par l'esp?

Tu n'a pas le wifi qui démarre en même temps que ta lecture du capteur?

Non je pense que ça n'a rien a voir, parce que si j'utilise un programme qui n'utilise pas le wifi j'ai la même chose

Bonsoir

bizarre : dans le code le GPIO4 est associé à un 3e capteur de type DHT et sur le schéma à un BME sur bus I2C

Oui exact, merci al1fch, c'était un ancien montage avant de mettre un BME en exterieur, car j'avais eu des soucis avec le DHT.

Je viens de corriger ces lignes:

DHT dht2(DHTPIN1, DHTTYPE2);  // interieur
//DHT dht1(DHTPIN2, DHTTYPE);   // exterieur
DHT dht3(DHTPIN3, DHTTYPE);  // Cave
Adafruit_BME280 bme; //*Declare the bpm variable, an easy to remember reference for the device*

et:

//dht1.begin();
  dht2.begin();
  dht3.begin();
  bme.begin();

Et je continue a tester.

Plus je teste et plus je pense avoir des soucis avec mes capteurs, donc je vais voir pour remplacer le dernier qui ne fonctionne plus.
Par contre si dans le code vous voyez encore des choses bizarre n’hésitez pas.

vous ne pouvez pas avoir 3 return à la suite... seul le premier est pris en compte. votre code c'est en fait

String processor(const String& var) {
  if (var == "TEMPERATURE INTERIEUR") return String(t1);
  else
  if (var == "HUMIDITE INTERIEUR")    return String(h1);
  return String();
}

dans ce code

pourquoi n'en testez vous qu'un (newH1) pour déterminer si la lecture a planté ?

on dirait que vous avez pris le code pour un capteur et vous en avez rajouté d'autres puis avez dupliqué certaines lignes sans trop comprendre ce que vous faisiez...

Merci J-M-L, pour l'analyse de mon code, qui est tout a fait correct et c'est bien ça j'ai un peu progressé dans l'analyse et la structure du code, mais comme le code faisait ce que je lui demandait je n'est pas été plus loin et chercher à le relire en profondeur et essayé de l'optimiser.
je vais déjà regarder les points que tu as relevé et l'analyser un peu plus.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.