Zum Inhalt springen

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

28. März 2025 durch
Dimmer controller – ESP32/8266 web server with slider Arduino code.
Administrator
| Noch keine Kommentare


In diesem Dimmer-Steuerungsprojekt mit Webserver lernen wir, wie man mit ESP8266 und ESP32 einen Slider-Webserver erstellt, der den Dimmspannungspegel des an den GPIO-Pin des ESP8266 / ESP32 angeschlossenen Dimmers steuert.

Dies wird durch einen HTML-Slider erreicht, den wir zur Webserver-Seite hinzufügen. Der Slider wird bewegt, um den Slider-Wert einzustellen. Als Reaktion darauf wird dieser Slider-Wert den Dimmer-Wert festlegen.

Außerdem verwenden wir die Bibliothek WiFiManager, die es Ihnen ermöglicht, Ihr Dimmer-Projekt auf Basis von ESP8266/ESP32 mit verschiedenen Access Points (AP) zu verbinden, ohne den Code fest einprogrammieren und erneut auf Ihr Board hochladen zu müssen. Zusätzlich können Sie mit der WiFiManager-Bibliothek benutzerdefinierte Parameter (Variablen oder MQTT-Server-/Port-Adressen) hinzufügen und mehrere SSID-Verbindungen verwalten.

Unten finden Sie 2 Code-Beispiele. Eines für einen 1-Kanal-Dimmer und den zweiten Code für einen 4-Kanal-Dimmer mit 4 Slidern auf der Webseite.


1-Kanal DIMMER-CODE

  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 // Pin-Einstellungen
  5. dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
  6. #if defined(ESP8266)
  7. #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
  8. #else
  9. #include <WiFi.h> //Für ESP32
  10. #endif
  11. #include <ESPAsyncWebServer.h>
  12. #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
  13. //wird aufgerufen, wenn WiFiManager in den Konfigurationsmodus wechselt
  14. void configModeCallback (AsyncWiFiManager *myWiFiManager) {
  15. Serial.println("Entered config mode");
  16. Serial.println(WiFi.softAPIP());
  17. //wenn eine automatisch generierte SSID verwendet wurde, diese ausgeben
  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. // Ersetzt Platzhalter durch den Button-Abschnitt auf Ihrer Webseite
  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. // Ihren Setup-Code hier einfügen, wird einmal ausgeführt:
  70. Serial.begin(115200);
  71. dimmer.begin(NORMAL_MODE, OND);
  72. //WiFiManager. Lokale Initialisierung. Nach Abschluss wird er nicht mehr benötigt
  73. AsyncWiFiManager wifiManager(&server,&dns);
  74. //Einstellungen zurücksetzen - zum Testen
  75. //wifiManager.resetSettings();
  76. //Callback setzen, der aufgerufen wird, wenn die Verbindung zum vorherigen WiFi fehlschlägt und in den Access-Point-Modus wechselt
  77. //wifiManager.setAPCallback(configModeCallback);
  78. //holt SSID und Passwort und versucht sich zu verbinden
  79. //und geht in eine Warteschleife bis zur Konfiguration
  80. if (!wifiManager.autoConnect("WiFi-Dimmer")) {
  81. Serial.println("failed to connect and hit timeout");
  82. //Zurücksetzen und erneut versuchen, oder in den Deep-Sleep-Modus wechseln
  83. //ESP.resetSettings();
  84. //ESP.reset();
  85. //ESP.restart();
  86. delay(1000);
  87. }
  88. //wenn Sie hier ankommen, sind Sie mit dem WiFi verbunden
  89. Serial.println("connected!");
  90. // Route für die Stamm-Webseite
  91. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  92. request->send_P(200, "text/html", index_html, processor);
  93. });
  94. // GET-Anfrage an <ESP_IP>/slider?value=<inputMessage> senden
  95. server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
  96. String inputMessage;
  97. // GET input1-Wert von <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()); //DIMMEN
  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. // Server starten
  111. server.begin();
  112. }
  113. void loop() {
  114. // Ihren Hauptcode hier einfügen, wird wiederholt ausgeführt:
  115. }


