ESP8266 SPIFFS Mon site ne s'affiche plus si je rajoute des codes dans le loop

Bonjour a tous,
j'ai fais un petit serveur sur mon ESP8266 avec les fichiers HTML dans le SPIFFS.
Je recois bien l'IP de mon routeur, mon site s'affiche, jusque l'a tous est OK.

J'ai d'autre fonction , des que je les met en évidence dans le loop, le site ne marche plus :confused:

voila de quoi mon code a l'aire

#include <ESP8266WebServer.h>
#include <FS.h>

const char *host = "serverweb1";
const char* ssid = "MYSSID";
const char* password = "MYPASS";
const String CONFIG_HTML = "/html/config.html"; // MAIN PAGE

ESP8266WebServer server(80);

#define Sensor1 A0 // READ FROM SENSOR
int sensor_read;

void handleRoot() {
  server.send(200, "text/plain", "Welcome to ESP8266");
}

void handleConfig()
{
  Affiche la page config.html
}

void initWebserver()
{
 server.on("/", handleRoot);
 server.on("/config",handleConfig);
 server.serveStatic("/css", SPIFFS, "/html/css");
 server.serveStatic("/Update.html", SPIFFS, "/html/Update.html");
}

void lire_capter()
{
  // code pour lire les données du capteur
}

void gestion_robinet_pompe()
{
  //code gestion ouvrir fermer robinet et pompe en fonction du capteur et si robinets sont ouvert ou fermé
}

void setup(void)
{
 Serial.begin(115200);
 pinMode(PumpPin, INPUT);
 
 Serial.println("..."); 
 Serial.println("Mounting FS...");
 if (!SPIFFS.begin())
 {
  Serial.println("Failed to mount file system");
  return;
  } 
 WiFi.begin(ssid, password);
 Serial.println("");
 // Wait for connection
 while (WiFi.status() != WL_CONNECTED)
 {
  delay(500);
  Serial.print(".");
  }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 
 initWebserver();
  
 server.begin();
 Serial.println("HTTP server started");
}

void loop(void)
{
 server.handleClient();

// si j'enleve les '//' d'une ou des deux fonctions, je n'ai plus accès a mon site, page non trouver dans mon navigateur google chrome.
// lire_capter();
 // gestion_robinet_pompe();
}

J'aimerais savoir, comprendre pourquoi je ne peux pas rajouter du code dans loop, et comment résoudre cette énigme ?

au lieu de virer le code des fonctions gestion_robinet_pompe() et gestion_robinet_pompe() ce serait bien de le voir...

où est-ce que vous nous dites que même si ces 2 fonctions sont vides ça ne fonctionne plus alors que si vous ne mettez pas l'appel tout fonctionne?

bonjour,
c'est bien, mais si tu ne mets pas le code des void impliqués, on fait comment?

void lire_capter()
{
  // code pour lire les données du capteur
}

void gestion_robinet_pompe()
{
  //code gestion ouvrir fermer robinet et pompe en fonction du capteur et si robinets sont ouvert ou fermé
}

infobarquee:
bonjour,
c'est bien, mais si tu ne mets pas le code des void impliqués, on fait comment?

beurk :slight_smile:

(ça ne veut rien dire - void ça ne veut pas dire fonction)

J-M-L:
beurk :slight_smile:

(ça ne veut rien dire - void ça ne veut pas dire fonction)

je vais pas faire un discours long comme le bras, donc au plus court et simple a comprendre.
faut arrêter de jouer sur les mots, ca lasse, même pour rigoler
ca te fais un post en plus au compteur :slight_smile: et moi aussi

certes fonction ça fait 4 lettres de plus à taper que void et je sais que c'est la fin de l'année et qu'on est fatigué, mais... moi ça me traumatise de lire cela :)..

Je n'avais pas poste mes fonction en complet, je ne pensais pas que cela pourrait etre la cause.
Voici une de mes fonctions, les autres des que j'arrive a la maison je pourrais les poster.

#define EnableSensor1 2
#define EnableSensor2 3
#define EnableSensor3 4
#define EnableSensor4 5

