C++ et HTML récupération liste déroulante

Bonjour à toutes et à tous.
je suis en cours de conception d’un clignoteur multi fonctions. j'aimerai récupérer la valeur sélectionnée dans une liste déroulante, mais je ne vois pas comment faire.
Voici le bout de code qui réalise ma page HTML:

client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            // Affichage de la page Web HTML
            client.println("<!DOCTYPE html>");
            client.println("<html>");
            client.println("<head>");
            client.println("<meta charset=\"utf-8\">");
            client.println("<meta charset=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<title>ARP Signal : Clignoteur Wi-fi</title>");
            client.println("<style type=\"text/css\">");
            client.println("*{");
            client.println("text-align: center;");
            client.println("margin: auto;");
            client.println("font-family: arial;");
            client.println("}");
            client.println("header {");
            client.println("background-color: #3AB8BE;");
            client.println("padding: 5px;");
            client.println("padding-top: 2%;");
            client.println("padding-bottom:2%;");
            client.println("margin-bottom: 2%;");
            client.println("color: white;");
            client.println("}");
            client.println("#jour {");
            client.println("border-style: solid;");
            client.println("border-color: #008CBA;");
            client.println("border-width: 1px;");
            client.println("max-width: 420px;");
            client.println("padding: 10px;");
            client.println("}");
            client.println("#nuit {");
            client.println("border-style: solid;");
            client.println("border-color: #008CBA;");
            client.println("border-width: 1px;");
            client.println("max-width: 420px;");
            client.println("padding: 10px;");
            client.println("}");
            client.println("footer {");
            client.println("color: white;");
            client.println("background-color: grey;");
            client.println("width: 100%;");
            client.println("padding-top: 2%;");
            client.println("padding-bottom:2%;");
            client.println("margin-top: 1%;");
            client.println("text-align: center;");
            client.println("}");
            client.println("button{");
            client.println("background-color: #008CBA;");
            client.println("color:white;");
            client.println("padding: 10px;");
            client.println("border-style: none;");
            client.println("}");
            client.println("</style>");
            client.println("</head>");
            client.println("<body>");
            client.println("<header>");
            client.println("<h1>ARP Signal : Clignoteur Wi-fi</h1>");
            client.println("</header>");
            client.println("<label>Choisissez votre clignotement</label>");
            client.println("<select name=\"pets\" id=\"pet-select\">");
            client.println("<option value=\"OFF\">OFF</option>");
            client.println("<option value=\"1S/1S\">1S/1S</option>");
            client.println("<option value=\"1S/2S\">1S/2S</option>");
            client.println("<option value=\"0,5S/0,5S\">0,5S/0,5S</option>");
            client.println("<option value=\"0,5S/1S\">0,5S/1S</option>");
            client.println("<option value=\"0,1S/1S\">0,1S/1S</option>");
            client.println("<option value=\"0,1S/1,5S\">0,1S/1,5S</option>");
            client.println("<option value=\"0,1S/2S\">0,1S/2S</option>");
            client.println("<option value=\"0,1s x 2/1S\">0,1s x 2/1S</option>");
            client.println("<option value=\"0,1s x 2/1,5S\">0,1s x 2/1,5S</option>");
            client.println("<option value=\"0,1s x 2/2S\">0,1s x 2/2S</option>");
            client.println("</select> <br /><br />");
            client.println("<div id=\"jour\">");
            client.println("<h2>Configuration Journée</h2><br />");
            client.println("<label for=\"appt\">Heure de journée</label>");
            client.println("<input type=\"time\" id=\"appt\" name=\"appt\" required><br />");
            client.println("<label for=\"lum-j-num\">Luminosité</label><br />");
            client.println("<input type=\"number\" id=\"lum-j-num\" name=\"Lum-j-num\"");
            client.println(" min=\"0\" max=\"100\">");
            client.println("</div><br />");
            client.println("<div id=\"nuit\">");
            client.println("<h2>Configuration Nuit</h2><br />");
            client.println("<label for=\"appt\">Heure de Nuit</label>");
            client.println("<input type=\"time\" id=\"appt2\" name=\"appt2\" required><br />");
            client.println("<label for=\"lum-N-num\">Luminosité</label><br />");
            client.println("<input type=\"number\" id=\"lum-N-num\" name=\"Lum-N-num\"");
            client.println("min=\"0\" max=\"100\">");
            client.println("</div><br />");
            //client.println("<button type="submit">Envoyer</button>");
            client.println("<p><a href=\"/envoie\"><button class=\"button\">Envoyer</button></a></p>");
            client.println("<footer>Copyright 2022 JC ARP SIGNAL</footer>");
            client.println("</body></html>");
            client.println();

            if (header.indexOf("GET /envoie") >= 0) {
              Serial.println("envoie");
            }

