Se rendre au contenu

Dimmer controller – ESP32/8266 web server with slider Arduino code.

28 mars 2025 par
Dimmer controller – ESP32/8266 web server with slider Arduino code.
Administrator
| Aucun commentaire pour l'instant


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

  1. #include <AsyncTCP.h>
  2. #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
  3. #define outputPin 16
  4. #define zerocross 5 // configuration des broches
  5. dimmerLamp dimmer(outputPin, zerocross); //initialisation du port pour le variateur pour les cartes ESP8266, ESP32, Arduino Due
  6. #if defined(ESP8266)
  7. #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
  8. #else
  9. #include <WiFi.h> //Pour ESP32
  10. #endif
  11. #include <ESPAsyncWebServer.h>
  12. #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
  13. //appelé lorsque WiFiManager entre en mode configuration
  14. void configModeCallback (AsyncWiFiManager *myWiFiManager) {
  15. Serial.println("Entered config mode");
  16. Serial.println(WiFi.softAPIP());
  17. //si un SSID généré automatiquement a été utilisé, l'afficher
  18. Serial.println(myWiFiManager->getConfigPortalSSID());
  19. }
  20. AsyncWebServer server(80);
  21. DNSServer dns;
  22. String sliderValue = "0";
  23. const char* PARAM_INPUT = "value";
  24. const char index_html[] PROGMEM = R"rawliteral(
  25. <!DOCTYPE HTML><html>
  26. <head>
  27. <meta name="viewport" content="width=device-width, initial-scale=1">
  28. <title>Dimmer ESP Controller</title>
  29. <style>
  30. html {font-family: Arial; display: inline-block; text-align: center;}
  31. h2 {font-size: 2.3rem;}
  32. p {font-size: 1.9rem;}
  33. body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
  34. .slider { -webkit-appearance: none; margin: 14px; width: 360px; height: 25px; background: #FFD65C;
  35. outline: none; -webkit-transition: .2s; transition: opacity .2s;}
  36. .slider::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background: #003249; cursor: pointer;}
  37. .slider::-moz-range-thumb { width: 35px; height: 35px; background: #003249; cursor: pointer; }
  38. .button { background-color: #003249; border: none; color: white; padding: 16px 40px;}
  39. </style>
  40. </head>
  41. <body>
  42. <h2>RocketController Dimmer</h2>
  43. <p><span id="textSliderValue">%SLIDERVALUE%</span></p>
  44. <p><input type="range" onchange="updateSliderPWM(this)" id="pwmSlider" min="0" max="100" value="%SLIDERVALUE%" step="1" class="slider"></p>
  45. </br>
  46. <p><a href=/output/on\><button class=\"button\">WiFi RST</button></a></p>
  47. <script>
  48. function updateSliderPWM(element) {
  49. var sliderValue = document.getElementById("pwmSlider").value;
  50. document.getElementById("textSliderValue").innerHTML = sliderValue;
  51. console.log(sliderValue);
  52. var xhr = new XMLHttpRequest();
  53. xhr.open("GET", "/slider?value="+sliderValue, true);
  54. xhr.send();
  55. }
  56. </script>
  57. </body>
  58. </html>
  59. )rawliteral";
  60. // Remplace le placeholder par la section bouton dans votre page web
  61. String processor(const String& var){
  62. //Serial.println(var);
  63. if (var == "SLIDERVALUE"){
  64. return sliderValue;
  65. }
  66. return String();
  67. }
  68. void setup() {
  69. // insérez votre code d'initialisation ici, exécuté une seule fois :
  70. Serial.begin(115200);
  71. dimmer.begin(NORMAL_MODE, OND);
  72. //WiFiManager. Initialisation locale. Une fois son travail terminé, il n'est plus nécessaire de le conserver
  73. AsyncWiFiManager wifiManager(&server,&dns);
  74. //réinitialiser les paramètres - pour les tests
  75. //wifiManager.resetSettings();
  76. //définir le callback appelé lorsque la connexion au WiFi précédent échoue et passe en mode point d'accès
  77. //wifiManager.setAPCallback(configModeCallback);
  78. //récupère le SSID et le mot de passe et tente de se connecter
  79. //et entre dans une boucle bloquante en attente de configuration
  80. if (!wifiManager.autoConnect("WiFi-Dimmer")) {
  81. Serial.println("failed to connect and hit timeout");
  82. //réinitialiser et réessayer, ou mettre en veille profonde
  83. //ESP.resetSettings();
  84. //ESP.reset();
  85. //ESP.restart();
  86. delay(1000);
  87. }
  88. //si vous arrivez ici, vous êtes connecté au WiFi
  89. Serial.println("connected!");
  90. // Route pour la page web racine
  91. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  92. request->send_P(200, "text/html", index_html, processor);
  93. });
  94. // Envoyer une requête GET à <ESP_IP>/slider?value=<inputMessage>
  95. server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
  96. String inputMessage;
  97. // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
  98. if (request->hasParam(PARAM_INPUT)) {
  99. inputMessage = request->getParam(PARAM_INPUT)->value();
  100. sliderValue = inputMessage;
  101. dimmer.setPower(sliderValue.toInt()); //VARIATION
  102. }
  103. else {
  104. inputMessage = "No message sent";
  105. }
  106. //Serial.println(inputMessage);
  107. Serial.println(sliderValue);
  108. request->send(200, "text/plain", "OK");
  109. });
  110. // Démarrer le serveur
  111. server.begin();
  112. }
  113. void loop() {
  114. // insérez votre code principal ici, exécuté en boucle :
  115. }


