Moin,
ich habe schon viele hilfreiche Sachen bei euch gefunden aber jetzt komme ich nicht mehr weiter. Ich lese das Rad mit einem tcrt5000 und werte das ganze an einem Wemos D1 Mini mit folgendem Sketch aus.
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
const unsigned int rpm_per_kWh = 75;
const char* SSID = "SSID";
const char* PSK = "PASS";
const char* MQTT_BROKER = "192.168.XXX.XXX";
const char* MQTT_USER = "MQTTuser";
const char* MQTT_PASSWORD = "MQTTPass";
const int MQTT_PORT = 1883;
const char* clientId = "Strom";
#define IRPIN D2
#define RED LOW
#define SILVER HIGH
//in 10ms = 200ms
#define MINTIME 20
////////END OF CONFIGURATION////////
// 0 = Silver->Red; 1 = Red->Silver
uint8_t lastState = 0;
unsigned long lastmillis = 0;
unsigned long pendingmillis = 0;
bool inbuf[MINTIME];
bool startup=true;
void setup() {
Serial.begin(115200);
delay(3000);
Serial.println("\nPOWER MONITOR - BOOT\n");
setup_wifi();
setup_MQTT();
pinMode(IRPIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
lastmillis = millis();
}
void setup_MQTT() {
client.setServer(MQTT_BROKER, MQTT_PORT);//MQTT Server, - Port
if (client.connect(clientId , MQTT_USER, MQTT_PASSWORD)) {
Serial.println("MQTT connected");
//client.publish("/home/strom", "MQTT verbunden");
}
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
//client.publish("/home/strom", "WLAN verbunden");
}
bool getInput(uint8_t pin) {
byte inchk=0;
for(byte i=0; i<5; i++) {
inchk += digitalRead(pin);
delay(2);
}
if(inchk >= 3) return 1;
return 0;
}
void reconnect() {
while (!client.connected()) {
Serial.print("Reconnecting...");
if (!client.connect("ESP8266Client")) {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
bool procInput(bool state) {
byte inchk=0;
//Array shift
for (byte k = MINTIME-2; (k >= 0 && k < MINTIME); k--) {
inbuf[k+1] = inbuf[k];
inchk += inbuf[k];
}
//New value
inbuf[0] = state;
inchk += state;
//Return average
if(inchk > MINTIME/2) return 1;
return 0;
}
void calcPower(void) {
unsigned long took = pendingmillis - lastmillis;
lastmillis = pendingmillis;
float kWh = 3600000.00 / took / rpm_per_kWh;
if(!startup) {
Serial.print(kWh);
Serial.print(" kW @ ");
Serial.print(took);
Serial.println("ms");
snprintf (msg, 50, "%f", kWh);
//Add MQTT, HTTP or whatever you want to do with the measurement here
client.publish("/home/strom", msg);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}else{
startup=false;
}
}
void loop() {
bool cur = getInput(IRPIN);
cur = procInput(cur);
switch(lastState) {
case 0: //Silver; Waiting for transition to red
if(cur != SILVER) {
lastState++;
pendingmillis = millis();
Serial.println("Silver detected; waiting for red");
calcPower();
}
break;
case 1: //Red; Waiting for transition to silver
if(cur != RED) {
lastState=0;
Serial.println("Red detected; Waiting for silver");
}
break;
}
}
Wenn ich es außerhalb des Verteilerkastens prüfe läut alles so wie es soll, ich bringe den tcrt5000 an den Zähler sehe ich das geschaltet wird (sowohl am tcrt5000 als auch am Wemos), es wird aber nichts mehr via MQTT versendet.
Ich habe schon die IR und Photodiode vom Board entfernd und getrennt vor den Zähler gehängt aber auch hier das gleiche Problem. Aussen funktioniert alles wenn ich an den Zähler gehe wird nichts mehr versendet.
Hat jemand eine Idee was ich machen kann?
Danke und Gruß
Olaf