Le bouton envoie lui fonctionne, mais pour la liste déroulante?
Si quelqu'un a une idée?

Sur quelle plateforme ? ESP32 ?

Une liste déroulante peut envoyer sa sélection sous forme d'une requête comme d'autres éléments de formulaires.
donc si vous savez traiter une requête GET pour extraire les paramètres c'est la même chose

PS: ne postez pas de snippets (Snippets R Us!), on ne sait pas ce que fait le reste du code. et si vous voulez poster du HTML / Javascript etc, postez le en tant que tel de façon à ce que ce soit lisible sans tous les client.println() et caractères d'échappement.

Bonjour J-M-L,
Oups, je suis sur un ESP8266. Je met mon code au complet:

#include <ESP8266WiFi.h>
#include "RTClib.h"
RTC_DS3231 rtc;

#include <sunset.h>
SunSet sun;

#include <Wire.h>

const char *ssid = "xxxx";
const char *password = "xxxx";
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);

WiFiServer server(80);

#define TIMEZONE 1
#define LATITUDE 48.856614
#define LONGITUDE 2.3522219

// Variable pour stocker la requête HTTP
String header;

const int ledPin = 0; // SORTIE 1
//const int ledPin2 = D4; //SORTIE 2
const int E1 = 12;
const int E2 = 13;
const int E3 = 14;
const int E4 = 16;

int lum = 1023;

unsigned long currentTime = millis();
unsigned long previousTime = 0; 
const long timeoutTime = 2000;

void setup()
{
 Serial.begin(115200);
 Serial.println();
 Serial.print("Setting soft-AP configuration ... ");
 Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
 Serial.print("Setting soft-AP ... ");
 Serial.println(WiFi.softAP(ssid,password) ? "Ready" : "Failed!");
 
 Serial.print("Soft-AP IP address = ");
 Serial.println(WiFi.softAPIP());

 pinMode(E1, INPUT_PULLUP);
 pinMode(E2, INPUT_PULLUP);
 pinMode(E3, INPUT_PULLUP);
 pinMode(E4, INPUT_PULLUP);
 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, LOW);
 
 Wire.begin();
 rtc.begin();
 sun.setPosition(LATITUDE, LONGITUDE, TIMEZONE);

 server.begin();
}

