ESP aide comment envoyer des données depuis l'esp vers ma page HTML ds SPIFFS

Bonjour a tous,

J'ai une ESP8266 nodemcu v3, j'ai téléchargé mon fichier HTML dans la partie SPIFFS de l'esp.
J'ai un Form html avec une liste, j'arrive bien a récupérer les données du Form vers l'esp.

mes codes que j'utilise du cote de l'ESP

server.on("/postindex", [&](){
handleLireForm();
});

handleLireForm(){
numero1 = server.arg("donnee1");
numero2 = server.arg("donnee2");
numero3 = server.arg("donnee3");
numero4 = server.arg("donnee4");
}

mon code HTML

<form action="/postindex" method="POST">
<select> code </select>
<option> mes options </option>
</select>
<input type="submit" name="Envoie"/>
</form>

Cela marche, l'esp reçois bien les numéros choisis de ma liste.

Je cherche a faire le contraire

de récupérer un numéro envoyer depuis l'ESP vers ma page HTML.

un code du genre coté HTML

<form action=Recevoir de façon Automatique les données envoyé method="GET">
<input type="number" name="ma_chaine"
</form>

du cote ESP je sais pas trop comment, du genre

int monInt = 20;
String ma_chaine;
convertir Int en String;
server.send(200, ma_chaine);

Je cherche votre aide, comment faire cela?

Bonsoir

J’ai un début de tuto: techniques "avancées" de serveur web sur ESP8266

Le tuto n’est pas terminé encore mais montre comment envoyer des données efficacement

en plus d’ exemples simples de partage de valeur ou de texte

![](Techniques "avancées" de serveur web sur ESP8266 - Tutoriels et cours - Arduino Forum 233862)

dyn.png

Il y a un exemple de code avec un afficheur sympa sous cette forme ()

avec l’aiguille qui bouge automatiquement en fonction de A0

Éventuellement jetez un coup d’œil pour voir si vous y trouvez des idées ou pour mieux comprendre ce qu’est la communication HTTP et donc comment approcher cela. je déconseille très fortement l’usage de la classe String, restez avec des c-string (tableau de caractères, terminé par un ‘\0’) plutôt

Notez que la communication ne s’établit pas de l’ESP vers votre page web mais sera toujours une réponse à une requête du navigateur vers votre ESP.

Merci :slight_smile:
Je vais jeter un coup d’œil pour voir ça

Bonjour,

Le tuto est super, j'ai trouvé un code qui pourrait m'aider.
J'ai bien suivis les explications d'installation de la libraire.

j'ai reçu plusieurs messages d'erreur, ce que j'ai fais j'ai essayé couper le code et de trouver le problème.

1 le message d'erreur que j'ai trouver dans le tuto la, la commande client.write(pageWeb);,
je dois l’écrire de cette façon client.write(pageWeb,sizeof(pageWeb)); sinon cela me donne message d'erreur.

Avant le tuto j'ai utiliser ce code pour le serveur
ESP8266WebServer server(80);

je l'ai changé comme sur ton tuto
WiFiServer server(80);

Mon code complet:

// #include <ESP8266HTTPClient.h>

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

#define SoilSensor1 A0
#define SoilSensorEnablePin1 6
#define SoilSensorEnablePin2 5
#define SoilSensorEnablePin3 4
#define SoilSensorEnablePin4 3
#define PumpPin 2

//Configure the soil moisture
const int MintSoilMoisture = 250;//Menth
const int ParsleySoilMoisture = 250;//Persil
const int BasilSoilMoisture = 250;//Basilic
const int CorianderSoilMoisture = 250;//Coriande, Cousbara
const int DillSoilMoisture = 250;//Aneth, shamir
const int SageSoilMoisture = 250;//Sauge, Marva
const int rosemarySoilMoisture = 250;//Romarin

const char *host = "serverweb1";
const char *wifi_ssid = "ASUS"; //replace by your value
const char *wifi_password = "Famillejacobi"; //replace by your value
WiFiServer server(80);    //listen on port 80
//from now on the server is started and will serve your content!
const byte maxHTTPLine = 100;
char httpLine[maxHTTPLine + 1]; // +1 pour avoir la place du '\0'

const String CONFIG_HTML = "/html/config.html";
const String UPDATE_HTML = "/html/Update.html";
const String DISPLAY_DATA_HTML = "/html/display_data.html";
const char *configUsername = "admin";
const char *configPwd = "admin";

