Aide expertise Code

Bonjour,
Je viens de terminer mon code mais je pense que l'on peut soit le réduire ou l'améliorer.
Je voudrais votre expertise pour me conseiller.
Et comment le passer en esp 32 si besoin.
Merci

#include <ESP8266WiFi.h>
#include <FastLED.h>
#include <Wire.h> // importation de la bibliothèque I2C
#include <LiquidCrystal_I2C.h> // importation de la bibliothèque écran

LiquidCrystal_I2C lcd(0x27,16,2); // réglage du LCD en adresse I2C 0x27 16 caractères sur 2 lignes

#define NUM_LEDS 24
#define LED_PIN 16

CRGB leds[NUM_LEDS];
int buzzerPin = D7 ;
//const int buzzerPin = D7; //for ESP8266 Microcontroller
const char* ssid = "Nunuche";
const char* password = "*************";
 
int ledPin = 16; 
WiFiServer server(80);
int n;
void setup() 
{
 lcd.init(); // initialisation de l'ecran lcd 
  
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(100);


  // initialisation buzzer
  pinMode(buzzerPin, OUTPUT);
  digitalWrite (buzzerPin, HIGH) ;
  
  
  // initialisation de la communication série
  Serial.begin(115200);

  lcd.backlight();// allumage de la led de retroeclairage
  
  delay(100);

  // initialisation de la sortie pour la led 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 lcd.setCursor(1,0); // positionnement du curseur en position 1, ligne 0
  // Connexion wifi
  //Serial.println();
  lcd.print("Test Connect");
  lcd.setCursor(1,1);
 lcd.print(ssid);
 
  WiFi.begin(ssid, password);

  // connection  en cours ...
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  // Wifi connecter
 
 lcd.setCursor(1,0);
 lcd.print("WiFi connecter");
 
  // Démmarrage du serveur.
 server.begin();
 lcd.setCursor(1,1);
 lcd.print("Serveur ok !");
 //delay(4000);

 
  // Démmarrage du serveur.
  
  server.begin();
 lcd.setCursor(1,0);
 lcd.print(" adresse URL  ");  
 lcd.setCursor(1,1);
 lcd.print(WiFi.localIP());
 delay(6000);
 lcd.noBacklight(); // turn off backlight

  // démarrage en blue
 
 for(int n;n<=24;n++)
  leds[n] = CRGB::Blue;
        FastLED.show();
}
 
void loop() 
{

WiFiClient client;

  
  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }
 
  // Attendre si le client envoie des données ...
  Serial.println("nouveau client");
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  int value = LOW;
  if (request.indexOf("/LED=GREEN") != -1)  {
      for(int n;n<=24;n++)
      
      {
        digitalWrite (buzzerPin, HIGH) ; //no tone
        leds[n] = CRGB::Green;
        FastLED.show();
      }
  }
  if (request.indexOf("/LED=RED") != -1)  {
      for(int n;n<=24;n++)
      {
        digitalWrite (buzzerPin, LOW) ;
        leds[n] = CRGB::Red;
        FastLED.show();
      }
  }
         if (request.indexOf("/LED=BLUE") != -1)  {
      for(int n;n<=24;n++)
      {
        digitalWrite (buzzerPin, HIGH) ; //no tone
        leds[n] = CRGB::Blue;
        FastLED.show();
      }
    }
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); 
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print("Etat de la led : ");
 
  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=GREEN\"\"><button>Libre </button></a>");
  client.println("<a href=\"/LED=RED\"\"><button>Occupe </button></a><br />");
  client.println("<a href=\"/LED=BLUE\"\"><button>OFF </button></a><br />");  
  client.println("</html>");
 
  delay(1);
  Serial.println("Client deconnecter");
  lcd.print("Client deconnecter");
  Serial.println("");
 
}

Indentez le code, ça facilite la lecture.

Vous définissez deux fois sous des formes différentes la pin 16
Sinon Les pins sont mieux en const byte

const byte buzzerPin = D7;
const byte ledPin = 16;  // ce serait mieux d'utiliser une notation cohérente pour les pins

faites un lcd.print("WiFi OK"); ➜ ça évitera la faute d'hoctografe. :slight_smile:
un petit délai juste après vous permettra de lire ce message