void loop() {
  WiFiClient client = server.available();   

  if (client) {                             
    Serial.println("New Client.");          
    String currentLine = "";               
    currentTime = millis();
    previousTime = currentTime;
    while (client.connected() && currentTime - previousTime <= timeoutTime) { 
      currentTime = millis();         
      if (client.available()) {             
        char c = client.read();            
        Serial.write(c);                    
        header += c;
        if (c == '\n') {                    
          
          if (currentLine.length() == 0) {
            
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            // Affichage de la page Web HTML
            client.println("<!DOCTYPE html>");
            client.println("<html>");
            client.println("<head>");
            client.println("<meta charset=\"utf-8\">");
            client.println("<meta charset=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<title>TK : Clignoteur Wi-fi</title>");
            client.println("<style type=\"text/css\">");
            client.println("*{");
            client.println("text-align: center;");
            client.println("margin: auto;");
            client.println("font-family: arial;");
            client.println("}");
            client.println("header {");
            client.println("background-color: #3AB8BE;");
            client.println("padding: 5px;");
            client.println("padding-top: 2%;");
            client.println("padding-bottom:2%;");
            client.println("margin-bottom: 2%;");
            client.println("color: white;");
            client.println("}");
            client.println("#jour {");
            client.println("border-style: solid;");
            client.println("border-color: #008CBA;");
            client.println("border-width: 1px;");
            client.println("max-width: 420px;");
            client.println("padding: 10px;");
            client.println("}");
            client.println("#nuit {");
            client.println("border-style: solid;");
            client.println("border-color: #008CBA;");
            client.println("border-width: 1px;");
            client.println("max-width: 420px;");
            client.println("padding: 10px;");
            client.println("}");
            client.println("footer {");
            client.println("color: white;");
            client.println("background-color: grey;");
            client.println("width: 100%;");
            client.println("padding-top: 2%;");
            client.println("padding-bottom:2%;");
            client.println("margin-top: 1%;");
            client.println("text-align: center;");
            client.println("}");
            client.println("button{");
            client.println("background-color: #008CBA;");
            client.println("color:white;");
            client.println("padding: 10px;");
            client.println("border-style: none;");
            client.println("}");
            client.println("</style>");
            client.println("</head>");
            client.println("<body>");
            client.println("<header>");
            client.println("<h1>TK : Clignoteur Wi-fi</h1>");
            client.println("</header>");
            client.println("<label>Choisissez votre clignotement</label>");
            client.println("<select name=\"pets\" id=\"pet-select\">");
            client.println("<option value=\"OFF\">OFF</option>");
            client.println("<option value=\"1S/1S\">1S/1S</option>");
            client.println("<option value=\"1S/2S\">1S/2S</option>");
            client.println("<option value=\"0,5S/0,5S\">0,5S/0,5S</option>");
            client.println("<option value=\"0,5S/1S\">0,5S/1S</option>");
            client.println("<option value=\"0,1S/1S\">0,1S/1S</option>");
            client.println("<option value=\"0,1S/1,5S\">0,1S/1,5S</option>");
            client.println("<option value=\"0,1S/2S\">0,1S/2S</option>");
            client.println("<option value=\"0,1s x 2/1S\">0,1s x 2/1S</option>");
            client.println("<option value=\"0,1s x 2/1,5S\">0,1s x 2/1,5S</option>");
            client.println("<option value=\"0,1s x 2/2S\">0,1s x 2/2S</option>");
            client.println("</select> <br /><br />");
            client.println("<div id=\"jour\">");
            client.println("<h2>Configuration Journée</h2><br />");
            client.println("<label for=\"appt\">Heure de journée</label>");
            client.println("<input type=\"time\" id=\"appt\" name=\"appt\" required><br />");
            client.println("<label for=\"lum-j-num\">Luminosité</label><br />");
            client.println("<input type=\"number\" id=\"lum-j-num\" name=\"Lum-j-num\"");
            client.println(" min=\"0\" max=\"100\">");
            client.println("</div><br />");
            client.println("<div id=\"nuit\">");
            client.println("<h2>Configuration Nuit</h2><br />");
            client.println("<label for=\"appt\">Heure de Nuit</label>");
            client.println("<input type=\"time\" id=\"appt2\" name=\"appt2\" required><br />");
            client.println("<label for=\"lum-N-num\">Luminosité</label><br />");
            client.println("<input type=\"number\" id=\"lum-N-num\" name=\"Lum-N-num\"");
            client.println("min=\"0\" max=\"100\">");
            client.println("</div><br />");
            //client.println("<button type="submit">Envoyer</button>");
            client.println("<p><a href=\"/envoie\"><button class=\"button\">Envoyer</button></a></p>");
            client.println("<footer>Copyright 2022 TKL</footer>");
            client.println("</body></html>");
            client.println();

            if (header.indexOf("GET /envoie") >= 0) {
              Serial.println("envoie");
              //Serial.println(client.read("footer"));
            }
            
            break;
          
          } else { 
            currentLine = "";
          }
        } else if (c != '\r') {  
          currentLine += c;      
        }
      }
    }

    header = "";

    client.stop();
  }
  
  
}