// String varname; // read data from the text box
String PlantSensor1,PlantSensor2,PlantSensor3,PlantSensor4; //Read from the Web Form
int NewPlantSensor1,NewPlantSensor2,NewPlantSensor3,NewPlantSensor4; //Convert string receive from web to int
int Web_Soil_Sensor1,Web_Soil_Sensor2,Web_Soil_Sensor3,Web_Soil_Sensor4; //Convert to the correct target Soil Sensor
int electric_tap_motor1=7,electric_tap_motor2=8,electric_tap_motor3=9,electric_tap_motor4=10; //pin to drive the motor's electric tap

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

/**
* 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 Update.
*/
void handleUpdate()
{
 String form = "";
 File f = SPIFFS.open(UPDATE_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);
  }
}

/**
* se connecte en client wifi.
*/
bool connectWifiClient()
{
 WiFi.mode(WIFI_OFF); 
 delay(200);
 Serial.println("Connecting to...");
 Serial.println(wifi_ssid);
 WiFi.mode(WIFI_STA);
 WiFi.begin(wifi_ssid, wifi_password);
 if(WiFi.waitForConnectResult() == WL_CONNECTED){
  Serial.println("WiFi connected");  
  Serial.print("IP address : ");
  Serial.println(WiFi.localIP());
  return true;
  }
  else{
   Serial.println("WiFi Failed");
   return false;
  }
}

void initWebserver()
{
 /* --- configure the root --- */
 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
  }
  });

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

 server.on("display_data", [&](){
    if(!server.authenticate(configUsername, configPwd)){
      return server.requestAuthentication();
  } else {
    DisplayData(); // display the page
  }
  });
  
 /* --- After press update button --- */
 /*server.on("/save", [&](){
  handleSubmit(); // receive form's data from the form tag where action=save
 }); */

/* --- After press submit button for sensor --- */
 server.on("/postindex", [&](){
  handleReadUserPlantSelected(); // receive form's data from the form tag where action=postindex
 });
 
 server.serveStatic("/css", SPIFFS, "/html/css");
 server.serveStatic("/Update.html", SPIFFS, "/html/Update.html");
 server.serveStatic("/display_data.html", SPIFFS, "/html/display_data.html");
 server.serveStatic("/images/1.png", SPIFFS, "/html/images/1.png");
 server.serveStatic("/images/2.png", SPIFFS, "/html/images/2.png");
 server.serveStatic("/images/3.png", SPIFFS, "/html/images/3.png");
 server.serveStatic("/images/4.png", SPIFFS, "/html/images/4.png");
 server.serveStatic("/images/5.png", SPIFFS, "/html/images/5.png");
 server.serveStatic("/images/bg.png", SPIFFS, "/html/images/bg.png");
}

la suite

void handleReadUserPlantSelected(){
 PlantSensor1 = server.arg("sensor1");
 PlantSensor2 = server.arg("sensor2");
 PlantSensor3 = server.arg("sensor3");
 PlantSensor4 = server.arg("sensor4");

 // converting the reading String from WebForm to Int
 NewPlantSensor1 = StringToInt(PlantSensor1);
 NewPlantSensor2 = StringToInt(PlantSensor2);
 NewPlantSensor3 = StringToInt(PlantSensor3);
 NewPlantSensor4 = StringToInt(PlantSensor4);
 
 // Assign the correct Soil Target
 Web_Soil_Sensor1 =  SoilSensorWebUser(NewPlantSensor1);
 Web_Soil_Sensor2 =  SoilSensorWebUser(NewPlantSensor2);
 Web_Soil_Sensor3 =  SoilSensorWebUser(NewPlantSensor3);
 Web_Soil_Sensor4 =  SoilSensorWebUser(NewPlantSensor4);
 
  server.sendHeader("Location","/config");
  server.send(303);
}

int StringToInt(String PlantSensorResult)
{
 if(PlantSensorResult == "")
 {
  uint8_t SensorConverted  = atoi (PlantSensorResult.c_str ());
  // Serial.println(SensorConverted);
  Serial.println("No text");
  server.sendHeader("Location","/update");
  // server.send(200, "text/html","<p>No text selected</p>");
  return(SensorConverted);
 }
 else
 {
  uint8_t SensorConverted  = atoi (PlantSensorResult.c_str ());
  // Serial.println(SensorConverted);
  return(SensorConverted);
 }
}

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;
 }
}