const int sensor_target1 = 200;
const int sensor_target2 = 250;
const int sensor_target3 = 180;
const int sensor_target4 = 120;
 
void handleConfig()
{
 String form = "";
 File f = SPIFFS.open(CONFIG_HTML, "r");
 if (!f){
  Serial.println("Can't open config html file"); 
  server.send(404, "text/html", "File not found");    
  }
  else{
   char buf[1024];
   int siz = f.size();
   while(siz > 0) {
    size_t len = std::min((int)(sizeof(buf) - 1), siz);
    f.read((uint8_t *)buf, len);
    buf[len] = 0;
    form += buf;
    siz -= sizeof(buf) - 1;
   }
   f.close();
   server.send(200, "text/html", form);
  }
}
int lire_capter(int EnableSoilPin)
{
 int ReadSensor = 0;
 digitalWrite(EnableSoilPin,HIGH);
 for(int SensorReading = 0;SensorReading < 5;SensorReading++)
 {
  ReadSensor = analogRead(SoilSensor);
 }
 digitalWrite(EnableSoilPin,LOW);
 return(ReadSensor);
}
void gestion_robinet_pompe()
{

 if(sensor_read1 < sensor_target1)
 {
   digitalWrite (robinet1 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet1 LOW)
 }

if(sensor_read2 < sensor_target2)
 {
   digitalWrite (robinet2 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet2 LOW)
 }

if(sensor_read3 < sensor_target3)
 {
   digitalWrite (robinet3 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet3 LOW);
 }

if(sensor_read4 < sensor_target4)
 {
   digitalWrite (robinet4 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet4 LOW);
 }

 if(robinet1 && robinet2 && robinet3 && robinet4 == LOW)
 {
   digitalWrite(pompe LOW);
 }
}
void loop()
{
 server.handleClient();
// si je rajoute ces lignes, mon site ne s'affiche plus, si je les ignore mon site s'affiche.
 read_sensor_value1 = lire_capter(SoilSensorEnablePin1);
 read_sensor_value2 = lire_capter(SoilSensorEnablePin2);
 read_sensor_value3 = lire_capter(SoilSensorEnablePin3);
 read_sensor_value4 = lire_capter(SoilSensorEnablePin4);
 gestion_robinet_pompe();
}

tu es certain que ca compile en oubliant des , avant les high et low?

void gestion_robinet_pompe()
{

 if(sensor_read1 < sensor_target1)
 {
   digitalWrite (robinet1 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet1 LOW)
 }

if(sensor_read2 < sensor_target2)
 {
   digitalWrite (robinet2 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet2 LOW)
 }

if(sensor_read3 < sensor_target3)
 {
   digitalWrite (robinet3 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet3 LOW);
 }

if(sensor_read4 < sensor_target4)
 {
   digitalWrite (robinet4 HIGH);
   digitalWrite (Pompe HIGH);
 }
 else
 {
   digitalWrite (robinet4 LOW);
 }

 if(robinet1 && robinet2 && robinet3 && robinet4 == LOW)
 {
   digitalWrite(pompe LOW);
 }
}

infobarquee:
tu es certain que ca compile en oubliant des , avant les high et low?

J'ai un petit peut raccourci... l’essentiel que c'est compréhensible de ce que mon code fais, mon problème n'est pas la.

Poue tester j'ai mit dans mon loop le code qui suit:

void loop()
{
 server.handleClient();
 

// je dois annuler cette ligne pour que mon site s'affiche ,  pourquoi ?
 read_sensor_value1 = analogRead(A0);

// si je met ce code a la place ça marche
read_sensor_value1 = random(1,100);

}

Ce que je cherche a comprendre c'est pourquoi si je met le 1er code mon site ne s'affiche pas je recois comme message dans mon google chrome This site can’t be reached, took too long to respond.

si je met le 2eme code a la place, ça marche mon site s'affiche .

Pourquoi et quoi faire pour que mon site marche meme avec analogRead ?

Tu as essayé de mettre ton capteur sur une autre pin ?