et le code HTML brut:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>TK : Clignoteur Wi-fi</title>
<style type="text/css">
	*{
		text-align: center;
		margin: auto;
		font-family: arial;

	}

	header {
		background-color: #3AB8BE;
		padding: 5px;
		padding-top: 2%;
		padding-bottom:2%;
		margin-bottom: 2%;
		color: white;
	}
	#jour {
		border-style: solid;
		border-color: #008CBA;
		border-width: 1px;
		max-width: 420px;
		padding: 10px;

	}

	#nuit {
		border-style: solid;
		border-color: #008CBA;
		border-width: 1px;
		max-width: 420px;
		padding: 10px;
	}

	footer {
		color: white;
		background-color: grey;
		width: 100%;
		padding-top: 2%;
		padding-bottom:2%;
		margin-top: 1%;
		text-align: center;
	}

	button{
		background-color: #008CBA;
		color:white;
		padding: 10px;
		border-style: none;
	}

</style>
</head>
<body>

<header>
	<h1>TK : Clignoteur Wi-fi</h1>
</header>



<label>Choisissez votre clignotement</label>
<select name="pets" id="pet-select">
    <select name="pets" id="pet-select">
    <option value="1S/1S">1S/1S</option>
    <option value="1S/2S">1S/2S</option>
    <option value="0,5S/0,5S">0,5S/0,5S</option>
    <option value="0,5S/1S">0,5S/1S</option>
    <option value="0,1S/1S">0,1S/1S</option>
    <option value="0,1S/1,5S">0,1S/1,5S</option>
    <option value="0,1S/2S">0,1S/2S</option>
    <option value="0,1s x 2/1S">0,1s x 2/1S</option>
    <option value="0,1s x 2/1,5S">0,1s x 2/1,5S</option>
    <option value="0,1s x 2/2S">0,1s x 2/2S</option>
</select> <br /><br />



<div id="jour">
	<h2>Configuration Journée</h2><br />
<label for="appt">Heure de journée</label>
<input type="time" id="appt" name="appt" required><br />


  <label for="lum-j-num">Luminosité</label><br />
  <input type="number" id="lum-j-num" name="Lum-j-num"
         min="0" max="100">
</div><br />


<div id="nuit">
		<h2>Configuration Nuit</h2><br />
<label for="appt">Heure de Nuit</label>
<input type="time" id="appt2" name="appt2" required><br />

  <label for="lum-N-num">Luminosité</label><br />
  <input type="number" id="lum-N-num" name="Lum-N-num"
         min="0" max="100">
</div><br />

<button type="submit">Envoyer</button>

<footer>Copyright 2022 JC ARP SIGNAL</footer>

</body>
</html>

En fait, je sais traiter une requête GET, comme on le vois avec le bouton Envoie, mais ce que je ne sais pas faire, c'est récupérer les infos du menu déroulant ainsi que les champs de texte.

Salut.
Tu t'engages dans une voie sans issue. Travailler avec WiFiClient comme serveur WEB sera assurément inconfortable au possible, étant donné que tu devras décortiquer les requêtes à la main.
Le minimum à mon sens serait d'utiliser la classe WebServer, ou mieux, installer AsyncWebServer.

J'ai déjà vu passer quelque chose sur AsyncWebServer. je vais consulter la doc pour comment cela fonctionne.

j'ai un petit code d'exemple si vous voulez qui doit fonctionner sur ESP32 et ESP8266

il vous faudra remplacer les étoiles par votre SSID et mot de passe WiFi

const char*   ssid = "***";
const char*   password = "***";

l'entrée choisie est retournée sous forme de POST (mais vous pouvez changer cela en GET si vous voulez avec peu de modifications)

#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif

#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);

const char*   ssid = "***";
const char*   password = "***";

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ESP32 Liste déroulante</title>
  <style></style>
</head>