void WaterController(int sensor_pin, int UserWebSoilSensor, int electric_tap_motor)
{
 int output_value;
 for(int SensorReading = 0;SensorReading < 5;SensorReading++)
 {
  output_value = analogRead(sensor_pin);
 }
 output_value = map(output_value,550,10,0,100);
 
 if (output_value < UserWebSoilSensor)
 {
  digitalWrite(electric_tap_motor,HIGH);//turn on the tap
 }
 else
 {
  digitalWrite(electric_tap_motor,LOW);//turn off the tap
 }
}

void PumpController()
{
 if(digitalRead(electric_tap_motor1 == HIGH) || digitalRead(electric_tap_motor2 == HIGH) || digitalRead(electric_tap_motor3 == HIGH) || digitalRead(electric_tap_motor4 == HIGH))
 {
  digitalWrite(PumpPin,HIGH);
 }
 else{
   digitalWrite(PumpPin,LOW);
 }
}

void envoyerVariables(WiFiClient &cl)
{
 // On envoie un en tête de réponse HTTP de type XML et le XML
 // l'en-tête doit être comme cela
 // ----------------------------------
 //  HTTP/1.1 200 OK
 //  Content-Type: text/xml
 //  Connection: keep-alive
 //                    <-- une ligne vide ici
 // ----------------------------------
 //  et le XML doit ressembler à cela avec bien sûr les bonnes valeurs insérées dans les balises
 // ----------------------------------
 //  <?xml version = "1.0" ?>
 //  <variables>
 //    <bouton>xxx</bouton>
 //    <digital1>yyy</digital1>
 //    <analog1>zzz</analog1>
 //  </variables>
 // ----------------------------------
  cl.print(F("HTTP/1.1 200 OK\r\n"
             "Content-Type: text/xml\r\n"
             "Connection: keep-alive\r\n\r\n"
             "<?xml version = \"1.0\" ?>"
             "<variables><bouton>"));

  /*if (digitalRead(pinBouton) == LOW) cl.print(F("actif"));
  else cl.print(F("inactif"));
  cl.print(F("</bouton><digital1>"));
  cl.print(digitalRead(D4));
  cl.print(F("</digital1><analog1>"));*/
  cl.print(Web_Soil_Sensor1);
  cl.print(F("</sendsensor1></variables>"));

  cl.print(Web_Soil_Sensor2);
  cl.print(F("</sendsensor2></variables>"));

  cl.print(Web_Soil_Sensor3);
  cl.print(F("</sendsensor3></variables>"));

  cl.print(Web_Soil_Sensor4);
  cl.print(F("</sendsensor4></variables>"));
}

boolean DisplayData()
{
  boolean requeteHTTPRecue = false;
  byte indexMessage = 0;
  char * ptrGET, *ptrEspace;
  WiFiClient client = server.available();
  if (!client) return requeteHTTPRecue; // pas de client connecté
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n' && currentLineIsBlank) { // une requête HTTP se termine par une ligne vide
        // ON GENERE LA PAGE WEB
        if (strcmp(urlRequest, "/favicon.ico")) { // si ce n'est pas pour le favicon
          requeteHTTPRecue = true;
          // on regarde si on a une requete qui continet /reqEtatBouton ( sinon on renvoie toute la page)
          if (strstr(urlRequest, "/reqEtatVariables")) { // http://www.cplusplus.com/reference/cstring/strstr/?kw=strstr
            // on va lire l'état du bouton et on renvoie l'information correctement
            envoyerVariables(client);
          } else { // on envoie la page web par défaut
            if (SPIFFS.exists(nomDeFichier)) {
              // On envoie un en tête de réponse HTTP standard de type HTML
              client.println("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: keep-alive\r\n");
              File pageWeb = SPIFFS.open(nomDeFichier, "r");
              client.write(pageWeb,sizeof(pageWeb));
              pageWeb.close();
            } else {
              Serial.println(F("Erreur de fichier"));
            }
          }
        }
        break; // on sort du while et termine la requête
      } // fin de génération de la réponse HTTP
      if (c == '\n') {
        currentLineIsBlank = true;
        httpLine[indexMessage] = '\0'; // on termine la ligne correctement (c-string)
        indexMessage = 0; // on se reprépre pour la prochaine ligne
        if (ptrGET = strstr(httpLine, "GET")) {
          // c'est la requête GET, la ligne continent "GET /URL HTTP/1.1", on extrait l'URL
          ptrEspace = strstr(ptrGET + 4, " ");
          *ptrEspace = '\0';
          strncpy(urlRequest, ptrGET + 4, maxURL);
          urlRequest[maxURL] = '\0'; // par précaution si URL trop longue
        }
      } else if (c != '\r') {
        currentLineIsBlank = false;
        if (indexMessage <= maxHTTPLine - 1) {
          httpLine[indexMessage++] =  c; // sinon on ignore le reste de la ligne
        }
      }
    } // end if available
  } // end while
  delay(1);
  client.stop(); // termine la connexion
  return requeteHTTPRecue;
}