Il y a q'un seul pin analog sur le esp8266 nodemcu v3.

même si je le laisse vide en ne rien branchant dessus, ca devrais lire une donnée quelconque.

Et de coder une autre pin..... :roll_eyes:

Ton capteur est pas sur une pin de l'arduino ?

jfs:
Et de coder une autre pin..... :roll_eyes:

Ton capteur est pas sur une pin de l'arduino ?

Il y a un seul pin analog je ne vois pas comment coder un autre pin ?

mon capteur est un détecteur d'humidité pour plante.

je ne connais pas les liaisons avec un serveur,

_mais au vu de ta boucle, je me dis que tu dois ouvrir la liaison un très grand nombre de fois à la seconde

_autre piste, as tu chronométré le temps d'exécution des deux instructions "concurrentes"?
encore une fois je n'y connais rien, mais peut être qu'un regard "neuf" ...

int read_sensor_value1=0;
unsigned long deb=0;
unsigned long fin=0;
 
void setup() {
 Serial.begin(115200);
 pinMode(A0,INPUT);
deb =micros();
 read_sensor_value1 = analogRead(A0);
  fin=micros();
Serial.print("lecture A0  = ");Serial.print(read_sensor_value1);Serial.print(" en ");Serial.print( fin-deb);Serial.println(" microsecondes ");

// si je met ce code a la place ça marche
deb=micros();
read_sensor_value1 = random(1,100);
 fin=micros();
Serial.print("lecture rnd =  ");Serial.print(read_sensor_value1);Serial.print(" en ");Serial.print( fin-deb);Serial.println(" microsecondes ");
}

void loop() {}

noam76:
J'ai un petit peut raccourci... l’essentiel que c'est compréhensible de ce que mon code fais, mon problème n'est pas la.

Bonsoir
mets ton code complet (qui compile OK)

Vous balancez quelle tension sur A0? Votre ESP ne peut pas lire plus de 3.2V (de mémoire)

Vous êtes sûr d’avoir branché sur A0 et pas GPIO 0?

Artouste:
Bonsoir
mets ton code complet (qui compile OK)

Je post mon code complet qui compile, en 2 parties.

J-M-L:
Vous balancez quelle tension sur A0? Votre ESP ne peut pas lire plus de 3.2V (de mémoire)

Vous êtes sûr d’avoir branché sur A0 et pas GPIO 0?

Oui c'est bien brancher sur A0, si je fais un petit prog juste pour lire le A0 et afficher le résultat dans le moniteur série ça marche, il se branche sur du 3V ou du 5V.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>
#include <FS.h>
#include <dampermotor.h>

const char* ssid = "ASUS";
const char* password = "Famillejacobi";
const String CONFIG_HTML = "/html/config.html";
const String DISPLAY_DATA_HTML = "/html/display_data.html";
const char *configUsername = "admin";
const char *configPwd = "admin";
ESP8266WebServer server(80);

#define SoilSensor A0
#define SoilSensorEnablePin1 D0
#define SoilSensorEnablePin2 D1
#define SoilSensorEnablePin3 D2
#define SoilSensorEnablePin4 D3
#define tap_solenoid_timeout 1500 // delay for 3 sec.
#define PumpPin 2

//Config cible humidité des plantes
const int MintSoilMoisture = 250;//Menth
const int ParsleySoilMoisture = 230;//Persil
const int BasilSoilMoisture = 260;//Basilic
const int CorianderSoilMoisture = 300;//Coriande
const int DillSoilMoisture = 2700;//Aneth
const int SageSoilMoisture = 310;//Sauge
const int rosemarySoilMoisture = 200;//Romarin

int PlantSensor1,PlantSensor2,PlantSensor3,PlantSensor4; //User final target after converted from WebForm
int read_sensor_value1,read_sensor_value2,read_sensor_value3,read_sensor_value4; //lire les donnees des capteurs
boolean electric_tap_motor1,electric_tap_motor2,electric_tap_motor3,electric_tap_motor4; //ouvrir ou fermets les robinets

