mirror of
https://github.com/bjoernellens1/ESP32-PowerGuard.git
synced 2024-11-23 09:35:05 +00:00
update: working correctly now. Chnaged for four channel active low relay module.
This commit is contained in:
parent
d0084f5d99
commit
d90e8d99b7
@ -8,7 +8,7 @@ bool InfluxDBModule::connectToInfluxDB() {
|
||||
return client.validateConnection();
|
||||
}
|
||||
|
||||
bool InfluxDBModule::sendData(float current, float busVoltage, float power, float avgPower, float totalEnergy, int relay1State, int relay2State) {
|
||||
bool InfluxDBModule::sendData(float current, float busVoltage, float power, float avgPower, float totalEnergy, int relay1State, int relay2State, int relay3State, int relay4State) {
|
||||
Point sensorData("sensor_data");
|
||||
sensorData.addTag("device", "ESP32");
|
||||
sensorData.addField("current", current);
|
||||
@ -18,6 +18,8 @@ bool InfluxDBModule::sendData(float current, float busVoltage, float power, floa
|
||||
sensorData.addField("totalEnergy", totalEnergy);
|
||||
sensorData.addField("relay1StateINT", relay1State);
|
||||
sensorData.addField("relay2StateINT", relay2State);
|
||||
sensorData.addField("relay3StateINT", relay3State);
|
||||
sensorData.addField("relay4StateINT", relay4State);
|
||||
|
||||
return client.writePoint(sensorData);
|
||||
}
|
@ -9,7 +9,7 @@ class InfluxDBModule {
|
||||
public:
|
||||
InfluxDBModule(String url, String org, String bucket, String token);
|
||||
bool connectToInfluxDB();
|
||||
bool sendData(float current, float busVoltage, float power, float avgPower, float totalEnergy, int relay1State, int relay2State);
|
||||
bool sendData(float current, float busVoltage, float power, float avgPower, float totalEnergy, int relay1State, int relay2State, int relay3State, int relay4State);
|
||||
private:
|
||||
InfluxDBClient client;
|
||||
};
|
||||
|
@ -31,7 +31,7 @@ private:
|
||||
bool fourthRelayState;
|
||||
int _relayPin;
|
||||
int _secondRelayPin;
|
||||
int _thirdrelayPin;
|
||||
int _thirdRelayPin;
|
||||
int _fourthRelayPin;
|
||||
|
||||
void handleRoot(AsyncWebServerRequest *request);
|
||||
|
@ -3,14 +3,14 @@
|
||||
|
||||
WebServerModule::WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin, int thirdRelayPin, int fourthRelayPin)
|
||||
: _inaModule(inaModule), _server(80), _relayPin(relayPin), _secondRelayPin(secondRelayPin),
|
||||
_thirdrelayPin(thirdRelayPin), _fourthRelayPin(fourthRelayPin), relayState(false), secondRelayState(false),
|
||||
_thirdRelayPin(thirdRelayPin), _fourthRelayPin(fourthRelayPin), relayState(false), secondRelayState(false),
|
||||
thirdrelayState(false), fourthRelayState(false) {}
|
||||
|
||||
void WebServerModule::begin() {
|
||||
// Configure pins for relays as outputs
|
||||
pinMode(_relayPin, OUTPUT);
|
||||
pinMode(_secondRelayPin, OUTPUT);
|
||||
pinMode(_thirdrelayPin, OUTPUT);
|
||||
pinMode(_thirdRelayPin, OUTPUT);
|
||||
pinMode(_fourthRelayPin, OUTPUT);
|
||||
|
||||
// Configure server endpoints
|
||||
@ -108,48 +108,74 @@ void WebServerModule::handleRoot(AsyncWebServerRequest *request) {
|
||||
html += "<p>Leistung: <span id='power_W'></span> W</p>";
|
||||
html += "<p>Durchschnittliche Leistung: <span id='avgPower_W'></span> W</p>";
|
||||
html += "<p>Gesamtenergie: <span id='totalEnergy'></span> Wh</p>";
|
||||
// JavaScript-Code für die Werteaktualisierung und Schaltersteuerung (unchanged)
|
||||
html += "<script>setInterval(updateValues, 5000);";
|
||||
// // JavaScript-Code für die Werteaktualisierung und Schaltersteuerung (unchanged)
|
||||
// html += "<script>setInterval(updateValues, 5000);";
|
||||
// html += "function updateValues() { fetch('/values').then(response => response.json()).then(data => {";
|
||||
// html += "document.getElementById('current_A').textContent = data.current_A;";
|
||||
// html += "document.getElementById('busVoltage_V').textContent = data.busVoltage_V;";
|
||||
// html += "document.getElementById('power_W').textContent = data.power_W;";
|
||||
// html += "document.getElementById('avgPower_W').textContent = data.avgPower_W;";
|
||||
// html += "document.getElementById('totalEnergy').textContent = data.totalEnergy;";
|
||||
// html += "}); }</script>";
|
||||
|
||||
// JavaScript-Code für die Werteaktualisierung und Schaltersteuerung
|
||||
html += "<script>setInterval(updateValues, 1000);"; // Update values every second
|
||||
html += "function updateValues() { fetch('/values').then(response => response.json()).then(data => {";
|
||||
html += "document.getElementById('current_A').textContent = data.current_A;";
|
||||
html += "document.getElementById('busVoltage_V').textContent = data.busVoltage_V;";
|
||||
html += "document.getElementById('power_W').textContent = data.power_W;";
|
||||
html += "document.getElementById('avgPower_W').textContent = data.avgPower_W;";
|
||||
html += "document.getElementById('totalEnergy').textContent = data.totalEnergy;";
|
||||
|
||||
// Update toggle states
|
||||
html += "document.getElementById('relaySwitch1').checked = data.relay1State;";
|
||||
html += "document.getElementById('relaySwitch2').checked = data.relay2State;";
|
||||
html += "document.getElementById('relaySwitch3').checked = data.relay3State;";
|
||||
html += "document.getElementById('relaySwitch4').checked = data.relay4State;";
|
||||
|
||||
html += "}); }</script>";
|
||||
// Schalter 1 (K1) to Schalter 4 (K4) (unchanged)
|
||||
|
||||
|
||||
// Schalter 1 (K1)
|
||||
html += "<div class='toggle-container'>";
|
||||
html += "<label class='toggle-label'>Relais 1</label>";
|
||||
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)' " + String(getRelayState() ? "checked" : "") + ">";
|
||||
html += "<span class='slider'></span>";
|
||||
html += "<span class='inner-slider'></span>";
|
||||
html += "</label>";
|
||||
html += "</div>";
|
||||
|
||||
// Schalter 2 (K2)
|
||||
html += "<div class='toggle-container'>";
|
||||
html += "<label class='toggle-label'>Relais 2</label>";
|
||||
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)' " + String(getSecondRelayState() ? "checked" : "") + ">";
|
||||
html += "<span class='slider'></span>";
|
||||
html += "<span class='inner-slider'></span>";
|
||||
html += "</label>";
|
||||
html += "</div>";
|
||||
|
||||
// Schalter 3 (K3)
|
||||
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 += "<input type='checkbox' id='relaySwitch3' onchange='toggleRelay(3, this.checked)' " + String(getThirdRelayState() ? "checked" : "") + ">";
|
||||
html += "<span class='slider'></span>";
|
||||
html += "<span class='inner-slider'></span>";
|
||||
html += "</label>";
|
||||
html += "</div>";
|
||||
|
||||
// Schalter 4 (K4)
|
||||
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 += "<input type='checkbox' id='relaySwitch4' onchange='toggleRelay(4, this.checked)' " + String(getFourthRelayState() ? "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 += "function toggleRelay(relay, state) {";
|
||||
@ -164,14 +190,22 @@ void WebServerModule::handleRoot(AsyncWebServerRequest *request) {
|
||||
request->send(200, "text/html", html);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WebServerModule::handleValues(AsyncWebServerRequest *request) {
|
||||
// String values = "{\"current_A\":" + String(_inaModule.getCurrent()) + ",";
|
||||
// values += "\"busVoltage_V\":" + String(_inaModule.getBusVoltage()) + ",";
|
||||
// values += "\"power_W\":" + String(_inaModule.getPower()) + ",";
|
||||
// values += "\"avgPower_W\":" + String(_inaModule.calculateAveragePower()) + ",";
|
||||
// values += "\"totalEnergy\":" + String(_inaModule.getTotalEnergy()) + "}";
|
||||
|
||||
String values = "{\"current_A\":" + String(_inaModule.getCurrent()) + ",";
|
||||
values += "\"busVoltage_V\":" + String(_inaModule.getBusVoltage()) + ",";
|
||||
values += "\"power_W\":" + String(_inaModule.getPower()) + ",";
|
||||
values += "\"avgPower_W\":" + String(_inaModule.calculateAveragePower()) + ",";
|
||||
values += "\"totalEnergy\":" + String(_inaModule.getTotalEnergy()) + "}";
|
||||
values += "\"totalEnergy\":" + String(_inaModule.getTotalEnergy()) + ",";
|
||||
values += "\"relay1State\":" + String(getRelayState() ? 1 : 0) + ",";
|
||||
values += "\"relay2State\":" + String(getSecondRelayState() ? 1 : 0) + ",";
|
||||
values += "\"relay3State\":" + String(getThirdRelayState() ? 1 : 0) + ",";
|
||||
values += "\"relay4State\":" + String(getFourthRelayState() ? 1 : 0) + "}";
|
||||
request->send(200, "application/json", values);
|
||||
}
|
||||
|
||||
@ -179,7 +213,7 @@ void WebServerModule::handleToggle(AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("state")) {
|
||||
int state = request->getParam("state")->value().toInt();
|
||||
relayState = state;
|
||||
digitalWrite(_relayPin, relayState ? HIGH : LOW);
|
||||
digitalWrite(_relayPin, relayState ? LOW : HIGH);
|
||||
|
||||
Serial.print("Relay 1 state set to: ");
|
||||
Serial.println(relayState);
|
||||
@ -194,7 +228,7 @@ void WebServerModule::handleSecondToggle(AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("state")) {
|
||||
int state = request->getParam("state")->value().toInt();
|
||||
secondRelayState = state;
|
||||
digitalWrite(_secondRelayPin, secondRelayState ? HIGH : LOW);
|
||||
digitalWrite(_secondRelayPin, secondRelayState ? LOW : HIGH);
|
||||
|
||||
Serial.print("Relay 2 state set to: ");
|
||||
Serial.println(secondRelayState);
|
||||
@ -209,7 +243,7 @@ void WebServerModule::handleThirdToggle(AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("state")) {
|
||||
int state = request->getParam("state")->value().toInt();
|
||||
thirdrelayState = state;
|
||||
digitalWrite(_thirdrelayPin, thirdrelayState ? HIGH : LOW);
|
||||
digitalWrite(_thirdRelayPin, thirdrelayState ? LOW : HIGH);
|
||||
|
||||
Serial.print("Relay 3 state set to: ");
|
||||
Serial.println(thirdrelayState);
|
||||
@ -224,7 +258,7 @@ void WebServerModule::handleFourthToggle(AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("state")) {
|
||||
int state = request->getParam("state")->value().toInt();
|
||||
fourthRelayState = state;
|
||||
digitalWrite(_fourthRelayPin, fourthRelayState ? HIGH : LOW);
|
||||
digitalWrite(_fourthRelayPin, fourthRelayState ? LOW : HIGH);
|
||||
|
||||
Serial.print("Relay 4 state set to: ");
|
||||
Serial.println(fourthRelayState);
|
||||
@ -235,22 +269,24 @@ void WebServerModule::handleFourthToggle(AsyncWebServerRequest *request) {
|
||||
}
|
||||
}
|
||||
|
||||
bool WebServerModule::getThirdRelayState() const {
|
||||
return thirdrelayState;
|
||||
}
|
||||
|
||||
bool WebServerModule::getFourthRelayState() const {
|
||||
return fourthRelayState;
|
||||
}
|
||||
|
||||
void WebServerModule::handleToggleState(bool state) {
|
||||
relayState = state;
|
||||
digitalWrite(_relayPin, relayState ? HIGH : LOW);
|
||||
digitalWrite(_relayPin, relayState ? LOW : HIGH); // Inverted logic for active LOW relay
|
||||
}
|
||||
|
||||
void WebServerModule::handleSecondToggleState(bool state) {
|
||||
secondRelayState = state;
|
||||
digitalWrite(_secondRelayPin, secondRelayState ? HIGH : LOW);
|
||||
digitalWrite(_secondRelayPin, secondRelayState ? LOW : HIGH); // Inverted logic for active LOW relay
|
||||
}
|
||||
|
||||
void WebServerModule::handleThirdToggleState(bool state) {
|
||||
thirdrelayState = state;
|
||||
digitalWrite(_thirdRelayPin, thirdrelayState ? LOW : HIGH); // Inverted logic for active LOW relay
|
||||
}
|
||||
|
||||
void WebServerModule::handleFourthToggleState(bool state) {
|
||||
fourthRelayState = state;
|
||||
digitalWrite(_fourthRelayPin, fourthRelayState ? LOW : HIGH); // Inverted logic for active LOW relay
|
||||
}
|
||||
|
||||
bool WebServerModule::getRelayState() const {
|
||||
@ -260,3 +296,11 @@ bool WebServerModule::getRelayState() const {
|
||||
bool WebServerModule::getSecondRelayState() const {
|
||||
return secondRelayState;
|
||||
}
|
||||
|
||||
bool WebServerModule::getThirdRelayState() const {
|
||||
return thirdrelayState;
|
||||
}
|
||||
|
||||
bool WebServerModule::getFourthRelayState() const {
|
||||
return fourthRelayState;
|
||||
}
|
65
src/main.cpp
65
src/main.cpp
@ -24,6 +24,12 @@ void readAndSendSensorData();
|
||||
void controlRelays();
|
||||
|
||||
void setup() {
|
||||
// setting relay pins first - needed for proper initialization of active low relays
|
||||
digitalWrite(RELAY_PIN, HIGH);
|
||||
digitalWrite(SECOND_RELAY_PIN, HIGH);
|
||||
digitalWrite(THIRD_RELAY_PIN, HIGH);
|
||||
digitalWrite(FOURTH_RELAY_PIN, HIGH);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println("... init ...");
|
||||
Wire.begin();
|
||||
@ -49,6 +55,15 @@ void setup() {
|
||||
|
||||
webServer.begin();
|
||||
Serial.println("Web server started");
|
||||
float busVoltage = inaModule.getBusVoltage();
|
||||
// Init: Relais einschalten, wenn die Spannung zwischen 11 und 13V liegt
|
||||
if (busVoltage > 11.0 && busVoltage < 13.0)
|
||||
{
|
||||
Serial.println("Turning on relays due to good voltage condition...");
|
||||
webServer.handleToggleState(true); // Relay 1 einschalten
|
||||
//webServer.handleSecondToggleState(true); // Relay 2 einschalten
|
||||
}
|
||||
Serial.println("... init done");
|
||||
|
||||
Serial.println();
|
||||
Serial.println("......");
|
||||
@ -67,14 +82,23 @@ void readAndSendSensorData() {
|
||||
float power = inaModule.getPower();
|
||||
float avgPower = inaModule.calculateAveragePower();
|
||||
float totalEnergy = inaModule.getTotalEnergy();
|
||||
|
||||
// Get relay states
|
||||
bool relay1State = webServer.getRelayState();
|
||||
bool relay2State = webServer.getSecondRelayState();
|
||||
// Ändere die bool's zu Float-Werten
|
||||
bool relay3State = webServer.getThirdRelayState(); // Assuming this method exists
|
||||
bool relay4State = webServer.getFourthRelayState(); // Assuming this method exists
|
||||
|
||||
// Convert bool relay states to int
|
||||
int relay1StateInt = relay1State ? 1 : 0;
|
||||
int relay2StateInt = relay2State ? 1 : 0;
|
||||
int relay3StateInt = relay3State ? 1 : 0;
|
||||
int relay4StateInt = relay4State ? 1 : 0;
|
||||
|
||||
influxDB.sendData(current, busVoltage, power, avgPower, totalEnergy, relay1StateInt , relay2StateInt );
|
||||
// Send data to InfluxDB
|
||||
influxDB.sendData(current, busVoltage, power, avgPower, totalEnergy, relay1StateInt, relay2StateInt, relay3StateInt, relay4StateInt);
|
||||
|
||||
// Print data to Serial for debugging
|
||||
Serial.print("current: ");
|
||||
Serial.print(current);
|
||||
Serial.println(" A");
|
||||
@ -100,21 +124,28 @@ void readAndSendSensorData() {
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void controlRelays() {
|
||||
float power = inaModule.getPower();
|
||||
float busVoltage = inaModule.getBusVoltage();
|
||||
void controlRelays()
|
||||
{
|
||||
float power = inaModule.getPower();
|
||||
float busVoltage = inaModule.getBusVoltage();
|
||||
|
||||
// Zentrale Logik für die Relaissteuerung
|
||||
if (power > 70.0) {
|
||||
Serial.println("Overload condition detected...");
|
||||
webServer.handleToggleState(false); // Relay 1 ausschalten
|
||||
webServer.handleSecondToggleState(false); // Relay 2 ausschalten
|
||||
}
|
||||
// Zentrale Logik für die Relaissteuerung
|
||||
if (power > 50.0)
|
||||
{
|
||||
Serial.println("Overload condition detected...");
|
||||
webServer.handleToggleState(false); // Relay 1 ausschalten
|
||||
webServer.handleSecondToggleState(false); // Relay 2 ausschalten
|
||||
webServer.handleThirdToggleState(false); // Relay 3 ausschalten
|
||||
webServer.handleFourthToggleState(false); // Relay 4 ausschalten
|
||||
}
|
||||
|
||||
// Zusatz: Relais einschalten, wenn die Spannung zwischen 0 und 14V liegt
|
||||
if (busVoltage > 0.0 && busVoltage < 14.0) {
|
||||
Serial.println("Turning on relays due to voltage condition...");
|
||||
webServer.handleToggleState(true); // Relay 1 einschalten
|
||||
webServer.handleSecondToggleState(true); // Relay 2 einschalten
|
||||
}
|
||||
// Zusatz: Relais ausschalten, wenn die Spannung nicht zwischen 0 und 14V liegt
|
||||
if (!(busVoltage > 2.0 && busVoltage < 14.0))
|
||||
{
|
||||
Serial.println("Turning off relays due to bad voltage condition...");
|
||||
webServer.handleToggleState(false); // Relay 1 ausschalten
|
||||
webServer.handleSecondToggleState(false); // Relay 2 ausschalten
|
||||
webServer.handleThirdToggleState(false); // Relay 3 ausschalten
|
||||
webServer.handleFourthToggleState(false); // Relay 4 ausschalten
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user