Hallo miteinander!
Ich beschäftige mich erst seit kurzem mit Arduino bzw mit meinen D1 mini´s. Bisher habe ich eigentlich mit copy&paste, try&error und entsprechender Suche alles hin bekommen, was ich wollte. Nun stehe ich jedoch vor einem Problem.
Ich lese mittels eines Wemos D1 mini, IR-Recievers und digitalRead meinen Stromzähler am S0-Bus ab, übermittle die Werte via MQTT und lasse ein LCD-Display mitzählen. Das funktioniert soweit auch ganz gut, außer wenn die WiFi-Verbindung neu aufgebaut werden soll. Aufgrund des delay beim warten auf WiFi.status werden die Impulse des Zählers in dieser Zeit nicht mitgezählt. Ich konnte bisher nirgends eine Möglichkeit finden, dieses delay z. B. durch eine millis-schleife zu ersetzen. Ist es möglich, und wenn ja, wie muss der sketch umgebaut werden, um auch während des Verbindungsaufbaus die Zählerimpulse weiter aufzeichnen zu können?
Besten Dank!
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <MQTTClient.h>
const char* host = "192.168.178.20";
const char* wifi_ssid = "Encyclopaedia Galactica";
const char* wifi_password = "A273C427B218D778y359";
int inPin = D5;
int empfang = LOW;
int numberOfInterrupts = 0;
int impulseProMinute =0;
unsigned long lastDebounceTime1 = 0;
unsigned long debounceDelay = 50;
unsigned long minutenDelay = 30000;
unsigned long lastMinutenDelay = 0;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x3F for a 16 chars and 2 line display
WiFiClient net;
MQTTClient mqtt;
void setup() {
Serial.begin(115200);
Serial.print("LCD init...");
lcd.init();
lcd.backlight();
pinMode(inPin, INPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_password);
mqtt.begin(host, net);
connect();
// delay(500);
}
void loop() {
if (!mqtt.connected()) {
connect();
}
mqtt.loop();
ablesen();
}
void ablesen() {
empfang = digitalRead(inPin);
if (empfang == LOW) {
if ((millis() - lastDebounceTime1) > debounceDelay) {
numberOfInterrupts = numberOfInterrupts + 1;
Serial.print("Empfangene IR-Impulse: ");
Serial.println(numberOfInterrupts);
lcd.setCursor(0,1);
lcd.print(numberOfInterrupts);
lastDebounceTime1 = millis();
impulseProMinute = impulseProMinute + 1;
}
}
if ((millis() - lastMinutenDelay) >= minutenDelay) {
lastMinutenDelay = millis();
lcd.setCursor(0,0);
lcd.print(impulseProMinute);
Serial.println(impulseProMinute);
mqtt.publish("Keller/Strom/Eingang", String(impulseProMinute));
impulseProMinute = 0;
}
}
void connect() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
IPAddress staticIP(192, 168, 178, 213); //ESP static ip
IPAddress gateway(192, 168, 178, 1); //IP Address of your WiFi Router (Gateway)
IPAddress subnet(255, 255, 255, 0); //Subnet mask
IPAddress dns(192, 168, 178, 1); //DNS
WiFi.hostname("Strom-Sensor"); // DHCP Hostname (useful for finding device for static lease)
WiFi.config(staticIP, subnet, gateway, dns);
WiFi.begin(wifi_ssid, wifi_password);
WiFi.mode(WIFI_STA);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
while (!mqtt.connect(host)) {
Serial.print(".");
}
Serial.println("MQTT connected!");
}