String XML;
dampermotor tap_motor_sensor1(D4,D5,tap_solenoid_timeout); // définir pin 4,5 pour entraîner le moteur par a port au capteur1
dampermotor tap_motor_sensor2(D6,D7,tap_solenoid_timeout); // définir pin 6,7 pour entraîner le moteur par a port au capteur2
dampermotor tap_motor_sensor3(D8,D9,tap_solenoid_timeout); // définir pin 8,9 pour entraîner le moteur par a port au capteur3
//dampermotor tap_motor_sensor4(D10,11,tap_solenoid_timeout); // définir pin 10,11 pour entraîner le moteur par a port au capteur4

/*affiche la racine du site.*/
void handleRoot() {
  server.send(200, "text/plain", "Welcome to my Irrigation System!");
}

/* Affiche la page de configuration.*/
void handleConfig()
{
 String form = "";
 File f = SPIFFS.open(CONFIG_HTML, "r");
 if (!f){
  Serial.println("Can't open config html file"); 
  server.send(404, "text/html", "File not found");    
  }
  else{
   char buf[1024];
   int siz = f.size();
   while(siz > 0) {
    size_t len = std::min((int)(sizeof(buf) - 1), siz);
    f.read((uint8_t *)buf, len);
    buf[len] = 0;
    form += buf;
    siz -= sizeof(buf) - 1;
   }
   f.close();
   server.send(200, "text/html", form);
  }
}

* Affiche la page display data.*/
void DisplayData()
{
 String form = "";
 File f = SPIFFS.open(DISPLAY_DATA_HTML, "r");
 if (!f){
  Serial.println("Can't open update html file"); 
  server.send(404, "text/html", "File not found");    
  }
  else{
   char buf[1024];
   int siz = f.size();
   while(siz > 0) {
    size_t len = std::min((int)(sizeof(buf) - 1), siz);
    f.read((uint8_t *)buf, len);
    buf[len] = 0;
    form += buf;
    siz -= sizeof(buf) - 1;
   }
   f.close();
   server.send(200, "text/html", form);
  }
}

void handleXML(){
  XML="<?xml version='1.0'?>";
  XML+="<xml>";
  XML+="<sens1>";
  XML+= read_sensor_value1;
  XML+="</sens1>";  
  XML+="<sens2>";
  XML+= read_sensor_value2;
  XML+="</sens2>";
  XML+="<sens3>";
  XML+= read_sensor_value3;
  XML+="</sens3>";
  XML+="<sens4>";
  XML+= read_sensor_value4;
  XML+="</sens4>";
  XML+="</xml>";
 server.send(200,"text/xml",XML);
}

void handleReadUserPlantSelected()
{
 // Recevoir les données cible par Form WEB dans String
 String WebUserPlantSensor1 = server.arg("sensor1");
 String WebUserPlantSensor2 = server.arg("sensor2");
 String WebUserPlantSensor3 = server.arg("sensor3");
 String WebUserPlantSensor4 = server.arg("sensor4");

 // convertir le String en Int
 PlantSensor1 = atoi(WebUserPlantSensor1.c_str());
 PlantSensor2 = atoi(WebUserPlantSensor2.c_str());
 PlantSensor3 = atoi(WebUserPlantSensor3.c_str());
 PlantSensor4 = atoi(WebUserPlantSensor4.c_str());

 // ajuster la cible correcte d'humidité du sol celon plante choisis Form WEB
 PlantSensor1 = SoilSensorWebUser(PlantSensor1);
 PlantSensor2 = SoilSensorWebUser(PlantSensor2);
 PlantSensor3 = SoilSensorWebUser(PlantSensor3);
 PlantSensor4 = SoilSensorWebUser(PlantSensor4);

  server.sendHeader("Location","/config");
  server.send(303);
}