4-Kanal DIMMER-CODE

  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 // Pin-Einstellungen
  5. dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
  6. #if defined(ESP8266)
  7. #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
  8. #else
  9. #include <WiFi.h> //für ESP32
  10. #endif
  11. #include <ESPAsyncWebServer.h>
  12. #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
  13. //wird aufgerufen, wenn WiFiManager in den Konfigurationsmodus wechselt
  14. void configModeCallback (AsyncWiFiManager *myWiFiManager) {
  15. Serial.println("Entered config mode");
  16. Serial.println(WiFi.softAPIP());
  17. //wenn eine automatisch generierte SSID verwendet wurde, diese ausgeben
  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. // Ersetzt Platzhalter durch den Button-Abschnitt auf Ihrer Webseite
  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. // Ihren Setup-Code hier einfügen, wird einmal ausgeführt:
  119. Serial.begin(115200);
  120. dimmer.begin(NORMAL_MODE, OND);
  121. //WiFiManager
  122. //Lokale Initialisierung. Nach Abschluss wird er nicht mehr benötigt
  123. AsyncWiFiManager wifiManager(&server,&dns);
  124. //Einstellungen zurücksetzen - zum Testen
  125. //wifiManager.resetSettings();
  126. //Callback setzen, der aufgerufen wird, wenn die Verbindung zum vorherigen WiFi fehlschlägt und in den Access-Point-Modus wechselt
  127. //wifiManager.setAPCallback(configModeCallback);
  128. //holt SSID und Passwort und versucht sich zu verbinden
  129. //und geht in eine Warteschleife bis zur Konfiguration
  130. if (!wifiManager.autoConnect("WiFi-Dimmer")) {
  131. Serial.println("failed to connect and hit timeout");
  132. //Zurücksetzen und erneut versuchen, oder in den Deep-Sleep-Modus wechseln
  133. //ESP.resetSettings();
  134. //ESP.reset();
  135. //ESP.restart();
  136. delay(1000);
  137. }
  138. //wenn Sie hier ankommen, sind Sie mit dem WiFi verbunden
  139. Serial.println("connected...yeey :)");
  140. // Route für die Stamm-Webseite
  141. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  142. request->send_P(200, "text/html", index_html, processor);
  143. });
  144. // GET-Anfrage an <ESP_IP>/slider?value=<inputMessage> senden
  145. server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
  146. String inputMessage;
  147. // GET input1-Wert von <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. // GET input1-Wert von <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. // Server starten
  173. server.begin();
  174. }
  175. void loop() {
  176. // Ihren Hauptcode hier einfügen, wird wiederholt ausgeführt:
  177. }


Schritt 1. Wi-Fi-Zugang einrichten.

WiFiManager ist eine großartige Bibliothek für Ihre ESP8266/ESP32-Projekte, denn mit dieser Bibliothek müssen Sie Ihre Netzwerk-Zugangsdaten (SSID und Passwort) nicht mehr fest im Code hinterlegen. Ihr ESP verbindet sich automatisch mit einem bekannten Netzwerk oder richtet einen Access Point ein, über den Sie die Netzwerk-Zugangsdaten konfigurieren können. So funktioniert dieser Prozess:

  • Wenn Ihr ESP8266/ESP32 startet, wird er im Station-Modus eingerichtet und versucht, sich mit einem zuvor gespeicherten Access Point (einer bekannten SSID- und Passwort-Kombination) zu verbinden;
  • Wenn dieser Vorgang fehlschlägt, wird der ESP in den Access-Point-Modus versetzt;
  • Verbinden Sie sich mit einem beliebigen WLAN-fähigen Gerät mit Browser mit dem neu erstellten Access Point (WiFi-Dimmer);
  • Nachdem eine Verbindung mit „WiFi-Dimmer" hergestellt wurde, können Sie die Standard-IP-Adresse 192.168.4.1 aufrufen, um eine Webseite zu öffnen, auf der Sie Ihre SSID und Ihr Passwort konfigurieren können;
  • Sobald eine neue SSID und ein neues Passwort eingestellt sind, startet der ESP neu und versucht, sich zu verbinden;

Wenn eine Verbindung hergestellt wird, ist der Vorgang erfolgreich abgeschlossen. Andernfalls wird er als Access Point eingerichtet.


Schritt 2. Webserver-Slider und Dimmen.

  • Der ESP8266/ESP32 hostet einen Webserver, der eine Webseite mit einem Slider anzeigt;
  • Wenn Sie den Slider bewegen, senden Sie eine HTTP-Anfrage an den ESP8266/ESP32 mit dem neuen Slider-Wert;
  • Die HTTP-Anfrage hat folgendes Format: GET/slider?value=SLIDERVALUE, wobei SLIDERVALUE eine Zahl zwischen 0 und 100 ist;
  • Aus der HTTP-Anfrage erhält der ESP8266/ESP32 den aktuellen Wert des Sliders;
  • Der ESP8266 passt den Dimmer-Wert entsprechend dem Slider-Wert an: dimmer.setPower(sliderValue.toInt()); //DIMMEN;

Beim 4-Kanal-Dimmer haben Sie auf der Webseite 4 Slider.



Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen