
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
- #include <AsyncTCP.h>
- #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
- #define outputPin 16
- #define zerocross 5 // Pin-Einstellungen
- dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
- #if defined(ESP8266)
- #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
- #else
- #include <WiFi.h> //Für ESP32
- #endif
- #include <ESPAsyncWebServer.h>
- #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
- //wird aufgerufen, wenn WiFiManager in den Konfigurationsmodus wechselt
- void configModeCallback (AsyncWiFiManager *myWiFiManager) {
- Serial.println("Entered config mode");
- Serial.println(WiFi.softAPIP());
- //wenn eine automatisch generierte SSID verwendet wurde, diese ausgeben
- 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";
- // Ersetzt Platzhalter durch den Button-Abschnitt auf Ihrer Webseite
- String processor(const String& var){
- //Serial.println(var);
- if (var == "SLIDERVALUE"){
- return sliderValue;
- }
- return String();
- }
- void setup() {
- // Ihren Setup-Code hier einfügen, wird einmal ausgeführt:
- Serial.begin(115200);
- dimmer.begin(NORMAL_MODE, OND);
- //WiFiManager. Lokale Initialisierung. Nach Abschluss wird er nicht mehr benötigt
- AsyncWiFiManager wifiManager(&server,&dns);
- //Einstellungen zurücksetzen - zum Testen
- //wifiManager.resetSettings();
- //Callback setzen, der aufgerufen wird, wenn die Verbindung zum vorherigen WiFi fehlschlägt und in den Access-Point-Modus wechselt
- //wifiManager.setAPCallback(configModeCallback);
- //holt SSID und Passwort und versucht sich zu verbinden
- //und geht in eine Warteschleife bis zur Konfiguration
- if (!wifiManager.autoConnect("WiFi-Dimmer")) {
- Serial.println("failed to connect and hit timeout");
- //Zurücksetzen und erneut versuchen, oder in den Deep-Sleep-Modus wechseln
- //ESP.resetSettings();
- //ESP.reset();
- //ESP.restart();
- delay(1000);
- }
- //wenn Sie hier ankommen, sind Sie mit dem WiFi verbunden
- Serial.println("connected!");
- // Route für die Stamm-Webseite
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
- request->send_P(200, "text/html", index_html, processor);
- });
- // GET-Anfrage an <ESP_IP>/slider?value=<inputMessage> senden
- server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
- String inputMessage;
- // GET input1-Wert von <ESP_IP>/slider?value=<inputMessage>
- if (request->hasParam(PARAM_INPUT)) {
- inputMessage = request->getParam(PARAM_INPUT)->value();
- sliderValue = inputMessage;
- dimmer.setPower(sliderValue.toInt()); //DIMMEN
- }
- else {
- inputMessage = "No message sent";
- }
- //Serial.println(inputMessage);
- Serial.println(sliderValue);
- request->send(200, "text/plain", "OK");
- });
- // Server starten
- server.begin();
- }
- void loop() {
- // Ihren Hauptcode hier einfügen, wird wiederholt ausgeführt:
- }
4-Kanal DIMMER-CODE
- #include <AsyncTCP.h>
- #include <RBDdimmer.h> //https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
- #define outputPin 16
- #define zerocross 5 // Pin-Einstellungen
- dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
- #if defined(ESP8266)
- #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
- #else
- #include <WiFi.h> //für ESP32
- #endif
- #include <ESPAsyncWebServer.h>
- #include <ESPAsyncWiFiManager.h> //https://github.com/knolleary/pubsubclient
- //wird aufgerufen, wenn WiFiManager in den Konfigurationsmodus wechselt
- void configModeCallback (AsyncWiFiManager *myWiFiManager) {
- Serial.println("Entered config mode");
- Serial.println(WiFi.softAPIP());
- //wenn eine automatisch generierte SSID verwendet wurde, diese ausgeben
- 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";
- // Ersetzt Platzhalter durch den Button-Abschnitt auf Ihrer Webseite
- 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() {
- // Ihren Setup-Code hier einfügen, wird einmal ausgeführt:
- Serial.begin(115200);
- dimmer.begin(NORMAL_MODE, OND);
- //WiFiManager
- //Lokale Initialisierung. Nach Abschluss wird er nicht mehr benötigt
- AsyncWiFiManager wifiManager(&server,&dns);
- //Einstellungen zurücksetzen - zum Testen
- //wifiManager.resetSettings();
- //Callback setzen, der aufgerufen wird, wenn die Verbindung zum vorherigen WiFi fehlschlägt und in den Access-Point-Modus wechselt
- //wifiManager.setAPCallback(configModeCallback);
- //holt SSID und Passwort und versucht sich zu verbinden
- //und geht in eine Warteschleife bis zur Konfiguration
- if (!wifiManager.autoConnect("WiFi-Dimmer")) {
- Serial.println("failed to connect and hit timeout");
- //Zurücksetzen und erneut versuchen, oder in den Deep-Sleep-Modus wechseln
- //ESP.resetSettings();
- //ESP.reset();
- //ESP.restart();
- delay(1000);
- }
- //wenn Sie hier ankommen, sind Sie mit dem WiFi verbunden
- Serial.println("connected...yeey :)");
- // Route für die Stamm-Webseite
- server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
- request->send_P(200, "text/html", index_html, processor);
- });
- // GET-Anfrage an <ESP_IP>/slider?value=<inputMessage> senden
- server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
- String inputMessage;
- // GET input1-Wert von <ESP_IP>/slider?value=<inputMessage>
- if (request->hasParam(PARAM_INPUT)) {
- inputMessage = request->getParam(PARAM_INPUT)->value();
- sliderValue = inputMessage;
- dimmer.setPower(sliderValue.toInt());
- }
- String inputMessage2;
- // GET input1-Wert von <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");
- });
- // Server starten
- server.begin();
- }
- void loop() {
- // Ihren Hauptcode hier einfügen, wird wiederholt ausgeführt:
- }
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.