<body>
<form method="post" action="selection">
<label for="choixAnimal">Choisir un animal:</label>

<select name="choix" id="choixAnimal" size="1">
    <option selected value="">--Choisissez une option--</option>
    <option value="Chien">Chien</option>
    <option value="Chat">Chat</option>
    <option value="Hamster">Hamster</option>
    <option value="Vache">Vache</option>
    <option value="Poisson rouge">Poisson rouge</option>
    <option value="Lapin">Lapin</option>
</select></body>
<input type="submit" value="Envoyer">
<form>
</html>
)rawliteral";


void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.printf("WiFi non trouvé\n");
    while (true) yield();
  }

  Serial.print("URL à utiliser http://"); Serial.println(WiFi.localIP());

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


  server.on("/selection", HTTP_POST, [] (AsyncWebServerRequest * request) {
    if (request->hasParam("choix", true)) {
      Serial.print("Animal choisi : ");
      Serial.println(request->getParam("choix", true)->value());
      request->send(200, "text/plain", request->getParam("choix", true)->value().c_str());
    } else {
      Serial.println("URL error");
      //List all parameters
      int params = request->params();
      for (int i = 0; i < params; i++) {
        AsyncWebParameter* p = request->getParam(i);
        if (p->isFile()) { //p->isPost() is also true
          Serial.printf("FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
        } else if (p->isPost()) {
          Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
        } else {
          Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
        }
      }
    }
    request->send(404, "text/plain", "Not found");
  });

  // error
  server.onNotFound(notFound);

  server.begin();
}

void loop() {}

Il vaudrait mieux renvoyer autre chose que 404 en réponse à la requête /selection.

Merci beaucoup J-M-L, j’ai cherché longtemps

mais succès, votre code fonctionne à merveille, et en plus le WIFI ne décroche pas sans arrêt avec un smartphone. je ne met pas encore résolu, car j’aurai surement d'autres questions à vous poser. Pour le moment, je vais adapter ce code à mes besoins, je le posterai en entier, si cela peut servir à quelqu'un, on ne sais jamais. Encore merci pour votre aide.

Amusez vous bien !

AP dans ton code, STA dans le code de J-M-L.
Je n'affirme rien, mais il y a peut-être une différence.

Au fait, cette partie là dans le HTML servait à autre chose, vous pouvez la virer


  <script>
    function changeColor() {  
      var animal = document.getElementById("colorPickerID").value;
      console.log("new color chosen : " + choosenColor);
      document.getElementById("colorTextID").innerHTML = choosenColor;
      var httpRequest = new XMLHttpRequest();
      httpRequest.open("GET", "/setColor?color=" + choosenColor.slice(1), true);
      httpRequest.send(null);
    }
</script>

J’ai modifié le post ci dessus

Oui j'ai vue. pour le moment ça avance bien. Je vous tiens au courant des que j'ai terminé.

En fait ce bout de code (un peu différent) servait dans un autre exemple à notifier l’arduino sans avoir à modifier la page web en retour.

tenez voici le même code à tester mais en utilisant AJAX et un GET ➜ la page web ne se ré-affiche pas mais votre ESP est prévenu du changement dans la liste déroulante

ça fonctionne de la façon suivante : quand vous effectuez une modification de la sélection dans le formulaire du popup défini ainsi

<select name="choix" id="choixAnimal" size="1" onchange='changeAnimal(this);'>>

la fonction changeAnimal() est appelée avec en paramètre le popup. Cette fonction fait une requête AJAX en utilisant XMLHttpRequest et déclenche donc un GET avec dans l'URL /selection?choix=XXX ou XXX est l'animal choisi. Il ne vous reste plus donc qu'à écouter les GET sur /selection et extraire le paramètre dans le callback associé à cette URL ➜ c'est ce que fait ce code

    if (request->hasParam("choix")) {
      Serial.print("Animal choisi : ");
      Serial.println(request->getParam("choix")->value());
      request->send(200, "text/plain", "OK");
    } 

à tester

#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif

#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);