void initWebserver()
{
 server.on("/", handleRoot);

 /* --- configure the config page, main page --- */
 server.on("/config", [&](){
 if(!server.authenticate(configUsername, configPwd)){
  return server.requestAuthentication();
 }else{
  handleConfig(); // display the page
 }
});

  /* --- After press submit button for sensor --- */
 server.on("/postindex", [&](){
  handleReadUserPlantSelected(); // receive form's data from the form tag where action=postindex
 });

 /* --- After press display data on Menu run DisplayData()--- */
 server.on("/display_data", [&](){
    if(!server.authenticate(configUsername, configPwd)){
      return server.requestAuthentication();
  } else {
    DisplayData(); // display the page
  }
  });
  
 server.on("/reqEtatVariables",handleXML);
  
 server.serveStatic("/css", SPIFFS, "/html/css");
 server.serveStatic("/display_data.html", SPIFFS, "/html/display_data.html");
}
/*assigner la cible selon la plante choisis*/
int SoilSensorWebUser(int WebSoilSensor)
{
 switch(WebSoilSensor)
 {
  case 0:
    return(0);
  break;
  case 1:
    return(MintSoilMoisture);
  break;
  case 2:
    return(ParsleySoilMoisture);
  break;
  case 3:
    return(BasilSoilMoisture);
  break;
  case 4:
    return(CorianderSoilMoisture);
  break;
  case 5:
    return(DillSoilMoisture);
  break;
  case 6:
    return(SageSoilMoisture);
  break;
  case 7:
    return(rosemarySoilMoisture);
  break;
 }
}

/*Lire les données des capteurs*/
int lire_capter(int EnableSoilPin)
{
 int ReadSensor = 0;
 digitalWrite(EnableSoilPin,HIGH);
 for(int SensorReading = 0;SensorReading < 5;SensorReading++)
 {
  ReadSensor = analogRead(SoilSensor);
 }
 ReadSensor = map(ReadSensor,550,10,0,100);
 digitalWrite(EnableSoilPin,LOW);
 return(ReadSensor);
}

void gestion_robinet_pompe()
{
 if(read_sensor_value1 < PlantSensor1)
 {
  tap_motor_sensor1.open_damper(); //turn one side solenoid with motortimeout delay
  electric_tap_motor1 = HIGH ;
  if(digitalRead(PumpPin) == LOW);
  {
   digitalWrite(PumpPin,HIGH);
  }
 }
 else
 {
  tap_motor_sensor1.close_damper(); //turn other side solenoid with motortimeout delay
  electric_tap_motor1 = LOW ;
 }
 
 if(read_sensor_value2 < PlantSensor2)
 {
  tap_motor_sensor2.open_damper(); //turn one side solenoid with motortimeout delay
  electric_tap_motor2 = HIGH ;
  if(digitalRead(PumpPin) == LOW)
  {
   digitalWrite(PumpPin,HIGH);
  }
 }
 else
 {
  tap_motor_sensor2.close_damper(); //turn other side solenoid with motortimeout delay
  electric_tap_motor2 = LOW ;
 }
 
 if(read_sensor_value3 < PlantSensor3)
 {
  tap_motor_sensor3.open_damper(); //turn one side solenoid with motortimeout delay
  electric_tap_motor3 = HIGH ;
  if(digitalRead(PumpPin) == LOW)
  {
   digitalWrite(PumpPin,HIGH);
  }
 }
 else
 {
  tap_motor_sensor3.close_damper(); //turn other side solenoid with motortimeout delay
  electric_tap_motor3 = LOW ;
 }
 
 if(read_sensor_value4 < PlantSensor4)
 {
  //tap_motor_sensor4.open_damper(); //turn one side solenoid with motortimeout delay
  electric_tap_motor4 = HIGH ;
  if(digitalRead(PumpPin) == LOW)
  {
   digitalWrite(PumpPin,HIGH);
  }
 }
 else
 {
 // tap_motor_sensor4.close_damper(); //turn other side solenoid with motortimeout delay
  electric_tap_motor4 = LOW ;
 }
 
 // check if all Tap is OFF then turn OFF the Pump
 if(electric_tap_motor1 == LOW && electric_tap_motor2 == LOW && electric_tap_motor3 == LOW && electric_tap_motor4 == LOW)
 {
  digitalWrite(PumpPin,LOW);
 }
}

