[erledigt]Ablauf von millis() Schleife verkürzen

Ich speichere alle 10 Minuten meine Sensordaten in einer MariaDB auf einem IntelNuC.
Manchmal schlägt allerdings die Verbindung fehl. Da möchte ich das saveInterval bis zum erneuten Senden auf 10 Sekunden verkürzen und bei Erfolg wieder den normalen Zeitraum von 10 Minuten verwenden.

unsigned long saveInterval = 600000; //10 minutes
unsigned long last_saveInterval = 0;

void loop() {

  if (millis() - last_saveInterval > saveInterval) {
    if (save_data(&mqttClient, &wifiClient, msg.c_str());
      last_saveInterval = millis();
    }
    else {
      last_saveInterval = millis() + ??? oder - ???
    }
  }
}

Auf welchen Welchen Wert müsste in diesem Fall last_saveInterval gesetzt werden?

Wieso willst Du last_saveInterval ändern? Betrachte last_saveInterval als letzten Save-Versuch und ändere das saveInterval auf 10000.
Woran erkennst Du eine fehlgeschlagene Übertragung?

Gruß Tommy

Hier

while (wifiClient->available()) {
      response = wifiClient->readStringUntil('\r');

}

Hier erhält der wifiClient ein "OK" von einer PHP Seite, wenn die Daten gespeichert wurden.

Meinst du so?

  if (millis() - last_saveInterval > saveInterval) {
    if (save_data(&mqttClient, &wifiClient, msg.c_str());

      // Das saveInterval steht in Minuten im Eeprom, da es durch den Anwender geändert werden kann.
      // Den Wert müsste ich dann immer wieder neu einlesen.
      saveInterval = EepromReadInt8(saveinterval_Address) * 60000;
      last_saveInterval = millis();
    }
    else {
      saveInterval = 10000;
    }
  }

Ja, wobei ich die Zeile mit mqtt nicht beurteilen kann.

Gruß Tommy

Hallo,

Du könntest ein if davor setzen und zwei neue Variable einführen

if (fehler) Interval=  10000;
else Interval=saveInterval;

if (millis() - last_saveInterval > Interval){

.
.

Heinz

// Den Wert müsste ich dann immer wieder neu einlesen.

Ja und? EEPROM lesen ist kein Problem.
Außerdem könntest du die Änderung von Fehler nach OK erkennen, und nur dann wieder den Original-Wert für Interval zurückholen.

freddy64:

    if (save_data(&mqttClient, &wifiClient, msg.c_str());

Das funktioniert nicht.
Zudem: Benenne nicht irgendwas intervall, wenn es nicht intervall ist.

unsigned long saveInterval = 600000; //10 minutes
unsigned long last_save = 0;

void loop() 
{
  if (millis() - last_save > saveInterval)
  {
    if (save_data)
    {
      saveInterval = 600000;
    }
    else
    {
      saveInterval = 10000;
    }
    last_save = millis();
  }
}

if (save_data(&mqttClient, &wifiClient, msg.c_str());

Das funktioniert nicht.

Sorry, ich hatte vorher keine Unterscheidung nach dem result von save_data(...) drin und deshalb die öffnende Klammer vergessen.

Zudem: Benenne nicht irgendwas intervall, wenn es nicht intervall ist.

Was ist es dann???

OK, schon begriffen, last_saveInterval ist der ulong Wert von millis() und kein Intervall.
Deshalb besser last_save.
Werde ich so übernehmen, damit die Variablen eindeutiger werden.

THX, ihr fleißigen Helfer

freddy64:
Werde ich so übernehmen, damit die Variablen eindeutiger werden.
THX, ihr fleißigen Helfer

Danke fürs feedback

  • gerne!

freddy64:
Deshalb besser last_save.

Will ja nicht kleinlich sein, aber last_save_time wäre für mich auch nach Jahren eindeutiger. last_save wäre für mich eher eine Bezeichnung für einen bool, ob der letzte Speichervorgang gut ausging.

Ist aber meine persönliche Meinung, stammt aus keinem Lehrbuch.

ElEspanol:
last_save wäre für mich eher eine Bezeichnung für einen bool, ob der letzte Speichervorgang gut ausging.

Da hast wahr.
Wobei der _Unterstrich da auch weg kann.
Mir war nur das intervall aufgefallen und die Variable nahm keinen auf...

:wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.