Hallo zusammen, ich bin ziehmlicher Anfänger in Arduino möchte aber gern was bewerkstelligen. Vielleicht kann mir da jemand dabei helfen.
Ich möchte an den einzelnen Phasen in meinem Verteiler, den Strom messen. Dies funktioniert auch schon relativ genau mit einem Sketch aus dem Internet.
Im Serielen Monitor kann man die 3 Ströme und die erreichnete Gesammtleistung sehen. Ich möchte aber gern diese 4 Werte per MQTT an meinen RaspberryPi senden. Was muss ich in meinem Sketch ändern?
#include <Arduino.h>
#include <WiFi.h>
//Setup Variablen
int numberOfSamples = 9000;
const char* host = "emoncms-server.de";
//WiFi Überwachung
static bool sta_was_connected = false;
//einstellen der Spannungs- und Stromeingangspins
int inPinI1 = 34;
int inPinI2 = 35;
int inPinI3 = 39;
//Zähler für den ersten Durchlauf
int firstrun = 0;
//Leistungsberechnung
float PowerSum = 0;
//WLAN Teil
const char* ssid = "meineSSID";
const char* password = "meinPasswort";
const char* mqttServer = "Server";
const char* mqttUsername = "Username";
const char* mqttPassword = "Passwort";
const char* mqttDeviceId = "ID";
// CT: Die Spannung hängt von Strom, Lastwiderstand und Windungen der Spule ab
#define CT_BURDEN_RESISTOR 62
#define CT_TURNS 1800
#define VOLTAGE 225
//Kalibrierungskoeffizienten
//diese müssen eingestellt werden, um die Genauigkeit zu erhöhen
//legen Sie zuerst die obigen Werte fest und kalibrieren Sie dann weiter durch Referenzmessungen
double ICAL = 1.08;
//Anpassung durch VCAL/ICAL-Optimierungen
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;
//Filter Variable 1
double lastFilteredI, filteredI;
double sqI, sumI;
//Stichprobe Variable 1
int lastSampleI, sampleI;
//Filter Variable 2
double lastFilteredI1, filteredI1;
double sqI1, sumI1;
//Stichprobe Variable 2
int lastSampleI1, sampleI1;
//Filter Variable 3
double lastFilteredI3, filteredI3;
double sqI3, sumI3;
//Stichprobe Variable 3
int lastSampleI3, sampleI3;
//benötigte Ergebnisse
double Irms1;
double Irms2;
double Irms3;
unsigned long timer;
//EspClass ESPm;
String url = "";
//WLAN
void WIFI_Connect()
{
digitalWrite(2, 1);
WiFi.disconnect();
Serial.println("Booting Sketch...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
//warten auf Verbindung
for (int i = 0; i < 25; i++)
{
if ( WiFi.status() != WL_CONNECTED ) {
delay ( 250 );
digitalWrite(2, 0);
Serial.print ( "." );
delay ( 250 );
digitalWrite(2, 1);
}
}
digitalWrite(2, 0);
}
void setup() {
//setze LED als Output
pinMode(2, OUTPUT);
//setze Analogeingänge
pinMode(inPinI1, INPUT);
adcAttachPin(inPinI1);
pinMode(inPinI2, INPUT);
adcAttachPin(inPinI2);
pinMode(inPinI3, INPUT);
adcAttachPin(inPinI3);
Serial.begin(115200);
delay(500);
//WLAN Teil
WIFI_Connect();
}
void loop() {
timer = millis();
//WLAN Überwachung
WiFi.onEvent(WiFiEvent);
//überprüfen ob WLAN anliegt
//automatische Neuverbindung, wenn der ESP32 keine Verbindung zum Router hat
if (WiFi.status() != WL_CONNECTED)
{
WiFi.onEvent(WiFiEvent);
WIFI_Connect();
} else {
//**************************************************************************
//Phase 1
for (int n = 0; n < numberOfSamples; n++)
{
//wird für den Offset benötigt
lastSampleI = sampleI;
//liest die Spannung- und Stromwerte
sampleI = analogRead(inPinI1);
//wird für den Offset benötigt
lastFilteredI = filteredI;
//Digitale Hochpassfilter zum Entfernen des 1,6-V-DC-Offsets
filteredI = 0.9989 * (lastFilteredI + sampleI - lastSampleI);
//Quadratischer Mittelwert Strom
//1) I²
sqI = filteredI * filteredI;
//2) Ergebnis
sumI += sqI;
delay(0.00002);
}
//Berechnung des Effektivwertes
//Einberechnung der Kalibrierungskoeffizienten
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.16;
if ((Irms1 < 0) || (firstrun < 2)) {
Irms1 = 0;
}; //setzt den negativen Strom auf Null und ignoriert die ersten 2 Berechnungen
sumI = 0;
Serial.println("Irms1:" + String(Irms1));
//**************************************************************************
//Phase 2
for (int n = 0; n < numberOfSamples; n++)
{
//wird für den Offset benötigt
lastSampleI1 = sampleI1;
//liest die Spannung- und Stromwerte
sampleI1 = analogRead(inPinI2);
//wird für den Offset benötigt
lastFilteredI1 = filteredI1;
//Digitale Hochpassfilter zum Entfernen des 1,6-V-DC-Offsets
filteredI1 = 0.9989 * (lastFilteredI1 + sampleI1 - lastSampleI1);
//Quadratischer Mittelwert Strom
//1) I²
sqI1 = filteredI1 * filteredI1;
//2) Ergebnis
sumI1 += sqI1;
delay(0.00002);
}
//Berechnung des Effektivwertes
//Einberechnung der Kalibrierungskoeffizienten
Irms2 = (I_RATIO * sqrt(sumI1 / numberOfSamples)) - 0.16;
if ((Irms2 < 0) || (firstrun < 2)) {
Irms2 = 0;
}; //setzt den negativen Strom auf Null und ignoriert die ersten 2 Berechnungen
sumI1 = 0;
Serial.println("Irms2:" + String(Irms2));
//**************************************************************************
//Phase 3
for (int n = 0; n < numberOfSamples; n++)
{
//wird für den Offset benötigt
lastSampleI3 = sampleI3;
//liest die Spannung- und Stromwerte
sampleI3 = analogRead(inPinI3);
//wird für den Offset benötigt
lastFilteredI3 = filteredI3;
//Digitale Hochpassfilter zum Entfernen des 1,6-V-DC-Offsets
filteredI3 = 0.9989 * (lastFilteredI3 + sampleI3 - lastSampleI3);
//Quadratischer Mittelwert Strom
//1) I²
sqI3 = filteredI3 * filteredI3;
//2) Ergebnis
sumI3 += sqI3;
delay(0.0002);
}
//Berechnung des Effektivwertes
//Einberechnung der Kalibrierungskoeffizienten
Irms3 = (I_RATIO * sqrt(sumI3 / numberOfSamples)) - 0.16;
if ((Irms3 < 0) || (firstrun < 2)) {
Irms3 = 0;
}; //setzt den negativen Strom auf Null und ignoriert die ersten 2 Berechnungen
sumI3 = 0;
Serial.println("Irms3:" + String(Irms3));
Serial.println("Summe:" + String(Irms1 + Irms2 + Irms3));
//Berechnen der Leistung
PowerSum = ((Irms1 + Irms2 + Irms3) * VOLTAGE);
//sendet die Daten zum Server ...
if ((WiFi.status() == WL_CONNECTED) && (firstrun >= 2)) { //WLAN geprüft, ignoriere die ersten Daten
//verwendet die WiFiClient, um TCP-Verbindungen aufzubauen
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("keine Verbindung");
return;
}
//Erstellung der URI
String url = "/emoncms/input/post.json?node=1&apikey=xxxxxxxxxxxxxxxxxxxxxx&json={";
//url += value;
url = url + "Phase1:" + Irms1 + ",";
url = url + "Phase2:" + Irms2 + ",";
url = url + "Phase3:" + Irms3 + ",";
url = url + "PowerSum:" + PowerSum + "}";
Serial.print("Requesting URL: ");
Serial.println(url);
//diese Daten zum Server senden
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
/*
//Liest alle Antworten vom Server und gibt sie im "Serial" aus
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
*/
}
if (firstrun <= 2) {
firstrun++;
}; //Löschen der Daten
delay(1000);
}//WiFi Watchdog
}
//WLAN Überwachung
void WiFiEvent(WiFiEvent_t event) {
Serial.printf("[WiFi-event] event: %d - ", event);
switch (event) {
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("WLAN verbunden");
Serial.print("IP-Adresse: "); Serial.println(WiFi.localIP());
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WLAN Verbindung verloren");
WiFi.begin(); // <<<<<<<<<<< added <<<<<<<<<<<<<<<
ESP.restart();
break;
case SYSTEM_EVENT_STA_START:
Serial.println("ESP32 starten");
break;
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("ESP32 Verbunden zu AP");
break;
case SYSTEM_EVENT_STA_LOST_IP:
Serial.println("ESP32 IP-Adresse verloren");
WiFi.begin(); // <<<<<<<<<<< added <<<<<<<<<<<<<<<
ESP.restart();
break;
}
}