void setup()
{
 Serial.begin(115200);
 pinMode(PumpPin, INPUT);
 pinMode(SoilSensorEnablePin1, OUTPUT);
 pinMode(SoilSensorEnablePin2, OUTPUT);
 pinMode(SoilSensorEnablePin3, OUTPUT);
 pinMode(SoilSensorEnablePin4, OUTPUT);
 
 Serial.println("..."); 
 Serial.println("Mounting FS...");
 if (!SPIFFS.begin())
 {
  Serial.println("Failed to mount file system");
  return;
 }
 else {Serial.println("Mounting FS Successfully");}
  
 WiFi.begin(ssid, password);
 Serial.println("");
 while (WiFi.status() != WL_CONNECTED)
{
  delay(500);
  Serial.print(".");
}
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 Serial.println("TCP server started");
 
 initWebserver();
 server.begin();
}

void loop()
{
 server.handleClient();
 // read_sensor_value1 = analogRead(A0);
 /*tap_motor_sensor1.damper_motor_driver();
 tap_motor_sensor2.damper_motor_driver();
 tap_motor_sensor3.damper_motor_driver();
 tap_motor_sensor4.damper_motor_driver();*/
 
 // read sensor value
 read_sensor_value1 = lire_capter(SoilSensorEnablePin1);
 read_sensor_value2 = lire_capter(SoilSensorEnablePin2);
 read_sensor_value3 = lire_capter(SoilSensorEnablePin3);
 read_sensor_value4 = lire_capter(SoilSensorEnablePin4);
  // water the plant turn on/off tap and pump
 gestion_robinet_pompe();
}

Lire cela

Vous avez des Strings partout - ça peut mettre le bazar dans votre mémoire . faut toutes les virer et remplacer cela par de tableaux de caractères, surtout la String XML dans handleXML() par exemple... envoyez bout par bout ou utilisez un seul buffer et les fonctions c standard genre strcat() ou strcpy()

pourquoi diable êtes vous allé mettre de String ici alors que les autres sont des char *?

const char* ssid = "ASUS";
const char* password = "Famillejacobi";
[color=red]const String[/color] CONFIG_HTML = "/html/config.html";
[color=red]const String[/color] DISPLAY_DATA_HTML = "/html/display_data.html";
const char *configUsername = "admin";
const char *configPwd = "admin";

Vous n’êtes même pas consistant

 // convertir le String en Int 
 PlantSensor1 = atoi(WebUserPlantSensor1.c_str());
 PlantSensor2 = atoi(WebUserPlantSensor2.c_str());
 PlantSensor3 = atoi(WebUserPlantSensor3.c_str());
 PlantSensor4 = atoi(WebUserPlantSensor4.c_str());

puisque au lieu d’utiliser la méthode toInt() de la classe String vous allez extraire le tableau de caractère pour lire l’entier

Si j'ai bien compris Je dois changer les

const String par char* String ?c'est bien ça?

juste pour comprendre pourquoi j'ai utiliser un STRING et par la suite ATOI.
Comme d’après un exemple que j'ai trouver sur le web pour récupérer les infos d'un FORM WEB, il a utilisé un STRING, c'est pour cela que j'ai utilisé le String.
Par la suite j'ai besoin du numéro INT et pas le string , donc j'ai chercher sur le web comment le convertir en INT ,j'ai trouvé comme explication d'utiliser atoi, c'est pour cela que j'ai fais de cette façon.
de même pour le XML, d’après un exemple que j'ai trouver sur le NET.

J'apprend toujours, j'ai compris de vous que ce n'est pas le bonne façon de le faire.

Pour récupérer les données d'un FORM cela ce fais avec server.arg("sensor1");
donc je devrais faire comme suit ? ca me donne une erreur.

String WebUserPlantSensor1 = server.arg("sensor1");
par char WebUserPlantSensor1[] = server.arg("sensor1"); ?

je devrais faire

char WebUserPlantSensor1[numéro] = server.arg("sensor1"); ?

si je ne connais pas longueur de ce qui sera envoyer depuis le FORM comment faire?

par la suite comment le faire passer dans une variable INT?