[gelöst] runtime() für Arduino Nano

Die geile runtime() Funktion ist doch für sicherlich für die ESP's geschrieben.

Wenn ich das auf dem Arduino benutze, kommt nur Mist raus.

String runtime() {
  static uint8_t rolloverCounter = 0;
  static uint32_t lastMillis = 0;
  uint32_t currentMillis = millis();
  if (currentMillis < lastMillis) {       // check millis overflow
    rolloverCounter++;
  }
  lastMillis = currentMillis;
  uint32_t secs = (0xFFFFFFFF / 1000 ) * rolloverCounter + (currentMillis / 1000);
  char buf[20];
  snprintf(buf, sizeof(buf), "%d %s %02d:%02d:%02d", secs / 86400, secs < 86400 || secs > 172800 ? "days" : "day", secs / 3600 % 24, secs / 60 % 60, secs % 60);
  return buf;
}

Ergebnis im Serial Monitor:
0 316:00:00

Wäre hier jemand so freundlich, die Funktion zu bearbeiten, dass sie auch auf dem Arduino funktioniert.
Bin jetzt seit längerer Zeit wieder mal am Arduino und verstehe die Welt nicht mehr :frowning:

1 Like

Wenn Du 32-Bit Werte mit snprintf ausgeben willst, musst Du %ld verwenden. %d druckt Integer, das ist zwar auf dem ESP 32Bit, auf dem Arduino aber nur 16Bit.

oder man schaltet die CompilerMeldungen im IDE ein :slight_smile:

oder man schaltet die CompilerMeldungen im IDE ein

Ich habe alle Meldungen an.
Warnung ist nicht unbedingt gleich Fehler, kann aber später zur Laufzeit Fehler produzieren.
Deshalb ignoriere ich auch keine Compiler Warnungen.

OK, ich werde mal %ld probieren.

1 Like

%ld war der goldene Hinweis.
Die runtime() Funktion funktioniert wie gewohnt.

1 Like

Eine Frage hätte ich noch.
Wie kann ich runtime() dazu bewegen, auch noch die ms hinten dran zu hängen?
Die Frage bewegt mich seit dem Thema "Genauigkeit von millis".
Mein Arduino läuft jetzt seit über 2 Stunden und runtime() gibt mir 0 days 02:08:00 zurück.

Alle Funktionen im loop() arbeiten auf die Sekunde genau.

Ich habe im setup() einen Trick angewendet, damit die runtime() Sekunden nach dem Setup bei 0 starten.

uint16_t bootTime;

void setup() {

.
.
.
bootTime = millis(); //save millis after setup
}

und runtime() sieht jetzt so aus

String runtime() {
  static uint8_t rolloverCounter = 0;
  static uint32_t lastMillis = 0;
  uint32_t currentMillis = millis() - bootTime;
  if (currentMillis < lastMillis) {       // check millis overflow
    rolloverCounter++;
  }
  lastMillis = currentMillis;
  uint32_t secs = (0xFFFFFFFF / 1000 ) * rolloverCounter + (currentMillis / 1000);
  char buf[20];
  sprintf(buf, "%ld %s %02ld:%02ld:%02ld", secs / 86400, (secs < 86400 || secs > 172800) ? "days" : "day", secs / 3600 % 24, secs / 60 % 60, secs % 60);
  return buf;
}

Habe ich etwa einen Arduino mit exzellentem Quarz erwischt?

1 Like

Beschäftige Dich einfach mit der printf-Familie.

Gruß Tommy

freddy64:
Alle Funktionen im loop() arbeiten auf die Sekunde genau.

Habe ich etwa einen Arduino mit exzellentem Quarz erwischt?

Nö.
Merkst es aber erst später.

Tipp:
Vergleiche die abgelaufene Zeit in millis()*1000 mit der via NTP geholten Zeit vom lokalen Zeitserver oder einer (temperaturkompensierten) DS3231 - und das nicht nur für 2 Stunden :wink: - denn wie Du siehst, könnte eine Abweichung (*1000) gar nicht angezeigt werden.

Solange Du nichts weiter machst, kann das über sehr lange Zeit passen.
Aber gerade heute waren Interrupts so ziemlich das meist gennante Wort. Für millis() gilt das eben auch...

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