const char*   ssid = "***";
const char*   password = "***";

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ESP32 Liste déroulante</title>
  <style></style>
  <script>
    function changeAnimal(sel) {
      console.log(sel.value);
      var httpRequest = new XMLHttpRequest();
      httpRequest.open("GET", "/selection?choix=" + sel.value, true);
      httpRequest.send(null);
    }
</script>
</head>

<body>
<form method="post" action="selection">
<label for="choixAnimal">Choisir un animal:</label>

<select name="choix" id="choixAnimal" size="1" onchange='changeAnimal(this);'>>
    <option selected disabled>--Choisissez une option--</option>
    <option value="Chien">Chien</option>
    <option value="Chat">Chat</option>
    <option value="Hamster">Hamster</option>
    <option value="Vache">Vache</option>
    <option value="Poisson rouge">Poisson rouge</option>
    <option value="Lapin">Lapin</option>
</select></body>
<form>
</html>
)rawliteral";


void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.printf("WiFi non trouvé\n");
    while (true) yield();
  }

  Serial.print("URL à utiliser http://"); Serial.println(WiFi.localIP());

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


  server.on("/selection", HTTP_GET, [] (AsyncWebServerRequest * request) {
    if (request->hasParam("choix")) {
      Serial.print("Animal choisi : ");
      Serial.println(request->getParam("choix")->value());
      request->send(200, "text/plain", "OK");
    } else {
      Serial.println("URL error");
      // debug -> imprime tous les paramètres
      int params = request->params();
      for (int i = 0; i < params; i++) {
        AsyncWebParameter* p = request->getParam(i);
        if (p->isFile()) { //p->isPost() is also true
          Serial.printf("FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
        } else if (p->isPost()) {
          Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
        } else {
          Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
        }
      }
    }
    request->send(404, "text/plain", "Not found");
  });

  // error
  server.onNotFound(notFound);

  server.begin();
}

void loop() {}

Ce code ci fonctionne aussi très bien.
Par contre, on est bien d'accord, que ce soit ce dernier code ou le premier que vous avez posté, créée sont propre réseau, sont propre point d’accès?
car j'ai fait des tests chez un ami et au travail, et ça ne fonctionne pas. J'ai toujours la même réponse WIFI non trouvé. Chez moi, pas de soucis.

Non, je fais WiFi.mode(WIFI_STA); ➜ le STA c'est pour station. donc je suis client de votre réseau WiFi

si vous voulez créer un réseau il faut configurer le NodeMCU ESP8266 en point d’accès (AP = Access Point). Dans ce cas vous utilisez WiFi.softAPConfig(IP, gateway, subnet)

OK, je viens de regarder les différences, effectivement, ce n'est pas la même chose. Il ne me reste plus qu'à modifier mon code.

Bonjour à tous, mon programme est terminé et fonctionnel, je vous le poste:

#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <Arduino.h>
#include <Hash.h>
#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);

#include "RTClib.h"
RTC_DS3231 rtc;

#include <Wire.h>

const int ledPin = D3; // SORTIE 1
//const int ledPin2 = D4; //SORTIE 2

int lum = 100;
String tableau[5][2];
String heurej = "";
String heuren = "";
String lumj = "";
String lumn = "";

const char*   ssid = "AC-ESP8266";
const char*   password = "987654321";

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>TK : Clignoteur Wi-fi</title>
<style type="text/css">
  *{
    text-align: center;
    margin: auto;
    font-family: arial;

  }

  header {
    background-color: #3AB8BE;
    padding: 5px;
    padding-top: 2%;
    padding-bottom:2%;
    margin-bottom: 2%;
    color: white;
  }
  #jour {
    border-style: solid;
    border-color: #008CBA;
    border-width: 1px;
    max-width: 420px;
    padding: 10px;

  }

  #nuit {
    border-style: solid;
    border-color: #008CBA;
    border-width: 1px;
    max-width: 420px;
    padding: 10px;
  }

  footer {
    color: white;
    background-color: grey;
    width: 100%;
    padding-top: 2%;
    padding-bottom:2%;
    margin-top: 1%;
    text-align: center;
  }

  button{
    background-color: #008CBA;
    color:white;
    padding: 10px;
    border-style: none;
  }