CODE VARIATEUR 4 canaux

  1. #include <AsyncTCP.h>
  2. #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
  3. #define outputPin 16
  4. #define zerocross 5 // configuration des broches
  5. dimmerLamp dimmer(outputPin, zerocross); //initialisation du port pour le variateur pour les cartes ESP8266, ESP32, Arduino Due
  6. #if defined(ESP8266)
  7. #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
  8. #else
  9. #include <WiFi.h> //pour ESP32
  10. #endif
  11. #include <ESPAsyncWebServer.h>
  12. #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
  13. //appelé lorsque WiFiManager entre en mode configuration
  14. void configModeCallback (AsyncWiFiManager *myWiFiManager) {
  15. Serial.println("Entered config mode");
  16. Serial.println(WiFi.softAPIP());
  17. //si un SSID généré automatiquement a été utilisé, l'afficher
  18. Serial.println(myWiFiManager->getConfigPortalSSID());
  19. }
  20. AsyncWebServer server(80);
  21. DNSServer dns;
  22. //=====
  23. String sliderValue = "0";
  24. String sliderValue2 = "0";
  25. String sliderValue3 = "0";
  26. String sliderValue4 = "0";
  27. const char* PARAM_INPUT = "value";
  28. const char index_html[] PROGMEM = R"rawliteral(
  29. <!DOCTYPE HTML><html>
  30. <head>
  31. <meta name="viewport" content="width=device-width, initial-scale=1">
  32. <title>Dimmer ESP Controller</title>
  33. <style>
  34. html {font-family: Arial; display: inline-block; text-align: center;}
  35. h2 {font-size: 2.3rem;}
  36. p {font-size: 1.9rem;}
  37. body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
  38. .slider { -webkit-appearance: none; margin: 14px; width: 360px; height: 25px; background: #FFD65C;
  39. outline: none; -webkit-transition: .2s; transition: opacity .2s;}
  40. .slider::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background: #003249; cursor: pointer;}
  41. .slider::-moz-range-thumb { width: 35px; height: 35px; background: #003249; cursor: pointer; }
  42. .button { background-color: #003249; border: none; color: white; padding: 16px 40px;}
  43. </style>
  44. </head>
  45. <body>
  46. <h2>Dimmer ESP Controller</h2>
  47. <p><span id="textSliderValue">%SLIDERVALUE%</span></p>
  48. <p><input type="range" onchange="updateSliderPWM(this)" id="pwmSlider" min="0" max="100" value="%SLIDERVALUE%" step="1" class="slider"></p>
  49. </br>
  50. <h2>Dimmer ESP Controller2</h2>
  51. <p><span id="textSliderValue2">%SLIDERVALUE2%</span></p>
  52. <p><input type="range" onchange="updateSliderPWM2(this)" id="pwmSlider" min="0" max="100" value2="%SLIDERVALUE2%" step="1" class="slider"></p>
  53. </br>
  54. <h2>Dimmer ESP Controller3</h2>
  55. <p><span id="textSliderValue3">%SLIDERVALUE3%</span></p>
  56. <p><input type="range" onchange="updateSliderPWM3(this)" id="pwmSlider" min="0" max="100" value3="%SLIDERVALUE3%" step="1" class="slider"></p>
  57. </br>
  58. <h2>Dimmer ESP Controller4</h2>
  59. <p><span id="textSliderValue4">%SLIDERVALUE4%</span></p>
  60. <p><input type="range" onchange="updateSliderPWM4(this)" id="pwmSlider" min="0" max="100" value4="%SLIDERVALUE4%" step="1" class="slider"></p>
  61. </br>
  62. <p><a href=/output/on\><button class=\"button\">WiFi RST</button></a></p>
  63. <script>
  64. function updateSliderPWM (element) {
  65. var sliderValue = document.getElementById("pwmSlider").value;
  66. document.getElementById("textSliderValue").innerHTML = sliderValue;
  67. console.log(sliderValue);
  68. var xhr = new XMLHttpRequest();
  69. xhr.open("GET", "/slider?value="+sliderValue, true);
  70. xhr.send();
  71. }
  72. function updateSliderPWM2 (element) {
  73. var sliderValue2 = document.getElementById("pwmSlider2").value2;
  74. document.getElementById("textSliderValue2").innerHTML = sliderValue2;
  75. console.log(sliderValue2);
  76. var xhr = new XMLHttpRequest();
  77. xhr.open("GET", "/slider?value="+sliderValue2, true);
  78. xhr.send();
  79. }
  80. function updateSliderPWM3 (element) {
  81. var sliderValue3 = document.getElementById("pwmSlider3").value3;
  82. document.getElementById("textSliderValue3").innerHTML = sliderValue3;
  83. console.log(sliderValue3);
  84. var xhr = new XMLHttpRequest();
  85. xhr.open("GET", "/slider?value="+sliderValue3, true);
  86. xhr.send();
  87. }
  88. function updateSliderPWM4 (element) {
  89. var sliderValue4 = document.getElementById("pwmSlider4").value4;
  90. document.getElementById("textSliderValue4").innerHTML = sliderValue4;
  91. console.log(sliderValue4);
  92. var xhr = new XMLHttpRequest();
  93. xhr.open("GET", "/slider?value="+sliderValue4, true);
  94. xhr.send();
  95. }
  96. </script>
  97. </body>
  98. </html>
  99. )rawliteral";
  100. // Remplace le placeholder par la section bouton dans votre page web
  101. String processor(const String& var){
  102. //Serial.println(var);
  103. if (var == "SLIDERVALUE"){
  104. return sliderValue;
  105. }
  106. if (var == "SLIDERVALUE2"){
  107. return sliderValue2;
  108. }
  109. if (var == "SLIDERVALUE3"){
  110. return sliderValue3;
  111. }
  112. if (var == "SLIDERVALUE4"){
  113. return sliderValue4;
  114. }
  115. return String();
  116. }
  117. void setup() {
  118. // insérez votre code d'initialisation ici, exécuté une seule fois :
  119. Serial.begin(115200);
  120. dimmer.begin(NORMAL_MODE, OND);
  121. //WiFiManager
  122. //Initialisation locale. Une fois son travail terminé, il n'est plus nécessaire de le conserver
  123. AsyncWiFiManager wifiManager(&server,&dns);
  124. //réinitialiser les paramètres - pour les tests
  125. //wifiManager.resetSettings();
  126. //définir le callback appelé lorsque la connexion au WiFi précédent échoue et passe en mode point d'accès
  127. //wifiManager.setAPCallback(configModeCallback);
  128. //récupère le SSID et le mot de passe et tente de se connecter
  129. //et entre dans une boucle bloquante en attente de configuration
  130. if (!wifiManager.autoConnect("WiFi-Dimmer")) {
  131. Serial.println("failed to connect and hit timeout");
  132. //réinitialiser et réessayer, ou mettre en veille profonde
  133. //ESP.resetSettings();
  134. //ESP.reset();
  135. //ESP.restart();
  136. delay(1000);
  137. }
  138. //si vous arrivez ici, vous êtes connecté au WiFi
  139. Serial.println("connected...yeey :)");
  140. // Route pour la page web racine
  141. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  142. request->send_P(200, "text/html", index_html, processor);
  143. });
  144. // Envoyer une requête GET à <ESP_IP>/slider?value=<inputMessage>
  145. server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
  146. String inputMessage;
  147. // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
  148. if (request->hasParam(PARAM_INPUT)) {
  149. inputMessage = request->getParam(PARAM_INPUT)->value();
  150. sliderValue = inputMessage;
  151. dimmer.setPower(sliderValue.toInt());
  152. }
  153. String inputMessage2;
  154. // Obtenir la valeur input1 sur <ESP_IP>/slider?value=<inputMessage>
  155. if (request->hasParam(PARAM_INPUT)) {
  156. inputMessage2 = request->getParam(PARAM_INPUT)->value();
  157. sliderValue2 = inputMessage2;
  158. }
  159. else {
  160. inputMessage = "No message sent";
  161. }
  162. //Serial.println(inputMessage);
  163. Serial.println(sliderValue);
  164. Serial.print("DIM2");
  165. Serial.println(sliderValue2);
  166. Serial.print("DIM3");
  167. Serial.println(sliderValue3);
  168. Serial.print("DIM4");
  169. Serial.println(sliderValue4);
  170. request->send(200, "text/plain", "OK");
  171. });
  172. // Démarrer le serveur
  173. server.begin();
  174. }
  175. void loop() {
  176. // insérez votre code principal ici, exécuté en boucle :
  177. }


É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.



Partager cet article
Se connecter pour laisser un commentaire.