
Dans ce projet de commande de variateur avec serveur web, nous allons apprendre à créer avec ESP8266 et ESP32 un serveur web à slider qui contrôlera le niveau de tension de variation du variateur connecté à la broche GPIO de l'ESP8266 / ESP32.
Cela sera réalisé grâce à un slider HTML que nous ajouterons à la page du serveur web. Le slider sera déplacé pour définir sa valeur. En réponse, cette valeur du slider définira la valeur du variateur.
De plus, nous utilisons la bibliothèque WiFiManager qui vous permet de connecter votre projet de variateur basé sur ESP8266/ESP32 à différents points d'accès (AP) sans avoir à coder en dur et téléverser un nouveau code sur votre carte. Vous pouvez également ajouter des paramètres personnalisés (variables ou adresse serveur/port MQTT) et gérer plusieurs connexions SSID avec la bibliothèque WiFiManager.
Ci-dessous, vous trouverez 2 exemples de code. Le premier pour un variateur 1 canal et le second pour un variateur 4 canaux avec 4 sliders sur la page web.
CODE VARIATEUR 1 canal
- #include <AsyncTCP.h>
- #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
- #define outputPin 16
- #define zerocross 5 // configuration des broches
- dimmerLamp dimmer(outputPin, zerocross); //initialisation du port pour le variateur pour les cartes ESP8266, ESP32, Arduino Due
- #if defined(ESP8266)
- #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
- #else
- #include <WiFi.h> //Pour ESP32
- #endif
- #include <ESPAsyncWebServer.h>
- #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
- //appelé lorsque WiFiManager entre en mode configuration
- void configModeCallback (AsyncWiFiManager *myWiFiManager) {
- Serial.println("Entered config mode");
- Serial.println(WiFi.softAPIP());
- //si un SSID généré automatiquement a été utilisé, l'afficher
- Serial.println(myWiFiManager->getConfigPortalSSID());
- }
- AsyncWebServer server(80);
- DNSServer dns;
- String sliderValue = "0";
- const char* PARAM_INPUT = "value";
- const char index_html[] PROGMEM = R"rawliteral(
- <!DOCTYPE HTML><html>
- <head>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Dimmer ESP Controller</title>
- <style>
- html {font-family: Arial; display: inline-block; text-align: center;}
- h2 {font-size: 2.3rem;}
- p {font-size: 1.9rem;}
- body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
- .slider { -webkit-appearance: none; margin: 14px; width: 360px; height: 25px; background: #FFD65C;
- outline: none; -webkit-transition: .2s; transition: opacity .2s;}
- .slider::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background: #003249; cursor: pointer;}
- .slider::-moz-range-thumb { width: 35px; height: 35px; background: #003249; cursor: pointer; }
- .button { background-color: #003249; border: none; color: white; padding: 16px 40px;}
- </style>
- </head>
- <body>
- <h2>RocketController Dimmer</h2>
- <p><span id="textSliderValue">%SLIDERVALUE%</span></p>
- <p><input type="range" onchange="updateSliderPWM(this)" id="pwmSlider" min="0" max="100" value="%SLIDERVALUE%" step="1" class="slider"></p>
- </br>
- <p><a href=/output/on\><button class=\"button\">WiFi RST</button></a></p>
- <script>
- function updateSliderPWM(element) {
- var sliderValue = document.getElementById("pwmSlider").value;
- document.getElementById("textSliderValue").innerHTML = sliderValue;
- console.log(sliderValue);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "/slider?value="+sliderValue, true);
- xhr.send();
- }
- </script>
- </body>
- </html>
- )rawliteral";
- // Remplace le placeholder par la section bouton dans votre page web
- String processor(const String& var){
- //Serial.println(var);
- if (var == "SLIDERVALUE"){
- return sliderValue;
- }
- return String();
- }
- void setup() {
- // insérez votre code d'initialisation ici, exécuté une seule fois :
- Serial.begin(115200);
- dimmer.begin(NORMAL_MODE, OND);
- //WiFiManager. Initialisation locale. Une fois son travail terminé, il n'est plus nécessaire de le conserver
- AsyncWiFiManager wifiManager(&server,&dns);
- //réinitialiser les paramètres - pour les tests
- //wifiManager.resetSettings();
- //définir le callback appelé lorsque la connexion au WiFi précédent échoue et passe en mode point d'accès
- //wifiManager.setAPCallback(configModeCallback);
- //récupère le SSID et le mot de passe et tente de se connecter
- //et entre dans une boucle bloquante en attente de configuration
- if (!wifiManager.autoConnect("WiFi-Dimmer")) {
- Serial.println("failed to connect and hit timeout");
- //réinitialiser et réessayer, ou mettre en veille profonde
- //ESP.resetSettings();
- //ESP.reset();
- //ESP.restart();
- delay(1000);
- }
- //si vous arrivez ici, vous êtes connecté au WiFi
- Serial.println("connected!");
- // Route pour la page web racine
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
- request->send_P(200, "text/html", index_html, processor);
- });
- // Envoyer une requête GET à <ESP_IP>/slider?value=<inputMessage>
- server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
- String inputMessage;
- // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
- if (request->hasParam(PARAM_INPUT)) {
- inputMessage = request->getParam(PARAM_INPUT)->value();
- sliderValue = inputMessage;
- dimmer.setPower(sliderValue.toInt()); //VARIATION
- }
- else {
- inputMessage = "No message sent";
- }
- //Serial.println(inputMessage);
- Serial.println(sliderValue);
- request->send(200, "text/plain", "OK");
- });
- // Démarrer le serveur
- server.begin();
- }
- void loop() {
- // insérez votre code principal ici, exécuté en boucle :
- }
CODE VARIATEUR 4 canaux
- #include <AsyncTCP.h>
- #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
- #define outputPin 16
- #define zerocross 5 // configuration des broches
- dimmerLamp dimmer(outputPin, zerocross); //initialisation du port pour le variateur pour les cartes ESP8266, ESP32, Arduino Due
- #if defined(ESP8266)
- #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
- #else
- #include <WiFi.h> //pour ESP32
- #endif
- #include <ESPAsyncWebServer.h>
- #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
- //appelé lorsque WiFiManager entre en mode configuration
- void configModeCallback (AsyncWiFiManager *myWiFiManager) {
- Serial.println("Entered config mode");
- Serial.println(WiFi.softAPIP());
- //si un SSID généré automatiquement a été utilisé, l'afficher
- Serial.println(myWiFiManager->getConfigPortalSSID());
- }
- AsyncWebServer server(80);
- DNSServer dns;
- //=====
- String sliderValue = "0";
- String sliderValue2 = "0";
- String sliderValue3 = "0";
- String sliderValue4 = "0";
- const char* PARAM_INPUT = "value";
- const char index_html[] PROGMEM = R"rawliteral(
- <!DOCTYPE HTML><html>
- <head>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Dimmer ESP Controller</title>
- <style>
- html {font-family: Arial; display: inline-block; text-align: center;}
- h2 {font-size: 2.3rem;}
- p {font-size: 1.9rem;}
- body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
- .slider { -webkit-appearance: none; margin: 14px; width: 360px; height: 25px; background: #FFD65C;
- outline: none; -webkit-transition: .2s; transition: opacity .2s;}
- .slider::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background: #003249; cursor: pointer;}
- .slider::-moz-range-thumb { width: 35px; height: 35px; background: #003249; cursor: pointer; }
- .button { background-color: #003249; border: none; color: white; padding: 16px 40px;}
- </style>
- </head>
- <body>
- <h2>Dimmer ESP Controller</h2>
- <p><span id="textSliderValue">%SLIDERVALUE%</span></p>
- <p><input type="range" onchange="updateSliderPWM(this)" id="pwmSlider" min="0" max="100" value="%SLIDERVALUE%" step="1" class="slider"></p>
- </br>
- <h2>Dimmer ESP Controller2</h2>
- <p><span id="textSliderValue2">%SLIDERVALUE2%</span></p>
- <p><input type="range" onchange="updateSliderPWM2(this)" id="pwmSlider" min="0" max="100" value2="%SLIDERVALUE2%" step="1" class="slider"></p>
- </br>
- <h2>Dimmer ESP Controller3</h2>
- <p><span id="textSliderValue3">%SLIDERVALUE3%</span></p>
- <p><input type="range" onchange="updateSliderPWM3(this)" id="pwmSlider" min="0" max="100" value3="%SLIDERVALUE3%" step="1" class="slider"></p>
- </br>
- <h2>Dimmer ESP Controller4</h2>
- <p><span id="textSliderValue4">%SLIDERVALUE4%</span></p>
- <p><input type="range" onchange="updateSliderPWM4(this)" id="pwmSlider" min="0" max="100" value4="%SLIDERVALUE4%" step="1" class="slider"></p>
- </br>
- <p><a href=/output/on\><button class=\"button\">WiFi RST</button></a></p>
- <script>
- function updateSliderPWM (element) {
- var sliderValue = document.getElementById("pwmSlider").value;
- document.getElementById("textSliderValue").innerHTML = sliderValue;
- console.log(sliderValue);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "/slider?value="+sliderValue, true);
- xhr.send();
- }
- function updateSliderPWM2 (element) {
- var sliderValue2 = document.getElementById("pwmSlider2").value2;
- document.getElementById("textSliderValue2").innerHTML = sliderValue2;
- console.log(sliderValue2);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "/slider?value="+sliderValue2, true);
- xhr.send();
- }
- function updateSliderPWM3 (element) {
- var sliderValue3 = document.getElementById("pwmSlider3").value3;
- document.getElementById("textSliderValue3").innerHTML = sliderValue3;
- console.log(sliderValue3);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "/slider?value="+sliderValue3, true);
- xhr.send();
- }
- function updateSliderPWM4 (element) {
- var sliderValue4 = document.getElementById("pwmSlider4").value4;
- document.getElementById("textSliderValue4").innerHTML = sliderValue4;
- console.log(sliderValue4);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "/slider?value="+sliderValue4, true);
- xhr.send();
- }
- </script>
- </body>
- </html>
- )rawliteral";
- // Remplace le placeholder par la section bouton dans votre page web
- String processor(const String& var){
- //Serial.println(var);
- if (var == "SLIDERVALUE"){
- return sliderValue;
- }
- if (var == "SLIDERVALUE2"){
- return sliderValue2;
- }
- if (var == "SLIDERVALUE3"){
- return sliderValue3;
- }
- if (var == "SLIDERVALUE4"){
- return sliderValue4;
- }
- return String();
- }
- void setup() {
- // insérez votre code d'initialisation ici, exécuté une seule fois :
- Serial.begin(115200);
- dimmer.begin(NORMAL_MODE, OND);
- //WiFiManager
- //Initialisation locale. Une fois son travail terminé, il n'est plus nécessaire de le conserver
- AsyncWiFiManager wifiManager(&server,&dns);
- //réinitialiser les paramètres - pour les tests
- //wifiManager.resetSettings();
- //définir le callback appelé lorsque la connexion au WiFi précédent échoue et passe en mode point d'accès
- //wifiManager.setAPCallback(configModeCallback);
- //récupère le SSID et le mot de passe et tente de se connecter
- //et entre dans une boucle bloquante en attente de configuration
- if (!wifiManager.autoConnect("WiFi-Dimmer")) {
- Serial.println("failed to connect and hit timeout");
- //réinitialiser et réessayer, ou mettre en veille profonde
- //ESP.resetSettings();
- //ESP.reset();
- //ESP.restart();
- delay(1000);
- }
- //si vous arrivez ici, vous êtes connecté au WiFi
- Serial.println("connected...yeey :)");
- // Route pour la page web racine
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
- request->send_P(200, "text/html", index_html, processor);
- });
- // Envoyer une requête GET à <ESP_IP>/slider?value=<inputMessage>
- server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
- String inputMessage;
- // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
- if (request->hasParam(PARAM_INPUT)) {
- inputMessage = request->getParam(PARAM_INPUT)->value();
- sliderValue = inputMessage;
- dimmer.setPower(sliderValue.toInt());
- }
- String inputMessage2;
- // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
- if (request->hasParam(PARAM_INPUT)) {
- inputMessage2 = request->getParam(PARAM_INPUT)->value();
- sliderValue2 = inputMessage2;
- }
- else {
- inputMessage = "No message sent";
- }
- //Serial.println(inputMessage);
- Serial.println(sliderValue);
- Serial.print("DIM2");
- Serial.println(sliderValue2);
- Serial.print("DIM3");
- Serial.println(sliderValue3);
- Serial.print("DIM4");
- Serial.println(sliderValue4);
- request->send(200, "text/plain", "OK");
- });
- // Démarrer le serveur
- server.begin();
- }
- void loop() {
- // insérez votre code principal ici, exécuté en boucle :
- }
Étape 1. Configuration de l'accès Wi-Fi.
WiFiManager est une excellente bibliothèque à ajouter à vos projets ESP8266/ESP32, car grâce à elle, vous n'avez plus besoin de coder en dur vos identifiants réseau (SSID et mot de passe). Votre ESP se connectera automatiquement à un réseau connu ou créera un point d'accès que vous pourrez utiliser pour configurer les identifiants réseau. Voici comment ce processus fonctionne :
- Lorsque votre ESP8266/ESP32 démarre, il est configuré en mode Station et tente de se connecter à un point d'accès précédemment enregistré (une combinaison SSID et mot de passe connue) ;
- Si ce processus échoue, l'ESP passe en mode point d'accès ;
- À l'aide de n'importe quel appareil Wi-Fi équipé d'un navigateur, connectez-vous au point d'accès nouvellement créé (WiFi-Dimmer) ;
- Après avoir établi une connexion avec « WiFi-Dimmer », vous pouvez accéder à l'adresse IP par défaut 192.168.4.1 pour ouvrir une page web qui vous permet de configurer votre SSID et votre mot de passe ;
- Une fois un nouveau SSID et un nouveau mot de passe définis, l'ESP redémarre et tente de se connecter ;
S'il établit une connexion, le processus est terminé avec succès. Sinon, il sera configuré en tant que point d'accès.

Étape 2. Slider du serveur web et variation.
- L'ESP8266/ESP32 héberge un serveur web qui affiche une page web avec un slider ;
- Lorsque vous déplacez le slider, vous envoyez une requête HTTP à l'ESP8266/ESP32 avec la nouvelle valeur du slider ;
- La requête HTTP se présente sous le format suivant : GET/slider?value=SLIDERVALUE, où SLIDERVALUE est un nombre entre 0 et 100 ;
- À partir de la requête HTTP, l'ESP8266/ESP32 obtient la valeur actuelle du slider ;
- L'ESP8266 ajuste la valeur du variateur en fonction de la valeur du slider : dimmer.setPower(sliderValue.toInt()); //VARIATION ;
Pour le variateur 4 canaux, la page web affiche 4 sliders.