</style>
</head>
<body>

<header>
  <h1>TK : Clignoteur Wi-fi</h1>
</header>


<form method="post" action="selection">
<label for="choixCligno">Choisissez votre clignotement</label>

    <select name="pets" id="pet-select">
    <option selected value="">--Choisissez une option--</option>
    <option value="OFF">OFF</option>
    <option value="1S/1S">1S/1S</option>
    <option value="1S/2S">1S/2S</option>
    <option value="0,5S/0,5S">0,5S/0,5S</option>
    <option value="0,5S/1S">0,5S/1S</option>
    <option value="0,1S/1S">0,1S/1S</option>
    <option value="0,1S/1,5S">0,1S/1,5S</option>
    <option value="0,1S/2S">0,1S/2S</option>
    <option value="0,1s x 2/1S">0,1s x 2/1S</option>
    <option value="0,1s x 2/1,5S">0,1s x 2/1,5S</option>
    <option value="0,1s x 2/2S">0,1s x 2/2S</option>
</select> <br /><br />



<div id="jour">
  <h2>Configuration Journée</h2><br />
<label for="appt">Heure de journée</label>
<input type="time" id="appt" name="appt" required><br />


  <label for="lum-j-num">Luminosité</label><br />
  <input type="number" id="lum-j-num" name="Lum-j-num"
         min="0" max="100">
</div><br />


<div id="nuit">
    <h2>Configuration Nuit</h2><br />
<label for="appt">Heure de Nuit</label>
<input type="time" id="appt2" name="appt2" required><br />

  <label for="lum-N-num">Luminosité</label><br />
  <input type="number" id="lum-N-num" name="Lum-N-num"
         min="0" max="100">
</div><br />

<input type="submit" value="Envoyer">

<footer>Copyright 2022 TK</footer>

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

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  rtc.begin();
  WiFi.softAP(ssid, password);
  delay(1000);
  Serial.print("URL à utiliser http://"); 
  Serial.println(WiFi.softAPIP());

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


  server.on("/selection", HTTP_POST, [] (AsyncWebServerRequest * request) {
    if (request->hasParam("pets", true)) {
      
      request->send(200, "text/plain", request->getParam("pets", true)->value().c_str());
    
      
      //List all parameters
      int params = request->params();
      for (int i = 0; i < params; i++) {
        AsyncWebParameter* p = request->getParam(i);
        if (p->isFile()) { //p->isPost() is also true
          Serial.printf("FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
        } else if (p->isPost()) {
          Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
        tableau[i][0] = p->name().c_str();
        tableau[i][1] = p->value().c_str();
        } else {
          Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
        }
      }
    }
    request->send(404, "text/plain", "Not found");
  });

  // error
  server.onNotFound(notFound);

  server.begin();
}