(idem pour "Client déconnecté" mais le LCD ne mettra pas l'accent et de toutes façons ça ne tient pas sur 16 caractères...)

vous avez deux fois server.begin();

il existe une fonction fillSolid qui pourrait remplacer

  for (int n; n <= 24; n++)   leds[n] = CRGB::Blue;

Pour vous simplifier la vie vous pourriez prendre la bibliothèque ESPAsyncWebServer que ce soit sur ESP8266 ou ESP32

Merci beaucoup pour tous ces conseils

Si l'instance de FastLED est déclarée dans le setup, elle ne sera pas connue dans la loop (sauf erreur)

Non c'est bien comme cela, c'est un peu comme Serial

FastLED est prédéclaré de manière globale et quand vous faites FastLED.addLeds vous ne faites que fournir la configuration.

OK, je vois merci. Je suppose alors qu'il ne sert à rien de déclarer une autre instance, au cas où on en voudrait plusieurs ? On ajoute une nouvelle ligne
FastLED.addLeds<WS2812B, LED_PIN2, GRB>(leds2, NUM_LEDS2);
avec un second tableau déclaré auparavant avec CRGB leds2[NUM_LEDS2] ?

Oui par exemple on peut avoir différentes options

Bonjour
J'ai fais toutes les modifications et tous fonctionne sur ESP8266, j'essais de modifier mon code avec
ESPAsyncWebServer ,AsyncTCP.h et WiFi.h pour esp 32 mais je n'arrive pas modifier mon code html pour cette bibliothèque

Qu'est-ce que vous n'arrivez pas à faire ?

J'ai suivi tous vos conseils sur mon premier code ,mais je n'arrive pas a le faire fonctionné en esp32 voici le premier code.

#include <ESP8266WiFi.h>
#include <FastLED.h>
#include <Wire.h> // importation de la bibliothèque I2C
#include <LiquidCrystal_I2C.h> // importation de la bibliothèque écran

LiquidCrystal_I2C lcd(0x27, 16, 2); // réglage du LCD en adresse I2C 0x27 16 caractères sur 2 lignes

#define NUM_LEDS 24
#define LED_PIN 16

CRGB leds[NUM_LEDS];
//int buzzerPin = D7 ;

const byte buzzerPin = D7;
const byte ledPin = 16;  // ce serait mieux d'utiliser une notation cohérente pour les pins
//const int buzzerPin = D7; //for ESP8266 Microcontroller
const char* ssid = "Nunuche";
const char* password = "*********";

//int ledPin = 16;
WiFiServer server(80);
int n;
void setup()
{
  lcd.init(); // initialisation de l'ecran lcd

  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(50);


  // initialisation buzzer
  pinMode(buzzerPin, OUTPUT);
  digitalWrite (buzzerPin, HIGH) ;


  // initialisation de la communication série
  Serial.begin(115200);

  lcd.backlight();// allumage de la led de retroeclairage

  delay(100);

  // initialisation de la sortie pour la led
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.setCursor(1, 0); // positionnement du curseur en position 1, ligne 0
  // Connexion wifi
  //Serial.println();
  lcd.print("Test Connect");
  lcd.setCursor(1, 1);
  lcd.print(ssid);

  WiFi.begin(ssid, password);

  // connection  en cours ...
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  // Wifi connecter

  lcd.setCursor(1, 0);
  lcd.print("WiFi OK");

  // Démmarrage du serveur.
  //server.begin();
  //lcd.setCursor(1,1);
  // lcd.print("Serveur ok !");
  //delay(4000);


  // Démmarrage du serveur.

  server.begin();
  lcd.setCursor(1, 0);
  lcd.print(" adresse URL  ");
  lcd.setCursor(1, 1);
  lcd.print(WiFi.localIP());
  delay(6000);
  lcd.noBacklight(); // turn off backlight

  // démarrage en blue
  fill_solid(leds, NUM_LEDS, CRGB::Aqua);
  FastLED.show();

}

void loop()
{

  WiFiClient client;


  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }

  // Attendre si le client envoie des données ...
  Serial.println("nouveau client");
  while (!client.available()) {
    delay(1);
  }

  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  int value = LOW;
  if (request.indexOf("/LED=GREEN") != -1)  {
    for (int n; n <= 24; n++)

    {
      digitalWrite (buzzerPin, HIGH) ; //no tone
      leds[n] = CRGB::Green;
      FastLED.show();
    }
  }
  if (request.indexOf("/LED=RED") != -1)  {
    for (int n; n <= 24; n++)
    {
      digitalWrite (buzzerPin, LOW) ;
      leds[n] = CRGB::Red;
      FastLED.show();
    }
  }
  if (request.indexOf("/LED=BLUE") != -1)  {
    for (int n; n <= 24; n++)
    {
      digitalWrite (buzzerPin, HIGH) ; //no tone
      leds[n] = CRGB::Blue;
      FastLED.show();
    }
  }
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Etat de la led : ");

  if (value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=GREEN\"\"><button>Libre </button></a>");
  client.println("<a href=\"/LED=RED\"\"><button>Occupe </button></a><br />");
  client.println("<a href=\"/LED=BLUE\"\"><button>OFF </button></a><br />");
  client.println("</html>");

  delay(1);
  Serial.println("Client deconnecter");
  lcd.print("Client deco");
  fill_solid(leds, NUM_LEDS, CRGB::Purple);
  FastLED.show();
  Serial.println("");

}

