Vielen Dank für die Antworten.
Ich habe die letzten Stunden reichlich probiert und ebenso ein Zeitfenster für Serial.prints eingebaut, damit nur zwei Mal pro Minute Daten an den Serial gesendet werden. Damit habe ich den Sensor auch neu Eichen müssen. Das aktuelle Zwischenergebnis sieht nun so aus:
#define WATERFLOWPIN 27
float ppl = 6.89;
float waterInterval = 1000;
volatile unsigned int waterPulseCount;
float flowRate;
float dayGardenLiters;
unsigned long oldWaterTime;
unsigned long oldSerialTime;
float serialInterval = 30000;
void IRAM_ATTR waterConsumption_ISR() { // Interrupt Service Routine (ISR)
waterPulseCount++; // Increment the pulse counter
}
void setup() {
Serial.begin(115200);
oldSerialTime = serialInterval;
Serial.println("");
pinMode(WATERFLOWPIN, INPUT_PULLUP);
waterPulseCount = 0;
flowRate = 0.0;
dayGardenLiters = 0.0;
oldWaterTime = 0;
attachInterrupt(digitalPinToInterrupt(WATERFLOWPIN), waterConsumption_ISR, FALLING);
delay(100);
}
void loop() {
unsigned long nowTime = millis();
if(nowTime - oldWaterTime >= waterInterval) { // Only process counters once per <waterInterval>
detachInterrupt(digitalPinToInterrupt(WATERFLOWPIN));
unsigned int pulsesTemp = waterPulseCount;
waterPulseCount = 0;
attachInterrupt(digitalPinToInterrupt(WATERFLOWPIN), waterConsumption_ISR, FALLING);
flowRate = ((waterInterval / (nowTime - oldWaterTime)) * pulsesTemp) / ppl;
dayGardenLiters += flowRate / 60;
oldWaterTime = millis();
}
if(nowTime - oldSerialTime >= serialInterval) { // Only process counters once per <waterInterval>
Serial.print(" GARTENWASSER "); Serial.print("Aktueller Wasserfluss: "); Serial.print(flowRate, 1); Serial.println(" Liter/Minute");
Serial.print(" "); Serial.print(dayGardenLiters, 2); Serial.println(" l/Tag \t");
Serial.println("");
oldSerialTime = millis();
}
delay(250);
}
Eine feine Sache, jede Aufgabe nur alle X-Minuten auszuführen. Eingangs fragte ich noch, wie nun diverse OLED-Anzeigen, denen ein Zeitfenster zur Einblendung gegeben wird, so in den Sketch eingebaut werden können, dass die Loop sich eben nicht verlangsamt. Bisher hatte ich das z.B. mit der U8g2lib.h-Bibliothek und 2 OLEDs wie im enthaltenen Beispielsketch so umgesetzt:
u8g2_1.firstPage();
do {
u8g2_1.setFont(u8g2_font_7x14B_tr);
u8g2_1.setCursor(5, 10);
u8g2_1.print("LINKS EINS");
u8g2_1.setCursor(5, 35);
u8g2_1.print("LINKS ZWEI");
u8g2_1.setCursor(5, 52);
u8g2_1.print("LINKS DREI");
} while (u8g2_1.nextPage());
delay(5);
u8g2_2.firstPage();
do {
u8g2_2.setFont(u8g2_font_7x14B_tr);
u8g2_2.setCursor(5, 10);
u8g2_2.print("RECHTS EINS");
u8g2_2.setCursor(5, 35);
u8g2_2.print("RECHTS ZWEI");
u8g2_2.setCursor(5, 52);
u8g2_2.print("RECHTS DREI");
} while (u8g2_2.nextPage());
delay(SCREEN_MILLISECONDS);
Die SCREEN_MILLISECONDS sind z.B. 5 Sekunden, bei der die Loop dann hängt. Wie kann ich diese zeitlich von der Loop trennen?