void loop() {
  heurej = tableau[1][1];
  heuren = tableau[3][1];
  
  char sz[128];
  heurej.toCharArray(sz, sizeof(sz));
  String hj[12];
  char *str, *p = sz;
  int i = 0;
  while (str = strtok (p, ":")){
    hj[i] = str;
    p = NULL;
    ++i;
  }
  char sy[128];
  heuren.toCharArray(sy, sizeof(sy));
  String hn[12];
  char *sts, *q = sy;
  int j = 0;
  while (sts = strtok (q, ":")){
    hn[j] = sts;
    q = NULL;
    ++j;
  }
  DateTime now = rtc.now();
  int c_time = now.hour() * 60 + now.minute();
  
  if (c_time >= hj[0].toInt() * 60 + hj[1].toInt()and c_time < hn[0].toInt() * 60 + hn[1].toInt()){
    lum = tableau[2][1].toInt();
    Serial.print("JOUR");
    Serial.print(" ");
    Serial.println(lum);
  }
  else if (c_time >= hn[0].toInt() * 60 + hn[1].toInt() or c_time < hj[0].toInt() * 60 + hj[1].toInt()){
    lum = tableau[4][1].toInt();
    Serial.print("NUIT");
    Serial.print(" ");
    Serial.println(lum);
  }
  
  if (tableau[0][1]=="OFF"){
    lum = 0;
    analogWrite(ledPin, lum);
  }
  if (tableau[0][1]=="1S/1S"){
    analogWrite(ledPin, lum);
    delay(1000);
    analogWrite(ledPin, 0);
    delay(1000);
  }
  if (tableau[0][1]=="1S/2S"){
    analogWrite(ledPin, lum);
    delay(1000);
    analogWrite(ledPin, 0);
    delay(2000);
  }
  if (tableau[0][1]=="0,5S/0,5S"){
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(500);
  }
  if (tableau[0][1]=="0,5S/1S"){
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(1000);
  }
  if (tableau[0][1]=="0,1S/1S"){
    analogWrite(ledPin, lum);
    delay(100);
    analogWrite(ledPin, 0);
    delay(1000);
  }
  if (tableau[0][1]=="0,1S/1,5S"){
    analogWrite(ledPin, lum);
    delay(100);
    analogWrite(ledPin, 0);
    delay(1500);
  }
  if (tableau[0][1]=="0,1S/2S"){
    analogWrite(ledPin, lum);
    delay(100);
    analogWrite(ledPin, 0);
    delay(2000);
  }
  if (tableau[0][1]=="0,1s x 2/1S"){
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(50);
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(1000);
  }
  if (tableau[0][1]=="0,1s x 2/1,5S"){
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(50);
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(1500);
  }
  if (tableau[0][1]=="0,1s x 2/2S"){
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(50);
    analogWrite(ledPin, lum);
    delay(80);
    analogWrite(ledPin, 0);
    delay(2000);
  }
}

Si vous avez des remarques, des suggestions, je suis preneur.
il y a quand même quelque chose que j’aimerai rajouter, c'est EEPROM.h, pour garder en mémoire le type de clignotement, les heures de jour et de nuit ainsi que les luminosités qui correspondent. J'ai testé quelques codes sur ce site et ici et la, mais rien ne fonctionne, ou du moins pas comme il faut. une petite idée?

N'hésite pas à Faire un autre post, avec ton code et la description du disfonctionnement.

Si c’était moi je dégagerais toutes ces Strings pour ne conserver que des identifiants sur un caractère, ça permettrait de faire un switch et pas avoir 3 fois dans le code des chaînes comme "0,1s x 2/2S" (deux fois dans le HTML et une fois dans les comparaisons)

➜ au lieu de

<option value="0,1S/1,5S">0,1S/1,5S</option>

Je mettrais

<option value="X">0,1S/1,5S</option>

Et ‘X’ (qui peut être une lettre ou un chiffre par exemple) me servirait dans le code à différencier le choix dans la liste déroulante. Le code ensuite peut faire un switch() sur ce premier caractère pour décider quoi faire

Et tant qu’à nettoyer le HTML je remplacerais tout ce qui a trait aux animaux de compagnie (pet) qui provient de l’exemple que je vous avez donné.

——

Pour l’EEPROM ni l’ESP8266 ni l’ESP32 n’en embarque il s’agit d’une émulation par écriture dans la mémoire flash. Sur ESP32 il y a la bibliothèque Préférences qui est celle recommandée par le constructeur. Sur ESP8266 vous trouverez plusieurs bibliothèques qui nécessitent un begin() et commit() ou end() mais qui fonctionnent globalement comme la bibliothèque standard sur UNO avec put() et get(). Il y’a aussi une bibliothèque qui reprend la majorité de l’API de la bibliothèque Préférences de l’ESP32 (cf GitHub - vshymanskyy/Preferences: Preferences library for Arduino, ESP8266, RP2040 and Particle. ESP32-compatible API).

Bref il y a du choix :slight_smile:

Sinon comme vous avez une DS3231 vous pouvez utiliser son module EEPROM AT24C32 pour stocker vos octets