le premier code avait déjà été posté. La question était que n'arrivez vous pas à faire avec la bibliothèque ESPAsyncWebServer et qu'avez vous essayé ?

Voici le message erreur
Non utilisé : C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.51.0_x86__mdqgnx93n4wtt\libraries\WiFi
exit status 1
Erreur de compilation pour la carte ESP32 Dev Module

Voici le debut de mes modifications

#include <WiFi.h>
#include <FastLED.h>
#include <Wire.h> // importation de la bibliothèque I2C
#include <LiquidCrystal_I2C.h> // importation de la bibliothèque écran
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>


LiquidCrystal_I2C lcd(0x27, 16, 2); // réglage du LCD en adresse I2C 0x27 16 caractères sur 2 lignes

#define NUM_LEDS 24
#define LED_PIN 16

CRGB leds[NUM_LEDS];


const byte buzzerPin = D7;
const byte ledPin = 16;  

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

AsyncWebServer server(80);

int n;
void setup()
{
  lcd.init(); // initialisation de l'ecran lcd

  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(50);


  // initialisation buzzer
  pinMode(buzzerPin, OUTPUT);
  digitalWrite (buzzerPin, HIGH) ;


  // initialisation de la communication série
  Serial.begin(115200);

  lcd.backlight();// allumage de la led de retroeclairage

  delay(100);

  // initialisation de la sortie pour la led
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.setCursor(1, 0); // positionnement du curseur en position 1, ligne 0
  // Connexion wifi
  //Serial.println();
  lcd.print("Test Connect");
  lcd.setCursor(1, 1);
  lcd.print(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // connection  en cours ...
   while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connect OK");
  }
  {
    delay(500);
    Serial.print(".");
  }

  // Wifi connecter

  lcd.setCursor(1, 0);
  lcd.print("WiFi OK");
  
  // Démmarrage du serveur.

  server.begin();
  lcd.setCursor(1, 0);
  lcd.print(" adresse URL  ");
  lcd.setCursor(1, 1);
  lcd.print(WiFi.localIP());
  delay(6000);
  lcd.noBacklight(); // turn off backlight

  // démarrage en blue
  fill_solid(leds, NUM_LEDS, CRGB::Aqua);
  FastLED.show();

}