void setup()
{
 //delay(1000);
 Serial.begin(74880); // parce que mon Wemos et par défaut à peu près à cette vitesse, évite les caractères bizarre au boot
 pinMode(PumpPin, INPUT);
 pinMode(electric_tap_motor1, INPUT);
 pinMode(electric_tap_motor2, INPUT);
 pinMode(electric_tap_motor3, INPUT);
 pinMode(electric_tap_motor4, 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;
 }
 connectWifiClient(); // connection Wifi
 initWebserver(); // configuration for all path in SPIFFS use files,images, etc..

 server.begin();
  Serial.println("HTTP server started"); 
  if (!MDNS.begin(host)) {
    Serial.println("Error setting up MDNS responder!");
    while(1){ 
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);
}

void loop()
{
 server.handleClient();
 WaterController(SoilSensorEnablePin1, Web_Soil_Sensor1, electric_tap_motor1);
 WaterController(SoilSensorEnablePin2, Web_Soil_Sensor2, electric_tap_motor2);
 WaterController(SoilSensorEnablePin3, Web_Soil_Sensor3, electric_tap_motor3);
 WaterController(SoilSensorEnablePin4, Web_Soil_Sensor4, electric_tap_motor4);
}

Je reviens a vous.

J'avais poster mes messages d'erreur, je viens de remarquer qu'ils n'ont pas été posté.
Avec WiFiServer server(80);
les fonctions
handleclient
server.on
server.send et autres. ne marche pas, je ne sais pas trop comment ajuster mon code pour que ça marche.

J'ai un autre soucis, comme je n'ai pas réussi a faire ce que je voulait, j'ai effacer les libraires du ESP et réinstaller la dernière version depuis le gestionnaire des libraires.

Je rencontre 2 problème

  1. en fassent plusieurs essai avec certain codes de connection le ESP ne se reconnecte plus au WIFI

  2. après avoir verser mon ancien code (poster plus haut) qui marchais, ça ne marche plus, je reçois des message d'erreur dans le moniteur série.
    wdt reset
    load 0x4010f000, len 1384, room 16
    tail 8
    chksum 0x2d
    csum 0x2d
    v3de0c112
    ~ld

Cela fais quelque jours que je me casse la tete.
en espérant de pouvoir refaire marcher ma connection.

Merci de votre aide

NodeMCU permet d'interpréter des scripts Lua, le firmware que j’utilise permet de programmer comme un Arduino avec l'IDE d'Arduino.

ESP8266WebServer.h N’est pas la librairie que j’utilise pour le server donc en effet pas de handleclient , server.on ou server.send.

Ok, merci.

Je ne connais pas les script Lua.

Apres la réinstallation de la libraire 2.2.0 stable , mon code marche, avec la 2.3.0 ça bug.

Je cherche la solution avec la libraire ESP8266WebServer.h que j'utilise :slight_smile:

Je ne l’utilise pas donc peux pas vous aider sur celle là.

Pour faire le contraire, il faut un serveur sur son ordi, par exemple apache2,
et une requête envoyée depuis l'esp, c'est ce que le navigateur fait pour nous.
Donc :

// Côté esp

HTTPClient http;
String url = "[fichier.php]?[param1]=[value1&[param2]="+[value2] ; // ...
http.begin(apacheHost, apachePort, url); // en général avec une freebox, 192.168.1.x et 80
int httpCode = http.GET(); // l'envoi de requête

String payload;
if (httpCode > 0) {
payload = http.getString();
../..
}
else {
payload = http.errorToString(httpCode).c_str();
../..
}

// Côté serveur

<?php // on teste la variable if (isset($_GET['param1']) && isset($_GET['param2'])) { $n1 = intval($_GET['param1']); // pour un int $n1 = intval($_GET['param2']); // pour un int ../..

omiagut:
Pour faire le contraire, il faut un serveur sur son ordi, par exemple apache2,
et une requête envoyée depuis l'esp, c'est ce que le navigateur fait pour nous.
...

Quel intérêt pensez vous que cela représente de

  • répondre à un sujet vieux de 2 ans,
  • à un membre du forum qui n’est pas revenu poster depuis 18 mois,
  • avec une « réponse » qui n’a rien à voir avec sa question
  • sans utiliser les Balises de code

Il serait bon de lire les règles de base du forum