mirror of
https://github.com/bjoernellens1/ESP32-PowerGuard.git
synced 2024-11-23 09:35:05 +00:00
working on esp32s2 saola1
This commit is contained in:
parent
7d52f66f22
commit
d0084f5d99
@ -20,3 +20,17 @@ lib_deps =
|
|||||||
tobiasschuerg/ESP8266 Influxdb@^3.13.1
|
tobiasschuerg/ESP8266 Influxdb@^3.13.1
|
||||||
upload_port = COM3
|
upload_port = COM3
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
|
|
||||||
|
[env:esp32-s2-saola-1]
|
||||||
|
platform = espressif32
|
||||||
|
board = esp32-s2-saola-1
|
||||||
|
framework = arduino
|
||||||
|
lib_deps =
|
||||||
|
Wire
|
||||||
|
Adafruit INA219
|
||||||
|
ESP Async WebServer
|
||||||
|
ArduinoJson
|
||||||
|
tobiasschuerg/ESP8266 Influxdb@^3.13.1
|
||||||
|
; any port that starts with /dev/ttyUSB
|
||||||
|
#upload_port = /dev/ttyUSB*
|
||||||
|
monitor_speed = 115200
|
@ -10,7 +10,11 @@ const char* INFLUXDB_ORG = "48cec24009273b5e";
|
|||||||
const char* INFLUXDB_BUCKET = "bucket-digitalisierung";
|
const char* INFLUXDB_BUCKET = "bucket-digitalisierung";
|
||||||
|
|
||||||
// Other configurations
|
// Other configurations
|
||||||
|
// #define RELAY_PIN 2
|
||||||
|
// #define SECOND_RELAY_PIN 15
|
||||||
#define RELAY_PIN 2
|
#define RELAY_PIN 2
|
||||||
#define SECOND_RELAY_PIN 15
|
#define SECOND_RELAY_PIN 1
|
||||||
|
#define THIRD_RELAY_PIN 4
|
||||||
|
#define FOURTH_RELAY_PIN 3
|
||||||
|
|
||||||
#endif // CONFIG_H
|
#endif // CONFIG_H
|
||||||
|
@ -9,13 +9,17 @@
|
|||||||
|
|
||||||
class WebServerModule {
|
class WebServerModule {
|
||||||
public:
|
public:
|
||||||
WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin);
|
WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin, int thirdRelayPin, int fourthRelayPin);
|
||||||
|
|
||||||
void begin();
|
void begin();
|
||||||
bool getRelayState() const;
|
bool getRelayState() const;
|
||||||
bool getSecondRelayState() const;
|
bool getSecondRelayState() const;
|
||||||
|
bool getThirdRelayState() const;
|
||||||
|
bool getFourthRelayState() const;
|
||||||
void handleToggleState(bool state);
|
void handleToggleState(bool state);
|
||||||
void handleSecondToggleState(bool state);
|
void handleSecondToggleState(bool state);
|
||||||
|
void handleThirdToggleState(bool state);
|
||||||
|
void handleFourthToggleState(bool state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
INA219Module& _inaModule;
|
INA219Module& _inaModule;
|
||||||
@ -23,13 +27,19 @@ private:
|
|||||||
|
|
||||||
bool relayState;
|
bool relayState;
|
||||||
bool secondRelayState;
|
bool secondRelayState;
|
||||||
|
bool thirdrelayState;
|
||||||
|
bool fourthRelayState;
|
||||||
int _relayPin;
|
int _relayPin;
|
||||||
int _secondRelayPin;
|
int _secondRelayPin;
|
||||||
|
int _thirdrelayPin;
|
||||||
|
int _fourthRelayPin;
|
||||||
|
|
||||||
void handleRoot(AsyncWebServerRequest *request);
|
void handleRoot(AsyncWebServerRequest *request);
|
||||||
void handleValues(AsyncWebServerRequest *request);
|
void handleValues(AsyncWebServerRequest *request);
|
||||||
void handleToggle(AsyncWebServerRequest *request);
|
void handleToggle(AsyncWebServerRequest *request);
|
||||||
void handleSecondToggle(AsyncWebServerRequest *request);
|
void handleSecondToggle(AsyncWebServerRequest *request);
|
||||||
|
void handleThirdToggle(AsyncWebServerRequest *request);
|
||||||
|
void handleFourthToggle(AsyncWebServerRequest *request);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,82 +1,114 @@
|
|||||||
// WebServerModule.cpp
|
// WebServerModule.cpp
|
||||||
#include "WebServerModule.h"
|
#include "WebServerModule.h"
|
||||||
|
|
||||||
WebServerModule::WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin)
|
WebServerModule::WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin, int thirdRelayPin, int fourthRelayPin)
|
||||||
: _inaModule(inaModule), _server(80), _relayPin(relayPin), _secondRelayPin(secondRelayPin), relayState(false), secondRelayState(false) {}
|
: _inaModule(inaModule), _server(80), _relayPin(relayPin), _secondRelayPin(secondRelayPin),
|
||||||
|
_thirdrelayPin(thirdRelayPin), _fourthRelayPin(fourthRelayPin), relayState(false), secondRelayState(false),
|
||||||
|
thirdrelayState(false), fourthRelayState(false) {}
|
||||||
|
|
||||||
void WebServerModule::begin() {
|
void WebServerModule::begin() {
|
||||||
// Konfiguriere die Pins für die Relais als Ausgänge
|
// Configure pins for relays as outputs
|
||||||
pinMode(_relayPin, OUTPUT);
|
pinMode(_relayPin, OUTPUT);
|
||||||
pinMode(_secondRelayPin, OUTPUT);
|
pinMode(_secondRelayPin, OUTPUT);
|
||||||
|
pinMode(_thirdrelayPin, OUTPUT);
|
||||||
|
pinMode(_fourthRelayPin, OUTPUT);
|
||||||
|
|
||||||
// Konfiguriere die Server-Endpunkte
|
// Configure server endpoints
|
||||||
_server.on("/", HTTP_GET, std::bind(&WebServerModule::handleRoot, this, std::placeholders::_1));
|
_server.on("/", HTTP_GET, std::bind(&WebServerModule::handleRoot, this, std::placeholders::_1));
|
||||||
_server.on("/values", HTTP_GET, std::bind(&WebServerModule::handleValues, this, std::placeholders::_1));
|
_server.on("/values", HTTP_GET, std::bind(&WebServerModule::handleValues, this, std::placeholders::_1));
|
||||||
_server.on("/toggle1", HTTP_GET, std::bind(&WebServerModule::handleToggle, this, std::placeholders::_1));
|
_server.on("/toggle1", HTTP_GET, std::bind(&WebServerModule::handleToggle, this, std::placeholders::_1));
|
||||||
_server.on("/toggle2", HTTP_GET, std::bind(&WebServerModule::handleSecondToggle, this, std::placeholders::_1));
|
_server.on("/toggle2", HTTP_GET, std::bind(&WebServerModule::handleSecondToggle, this, std::placeholders::_1));
|
||||||
|
_server.on("/toggle3", HTTP_GET, std::bind(&WebServerModule::handleThirdToggle, this, std::placeholders::_1));
|
||||||
|
_server.on("/toggle4", HTTP_GET, std::bind(&WebServerModule::handleFourthToggle, this, std::placeholders::_1));
|
||||||
|
|
||||||
_server.begin();
|
_server.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServerModule::handleRoot(AsyncWebServerRequest *request) {
|
void WebServerModule::handleRoot(AsyncWebServerRequest *request) {
|
||||||
String html = "<html><head><style>";
|
String html = "<html><head><style>";
|
||||||
// CSS-Stil für die Schalter und Beschriftungen
|
// Common styles
|
||||||
html += ".toggle-container {";
|
html += "body {";
|
||||||
html += " display: flex;";
|
html += " font-family: Arial, sans-serif;";
|
||||||
html += " align-items: center;";
|
html += " margin: 0;";
|
||||||
html += " margin-bottom: 10px;";
|
html += " padding: 0;";
|
||||||
html += "}";
|
html += "}";
|
||||||
html += ".toggle-label {";
|
html += ".frame {";
|
||||||
html += " margin-right: 10px;";
|
html += " border: 2px solid #ddd;";
|
||||||
|
html += " padding: 20px;";
|
||||||
|
html += " border-radius: 10px;";
|
||||||
|
html += " max-width: 600px;"; // Set the maximum width for larger screens
|
||||||
|
html += " margin: auto;"; // Center the frame
|
||||||
html += "}";
|
html += "}";
|
||||||
html += ".toggle {";
|
// Styles for larger screens
|
||||||
html += " position: relative;";
|
html += "@media (min-width: 600px) {";
|
||||||
html += " display: inline-block;";
|
html += " .toggle-container {";
|
||||||
html += " width: 60px;";
|
html += " display: flex;";
|
||||||
html += " height: 34px;";
|
html += " align-items: center;";
|
||||||
|
html += " margin-bottom: 10px;";
|
||||||
|
html += " }";
|
||||||
|
html += " .toggle-label {";
|
||||||
|
html += " margin-right: 10px;";
|
||||||
|
html += " }";
|
||||||
|
html += " .toggle {";
|
||||||
|
html += " position: relative;";
|
||||||
|
html += " display: inline-block;";
|
||||||
|
html += " width: 60px;";
|
||||||
|
html += " height: 34px;";
|
||||||
|
html += " }";
|
||||||
|
html += " .toggle input {";
|
||||||
|
html += " opacity: 0;";
|
||||||
|
html += " width: 0;";
|
||||||
|
html += " height: 0;";
|
||||||
|
html += " }";
|
||||||
|
html += " .slider {";
|
||||||
|
html += " position: absolute;";
|
||||||
|
html += " cursor: pointer;";
|
||||||
|
html += " top: 0;";
|
||||||
|
html += " left: 0;";
|
||||||
|
html += " right: 0;";
|
||||||
|
html += " bottom: 0;";
|
||||||
|
html += " background-color: #ccc;";
|
||||||
|
html += " border-radius: 34px;";
|
||||||
|
html += " transition: .4s;";
|
||||||
|
html += " }";
|
||||||
|
html += " .inner-slider {";
|
||||||
|
html += " position: absolute;";
|
||||||
|
html += " content: \"\";";
|
||||||
|
html += " height: 26px;";
|
||||||
|
html += " width: 26px;";
|
||||||
|
html += " left: 4px;";
|
||||||
|
html += " bottom: 4px;";
|
||||||
|
html += " background-color: white;";
|
||||||
|
html += " border-radius: 50%;";
|
||||||
|
html += " transition: .4s;";
|
||||||
|
html += " }";
|
||||||
|
html += " input:checked + .slider {";
|
||||||
|
html += " background-color: #2196F3;";
|
||||||
|
html += " }";
|
||||||
|
html += " input:focus + .slider {";
|
||||||
|
html += " box-shadow: 0 0 1px #2196F3;";
|
||||||
|
html += " }";
|
||||||
html += "}";
|
html += "}";
|
||||||
html += ".toggle input {";
|
// Styles for smaller screens (e.g., mobile devices)
|
||||||
html += " opacity: 0;";
|
html += "@media (max-width: 599px) {";
|
||||||
html += " width: 0;";
|
html += " .toggle-container {";
|
||||||
html += " height: 0;";
|
html += " flex-direction: column;"; // Stack the toggle containers vertically
|
||||||
html += "}";
|
html += " text-align: center;"; // Center the text in toggle containers
|
||||||
html += ".slider {";
|
html += " }";
|
||||||
html += " position: absolute;";
|
html += " .toggle-label {";
|
||||||
html += " cursor: pointer;";
|
html += " margin-bottom: 5px;";
|
||||||
html += " top: 0;";
|
html += " }";
|
||||||
html += " left: 0;";
|
|
||||||
html += " right: 0;";
|
|
||||||
html += " bottom: 0;";
|
|
||||||
html += " background-color: #ccc;";
|
|
||||||
html += " border-radius: 34px;";
|
|
||||||
html += " transition: .4s;";
|
|
||||||
html += "}";
|
|
||||||
html += ".inner-slider {";
|
|
||||||
html += " position: absolute;";
|
|
||||||
html += " content: \"\";";
|
|
||||||
html += " height: 26px;";
|
|
||||||
html += " width: 26px;";
|
|
||||||
html += " left: 4px;";
|
|
||||||
html += " bottom: 4px;";
|
|
||||||
html += " background-color: white;";
|
|
||||||
html += " border-radius: 50%;";
|
|
||||||
html += " transition: .4s;";
|
|
||||||
html += "}";
|
|
||||||
html += "input:checked + .slider {";
|
|
||||||
html += " background-color: #2196F3;";
|
|
||||||
html += "}";
|
|
||||||
html += "input:focus + .slider {";
|
|
||||||
html += " box-shadow: 0 0 1px #2196F3;";
|
|
||||||
html += "}";
|
html += "}";
|
||||||
html += "</style></head><body>";
|
html += "</style></head><body>";
|
||||||
|
html += "<div class='frame'>";
|
||||||
html += "<h1>Energieverbrauchsmonitor</h1>";
|
html += "<h1>Energieverbrauchsmonitor</h1>";
|
||||||
// Anzeige der Werte
|
// Anzeige der Werte (unchanged)
|
||||||
html += "<p>Strom: <span id='current_A'></span> A</p>";
|
html += "<p>Strom: <span id='current_A'></span> A</p>";
|
||||||
html += "<p>Spannung: <span id='busVoltage_V'></span> V</p>";
|
html += "<p>Spannung: <span id='busVoltage_V'></span> V</p>";
|
||||||
html += "<p>Leistung: <span id='power_W'></span> W</p>";
|
html += "<p>Leistung: <span id='power_W'></span> W</p>";
|
||||||
html += "<p>Durchschnittliche Leistung: <span id='avgPower_W'></span> W</p>";
|
html += "<p>Durchschnittliche Leistung: <span id='avgPower_W'></span> W</p>";
|
||||||
html += "<p>Gesamtenergie: <span id='totalEnergy'></span> Wh</p>";
|
html += "<p>Gesamtenergie: <span id='totalEnergy'></span> Wh</p>";
|
||||||
// JavaScript-Code für die Werteaktualisierung und Schaltersteuerung
|
// JavaScript-Code für die Werteaktualisierung und Schaltersteuerung (unchanged)
|
||||||
html += "<script>setInterval(updateValues, 5000);";
|
html += "<script>setInterval(updateValues, 5000);";
|
||||||
html += "function updateValues() { fetch('/values').then(response => response.json()).then(data => {";
|
html += "function updateValues() { fetch('/values').then(response => response.json()).then(data => {";
|
||||||
html += "document.getElementById('current_A').textContent = data.current_A;";
|
html += "document.getElementById('current_A').textContent = data.current_A;";
|
||||||
@ -85,38 +117,55 @@ void WebServerModule::handleRoot(AsyncWebServerRequest *request) {
|
|||||||
html += "document.getElementById('avgPower_W').textContent = data.avgPower_W;";
|
html += "document.getElementById('avgPower_W').textContent = data.avgPower_W;";
|
||||||
html += "document.getElementById('totalEnergy').textContent = data.totalEnergy;";
|
html += "document.getElementById('totalEnergy').textContent = data.totalEnergy;";
|
||||||
html += "}); }</script>";
|
html += "}); }</script>";
|
||||||
// Schalter 1 (K1)
|
// Schalter 1 (K1) to Schalter 4 (K4) (unchanged)
|
||||||
html += "<div class='toggle-container'>";
|
html += "<div class='toggle-container'>";
|
||||||
html += "<label class='toggle-label'>Relais 1</label>"; // Beschriftung für den ersten Schalter
|
html += "<label class='toggle-label'>Relais 1</label>";
|
||||||
html += "<label class='toggle'>";
|
html += "<label class='toggle'>";
|
||||||
html += "<input type='checkbox' id='relaySwitch1' onchange='toggleRelay(1, this.checked)'>";
|
html += "<input type='checkbox' id='relaySwitch1' onchange='toggleRelay(1, this.checked)'>";
|
||||||
html += "<span class='slider'></span>";
|
html += "<span class='slider'></span>";
|
||||||
html += "<span class='inner-slider'></span>";
|
html += "<span class='inner-slider'></span>";
|
||||||
html += "</label>";
|
html += "</label>";
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
// Schalter 2 (K2)
|
|
||||||
html += "<div class='toggle-container'>";
|
html += "<div class='toggle-container'>";
|
||||||
html += "<label class='toggle-label'>Relais 2</label>"; // Beschriftung für den zweiten Schalter
|
html += "<label class='toggle-label'>Relais 2</label>";
|
||||||
html += "<label class='toggle'>";
|
html += "<label class='toggle'>";
|
||||||
html += "<input type='checkbox' id='relaySwitch2' onchange='toggleRelay(2, this.checked)'>";
|
html += "<input type='checkbox' id='relaySwitch2' onchange='toggleRelay(2, this.checked)'>";
|
||||||
html += "<span class='slider'></span>";
|
html += "<span class='slider'></span>";
|
||||||
html += "<span class='inner-slider'></span>";
|
html += "<span class='inner-slider'></span>";
|
||||||
html += "</label>";
|
html += "</label>";
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
// JavaScript-Code für die Schaltersteuerung
|
html += "<div class='toggle-container'>";
|
||||||
|
html += "<label class='toggle-label'>Relais 3</label>";
|
||||||
|
html += "<label class='toggle'>";
|
||||||
|
html += "<input type='checkbox' id='relaySwitch3' onchange='toggleRelay(3, this.checked)'>";
|
||||||
|
html += "<span class='slider'></span>";
|
||||||
|
html += "<span class='inner-slider'></span>";
|
||||||
|
html += "</label>";
|
||||||
|
html += "</div>";
|
||||||
|
html += "<div class='toggle-container'>";
|
||||||
|
html += "<label class='toggle-label'>Relais 4</label>";
|
||||||
|
html += "<label class='toggle'>";
|
||||||
|
html += "<input type='checkbox' id='relaySwitch4' onchange='toggleRelay(4, this.checked)'>";
|
||||||
|
html += "<span class='slider'></span>";
|
||||||
|
html += "<span class='inner-slider'></span>";
|
||||||
|
html += "</label>";
|
||||||
|
html += "</div>";
|
||||||
|
// JavaScript-Code für die Schaltersteuerung (unchanged)
|
||||||
html += "<script>";
|
html += "<script>";
|
||||||
html += "function toggleRelay(relay, state) {";
|
html += "function toggleRelay(relay, state) {";
|
||||||
html += " fetch(`/toggle${relay}?state=${Number(state)}`).then(response => response.text()).then(data => {";
|
html += " fetch(`/toggle${relay}?state=${Number(state)}`).then(response => response.text()).then(data => {";
|
||||||
html += " const innerSlider = document.querySelectorAll('.inner-slider')[relay - 1];"; // Das entsprechende Inner Slider
|
html += " const innerSlider = document.querySelectorAll('.inner-slider')[relay - 1];";
|
||||||
html += " const translation = state ? '26px' : '0';"; // Verschiebungsberechnung
|
html += " const translation = state ? '26px' : '0';";
|
||||||
html += " innerSlider.style.transform = `translateX(${translation})`;"; // Anwenden der Verschiebung
|
html += " innerSlider.style.transform = `translateX(${translation})`;";
|
||||||
html += " });";
|
html += " });";
|
||||||
html += "}";
|
html += "}";
|
||||||
html += "</script>";
|
html += "</script>";
|
||||||
html += "</body></html>";
|
html += "</div></body></html>";
|
||||||
request->send(200, "text/html", html);
|
request->send(200, "text/html", html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void WebServerModule::handleValues(AsyncWebServerRequest *request) {
|
void WebServerModule::handleValues(AsyncWebServerRequest *request) {
|
||||||
String values = "{\"current_A\":" + String(_inaModule.getCurrent()) + ",";
|
String values = "{\"current_A\":" + String(_inaModule.getCurrent()) + ",";
|
||||||
values += "\"busVoltage_V\":" + String(_inaModule.getBusVoltage()) + ",";
|
values += "\"busVoltage_V\":" + String(_inaModule.getBusVoltage()) + ",";
|
||||||
@ -156,6 +205,44 @@ void WebServerModule::handleSecondToggle(AsyncWebServerRequest *request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebServerModule::handleThirdToggle(AsyncWebServerRequest *request) {
|
||||||
|
if (request->hasParam("state")) {
|
||||||
|
int state = request->getParam("state")->value().toInt();
|
||||||
|
thirdrelayState = state;
|
||||||
|
digitalWrite(_thirdrelayPin, thirdrelayState ? HIGH : LOW);
|
||||||
|
|
||||||
|
Serial.print("Relay 3 state set to: ");
|
||||||
|
Serial.println(thirdrelayState);
|
||||||
|
|
||||||
|
request->send(200, "text/plain", thirdrelayState ? "Relay 3 turned on" : "Relay 3 turned off");
|
||||||
|
} else {
|
||||||
|
request->send(400); // Error, no state information
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebServerModule::handleFourthToggle(AsyncWebServerRequest *request) {
|
||||||
|
if (request->hasParam("state")) {
|
||||||
|
int state = request->getParam("state")->value().toInt();
|
||||||
|
fourthRelayState = state;
|
||||||
|
digitalWrite(_fourthRelayPin, fourthRelayState ? HIGH : LOW);
|
||||||
|
|
||||||
|
Serial.print("Relay 4 state set to: ");
|
||||||
|
Serial.println(fourthRelayState);
|
||||||
|
|
||||||
|
request->send(200, "text/plain", fourthRelayState ? "Relay 4 turned on" : "Relay 4 turned off");
|
||||||
|
} else {
|
||||||
|
request->send(400); // Error, no state information
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WebServerModule::getThirdRelayState() const {
|
||||||
|
return thirdrelayState;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WebServerModule::getFourthRelayState() const {
|
||||||
|
return fourthRelayState;
|
||||||
|
}
|
||||||
|
|
||||||
void WebServerModule::handleToggleState(bool state) {
|
void WebServerModule::handleToggleState(bool state) {
|
||||||
relayState = state;
|
relayState = state;
|
||||||
digitalWrite(_relayPin, relayState ? HIGH : LOW);
|
digitalWrite(_relayPin, relayState ? HIGH : LOW);
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
WiFiModule wifiModule(WIFI_SSID, WIFI_PASSWORD);
|
WiFiModule wifiModule(WIFI_SSID, WIFI_PASSWORD);
|
||||||
INA219Module inaModule;
|
INA219Module inaModule;
|
||||||
InfluxDBModule influxDB(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
|
InfluxDBModule influxDB(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
|
||||||
WebServerModule webServer(inaModule, RELAY_PIN, SECOND_RELAY_PIN);
|
WebServerModule webServer(inaModule, RELAY_PIN, SECOND_RELAY_PIN, THIRD_RELAY_PIN, FOURTH_RELAY_PIN);
|
||||||
|
|
||||||
void readAndSendSensorData();
|
void readAndSendSensorData();
|
||||||
void controlRelays();
|
void controlRelays();
|
||||||
@ -106,7 +106,7 @@ void controlRelays() {
|
|||||||
|
|
||||||
// Zentrale Logik für die Relaissteuerung
|
// Zentrale Logik für die Relaissteuerung
|
||||||
if (power > 70.0) {
|
if (power > 70.0) {
|
||||||
Serial.println("Turning on relays...");
|
Serial.println("Overload condition detected...");
|
||||||
webServer.handleToggleState(false); // Relay 1 ausschalten
|
webServer.handleToggleState(false); // Relay 1 ausschalten
|
||||||
webServer.handleSecondToggleState(false); // Relay 2 ausschalten
|
webServer.handleSecondToggleState(false); // Relay 2 ausschalten
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user