void loop()
{

  WiFiClient client;


  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }

  // Attendre si le client envoie des données ...
  Serial.println("nouveau client");
  while (!client.available()) {
    delay(1);
  }

  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  int value = LOW;
  if (request.indexOf("/LED=GREEN") != -1)  {
    for (int n; n <= 24; n++)

    {
      digitalWrite (buzzerPin, HIGH) ; //no tone
      leds[n] = CRGB::Green;
      FastLED.show();
    }
  }
  if (request.indexOf("/LED=RED") != -1)  {
    for (int n; n <= 24; n++)
    {
      digitalWrite (buzzerPin, LOW) ;
      leds[n] = CRGB::Red;
      FastLED.show();
    }
  }
  if (request.indexOf("/LED=BLUE") != -1)  {
    for (int n; n <= 24; n++)
    {
      digitalWrite (buzzerPin, HIGH) ; //no tone
      leds[n] = CRGB::Blue;
      FastLED.show();
    }
  }
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Etat de la led : ");

  if (value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=GREEN\"\"><button>Libre </button></a>");
  client.println("<a href=\"/LED=RED\"\"><button>Occupe </button></a><br />");
  client.println("<a href=\"/LED=BLUE\"\"><button>OFF </button></a><br />");
  client.println("</html>");

  delay(1);
  Serial.println("Client deconnecter");
  lcd.print("Client deco");
  fill_solid(leds, NUM_LEDS, CRGB::Purple);
  FastLED.show();
  Serial.println("");

}

il n'y a plus de client à gérer avec cette bibliothèque, vous décrivez quelle fonction appeler si une URL particulière est déclenchée

partez d'un des exemples fourni

ok merci

Tenez voici une structure de base pour vous aider (non testée)

#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 = "Couleur LED : %LED_STATE% <br><br><a href=\"/ledGreen\"\"><button>Libre</button></a><br><br><a href=\"/ledRed\"\"><button>En Service</button></a><br><br><a href=\"/ledOff\"\"><button> **OFF** </button></a>";



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

enum : byte {LED_VERTE, LED_ROUGE, LED_BLEUE} etatLed = LED_BLEUE;
bool ledIsOn = false;

String remplacement(const String& var)
{
  if (var == "LED_STATE") {
    switch (etatLed) {
      case LED_VERTE:   return F("VERTE");    break;
      case LED_ROUGE:   return F("ROUGE");    break;
      case LED_BLEUE: return F("BLEUE");  break;
    }
  }
  return String();
}

void homePage(AsyncWebServerRequest *request) {
  request->send_P(200, "text/html", index_html, remplacement);
}

void ledGreen(AsyncWebServerRequest *request) {
  Serial.println("METTRE LES LEDS EN VERT");
  etatLed = LED_VERTE;
  request->send_P(200, "text/html", index_html, remplacement);
}

void ledRed(AsyncWebServerRequest *request) {
  Serial.println("METTRE LES LEDS EN ROUGE");
  etatLed = LED_ROUGE;
  request->send_P(200, "text/html", index_html, remplacement);
}

void ledBlue(AsyncWebServerRequest *request) {
  Serial.println("METTRE LES LEDS EN BLEU");
  etatLed = LED_BLEUE;
  request->send_P(200, "text/html", index_html, remplacement);
}

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

  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  server.onNotFound(notFound);
  server.on("/", homePage);
  server.on("/ledGreen", ledGreen);
  server.on("/ledRed", ledRed);
  server.on("/ledOff", ledBlue);
  server.begin();
}

void loop() {}

il y a quelques concepts à comprendre

1/ on prépare le HTML et s'il y a des éléments dynamiques comme la couleur de la LED, on met un texte à remplacer entre %%. (ici j'ai mis %LED_STATE% dans le HTML)

2/ on écrit une fonction qui reçoit en paramètre un texte à remplacer et fournit en réponse le texte réel. ici c'est ma fonction remplacement()

3/ on dit au serveur comment gérer les URLs, ici j'ai enregistré 4 URL plus la gestion d'URL inconnues

  server.onNotFound(notFound);
  server.on("/", homePage);
  server.on("/ledGreen", ledGreen);
  server.on("/ledRed", ledRed);
  server.on("/ledOff", ledBlue);

par exemple ça dit que si l'URL qu'on reçoit c'est la racine "/", alors appeler la fonction homePage(). Si l'URL qu'on reçoit c'est la "/ledGreen", alors appeler la fonction ledGreen() etc

4/ il ne reste plus qu'à écrire les callbacks (ces fonctions) pour effectuer l'action demandée et retourner une page HTML. Ici je retourne toujours la même.


Si le code est correct, vous devriez voir dans le moniteur série l'adresse IP du serveur et une mini page avec 3 boutons. quand vous appuyez sur les boutons une commande est envoyée et traitée avec affichage dans le moniteur série puis la page est mise à jour.