Funktion millis() to Uhrzeit

Hallo,
ich hatte eine Weile gesucht und nichts gefunden um millis() im Uhrzeitformat darzustellen.
Evtl hilfts em einen oder anderen Anfänger

//Funktion uhrzeit 
String uhrzeit(unsigned long millisekunden) { //Übergabe von millis() und Rückgabewert Uhrzeit im Format String 00:00:00
  int INTsekunden = millisekunden / 1000;
  int secUHR; 
  int sec10;
  int sec01;
  int minUHR;
  int min10;
  int min01;
  int stdUHR;
  int std10;
  int std01;
  int taUHR;
  int HMS;
  String backString;
  taUHR = INTsekunden / 68400;
  stdUHR = (INTsekunden - (taUHR * 86400)) / 3600;
  std10 = stdUHR / 10;
  std01 = stdUHR - std10 * 10;
  minUHR = (INTsekunden - (taUHR * 86400) - (stdUHR * 3600)) / 60;
  min10 = minUHR / 10;
  min01 = minUHR - min10 * 10;
  secUHR = (INTsekunden - (taUHR * 86400) - (stdUHR * 3600) - (minUHR * 60));
  sec10 = secUHR / 10;
  sec01 = secUHR - sec10 * 10;
  backString = String(std10) + String(std01) + ":" + String(min10) + String(min01) + ":" + String(sec10) + String(sec01);
  //Serial.print(Uhrzeit);Serial.println(" Uhrzeit");

  return backString;
}

Da millis() die Anzahl Millisekunden seit Start des Arduino ist, welchen praktischen Nährwert hat da die Darstellung als Uhrzeit oder wahr das eher als Programmierübung gedacht?

Gruß Tommy

Und was ist mit Tagen?

deepseek prompt und reasoning antwort

Hallo Deepseek, bitte schreiben Sie den Code, der den Arduino Millis()-Timer, der die Millisekunden seit Programmstart zurückgibt, von Millisekunden in das Format dy Stunde Minute Sekunde umwandelt.

134 Sekunden nachgedacht

Okay, der Benutzer möchte Millisekunden aus Arduinos Millis()-Funktion in Tage, Stunden, Minuten und Sekunden umrechnen. Lassen Sie mich überlegen, wie ich das angehen soll.

Zunächst fällt mir ein, dass die Umrechnung von Millisekunden in größere Zeiteinheiten das Teilen durch die Anzahl der Millisekunden in jeder Einheit und dann das Nehmen des Rests für die nächstkleinere Einheit beinhaltet. Beginnen Sie also mit der größten Einheit, also Tagen.

Ein Tag hat 86400000 Millisekunden (246060*1000). Teilen Sie also die Gesamtzahl der Millisekunden durch diesen Wert, um die Tage zu erhalten. Nehmen Sie dann den Rest mithilfe des Modulus, um die verbleibenden Millisekunden nach Abzug der Tage zu erhalten.

Als nächstes für Stunden: Eine Stunde hat 3600000 ms (60601000). Nimm den Rest aus dem vorherigen Schritt und dividiere durch 3600000, um Stunden zu erhalten, dann aktualisiere den Rest erneut.

Dann Minuten: 60000 ms pro Minute. Dividiere die verbleibenden ms durch 60000, erhalte die Minuten und nimm den Rest für Sekunden.

Sekunden sind unkompliziert: dividiere die verbleibenden ms durch 1000. Was ist mit den verbleibenden Millisekunden? Der Benutzer hat sie nicht erwähnt, also braucht er sie vielleicht nicht. Aber in der ursprünglichen Frage steht „dy Stunde Minute Sekunde Format“, also können wir vielleicht die verbleibenden Millisekunden nach Sekunden ignorieren.

Moment, der Benutzer hat „dy“ geschrieben, meinte aber wahrscheinlich „Tag“. Das Ausgabeformat ist also Tage, Stunden, Minuten, Sekunden.

Die Schritte lauten also:

  1. Tage berechnen = Gesamtms / 86400000

  2. verbleibendems = Gesamtms % 86400000

  3. Stunden = verbleibendems / 3600000

  4. verbleibendems % = 3600000

  5. Minuten = verbleibendems / 60000

  6. verbleibendems % = 60000

  7. Sekunden = verbleibendems / 1000

Aber wir müssen den Fall behandeln, wenn der Wert 0 ist. Wenn beispielsweise Tage 0 sind, möchten wir das vielleicht nicht anzeigen. Aber der Benutzer hat es nicht angegeben, also schließen wir vielleicht einfach alle Komponenten ein, auch wenn es Null ist.

Aber der Benutzer möchte vielleicht eine formatierte Zeichenfolge, die nur die notwendigen Teile anzeigt. Wenn es beispielsweise weniger als ein Tag ist, zeigen wir Stunden, Minuten, Sekunden an. Aber in der Frage steht „dy Stunde Minute Sekunde Format“, also sind vielleicht alle vier Komponenten erforderlich, die jeweils ihren Wert anzeigen, auch wenn dieser Null ist.

Der Code muss also eine Eingabe von Millisekunden annehmen und eine Zeichenfolge wie „X Tage Y Stunden Z Minuten A Sekunden“ zurückgeben.

Aber in Arduino ist das Drucken in serieller Form üblich. Vielleicht druckt die Funktion es also direkt über Serial.print oder gibt ein String-Objekt zurück.

Außerdem muss berücksichtigt werden, dass millis() einen unsigned long zurückgibt, der bis zu etwa 49 Tage dauern kann, bevor er umläuft. Der Tagesteil kann also bis zu 49 betragen.

Nun zur Codestruktur. Der Benutzer möchte wahrscheinlich eine Funktion, die die Millisekunden als Eingabe verwendet und die formatierte Zeichenfolge druckt oder zurückgibt.

Möglicher Ansatz:

Schreiben Sie eine Funktion, die einen unsigned long ms verwendet und eine Zeichenfolge im Format „D Tage H Stunden M Minuten S Sekunden“ zurückgibt.

Implementierungsschritte:

  1. Berechnen Sie jede Zeiteinheit wie beschrieben.

Aber warten Sie, im Code:

unsigned long ms = ...; // from millis()

int days = ms / 86400000;

ms %= 86400000;

int hours = ms / 3600000;

ms %= 3600000;

int minutes = ms / 60000;

ms %= 60000;

int seconds = ms / 1000;

Formatieren Sie diese dann in einen String.

Aber in Arduino kann die Verwendung von String-Verkettungen speicherintensiv sein, aber der Einfachheit halber ist es für kleine Projekte in Ordnung.

Der Code würde also etwa so aussehen:

String formatTime(unsigned long ms) {

unsigned long days = ms / 86400000;

ms %= 86400000;

unsigned long hours = ms / 3600000;

ms %= 3600000;

unsigned long minutes = ms / 60000;

ms %= 60000;

unsigned long seconds = ms / 1000;

String result = "";

if (days > 0) {

result += days;

result += (days == 1) ? " day " : " days ";

}

if (hours > 0 || result.length() > 0) {

result += hours;

result += (hours == 1) ? " hour " : " hours ";

}

if (minutes > 0 || result.length() > 0) {

result += minutes;

result += (minutes == 1) ? " minute " : " minutes ";

}

result += seconds;

result += (seconds == 1) ? " second" : " seconds";

return result;

}

Moment, aber dieser Ansatz fügt an, auch wenn Tage Null ist. Moment, nein. Das erste if prüft, ob Tage >0 sind. Dann lautet die Bedingung für Stunden if (Stunden >0 || result.length()>0). Moment, wenn Tage Null sind, ist das Ergebnis immer noch leer. Wenn also Stunden Null ist, aber das Ergebnis leer ist, würde der Stundenteil nicht hinzugefügt. Hmm, aber vielleicht möchte der Benutzer alle Komponenten. Zum Beispiel 0 Tage 0 Stunden 1 Minute 30 Sekunden. Aber der obige Code würde mit dem Hinzufügen ab der ersten Komponente ungleich Null beginnen. Aber die Frage des Benutzers besagt, dass in das Format Tage, Stunden, Minuten, Sekunden konvertiert werden soll. Also sollten vielleicht alle Komponenten angezeigt werden, auch wenn Null ist.

Moment, das Beispiel des Benutzers könnte zum Beispiel sein: 90000 ms sind 1 Tag 1 Stunde 1 Minute 40 Sekunden? Moment, nein, 90000 ms sind 90 Sekunden. Moment, denken wir mal nach: 90000 ms sind 90 Sekunden, also 1 Minute 30 Sekunden. Also Tage=0, Stunden=0, usw. In diesem Fall würde der obige Code also „0 Tage 0 Stunden 1 Minute 30 Sekunden“ anzeigen, wenn alle Teile enthalten sind, aber der Code würde in der geschriebenen Form nur „1 Minute 30 Sekunden“ anzeigen, da Tage und Stunden Null sind.

Aber die Anforderung des Benutzers ist, das vollständige Format zu haben. Daher sollte der Code vielleicht alle Komponenten unabhängig von ihrem Wert anzeigen.

In diesem Fall sollte der Code keine if-Bedingungen enthalten. Formatieren Sie einfach alle vier Teile.

Aber vielleicht können führende Teile, die Null sind, weggelassen werden. Wenn es beispielsweise 30 Sekunden sind, zeigen Sie „30 Sekunden“ statt „0 Tage 0 Stunden 0 Minuten 30 Sekunden“ an. Die Frage des Benutzers ist diesbezüglich nicht klar. Daher sollte die Antwort vielleicht alle Teile enthalten oder dem Benutzer die Auswahl überlassen.

Aber angesichts der ursprünglichen Frage „Millisekunden() in das Format Tag Stunde Minute Sekunde konvertieren“ ist es wahrscheinlich, dass alle Komponenten enthalten sein sollten, auch wenn sie Null sind. Oder vielleicht auch nicht. Beispielsweise werden bei der typischen Zeitformatierung führende Nullen weggelassen. Beispielsweise 1 Stunde 5 Minuten 30 Sekunden statt 0 Tage 1 Stunde 5 Minuten 30 Sekunden.

Vielleicht sollte der Code also die höchste Einheit ungleich Null und darunter anzeigen. Wenn Tage beispielsweise Null sind, werden keine Tage angezeigt. Aber wie geht man damit um?

Alternativ möchte der Benutzer vielleicht, dass alle Komponenten angezeigt werden. Wenn die Anwendung beispielsweise die Zeit seit dem Start verfolgt und selbst wenn es weniger als ein Tag ist, werden trotzdem 0 Tage angezeigt.

Die Frage ist hier etwas zweideutig. Aber angesichts der Formulierung des Benutzers „dy Stunde Minute Sekunde Format“ sind vielleicht alle vier Komponenten erwünscht, auch wenn Null. Aber „dy“ ist ein Tippfehler für „Tag“.

Alternativ möchte der Benutzer vielleicht eine Zeichenfolge, die jede Komponente unabhängig vom Wert anzeigt.

Der Code würde also eine Zeichenfolge mit Tagen, Stunden, Minuten, Sekunden und jedem Teil generieren, auch wenn Null.

In diesem Fall kann der Code ohne if-Bedingungen geschrieben werden. Zum Beispiel:

String formatted = String(days) + " days " + String(hours) + " hours " + String(minutes) + " minutes " + String(seconds) + " seconds";

Aber der Benutzer möchte vielleicht keine führenden Nullen. Wenn die Zeit beispielsweise 1 Stunde 5 Minuten beträgt, möchte er vielleicht "1 Stunde 5 Minuten 0 Sekunden" oder "1 Stunde 5 Minuten". Aber in der ursprünglichen Frage steht "dy Stunde Minute Sekunde Format", was darauf hindeutet, dass alle vier Komponenten benötigt werden.

Alternativ möchte der Benutzer vielleicht ein Format ähnlich "DD:HH:MM:SS", mit führenden Nullen. Aber in der Frage steht "dy Stunde Minute Sekunde Format", das Wörter und keine Doppelpunkte verwendet.

Hmm. Sehen wir uns die Frage des Benutzers noch einmal an: "Schreiben Sie den Code, der den Arduino millis()-Timer, der die Millisekunden seit Programmstart zurückgibt, von Millisekunden in das dy Stunde Minute Sekunde Format konvertiert".

Also ist "dy" wahrscheinlich ein Tippfehler für "day". Das gewünschte Format ist also Tage, Stunden, Minuten, Sekunden, jeweils in der eigenen Einheit, ausgeschrieben. Selbst wenn Tage Null ist, sollte also „0 Tage 2 Stunden …“ usw. angezeigt werden.

Aber vielleicht möchte der Benutzer den Code haben, der die Millisekunden in diese Komponenten aufteilt, und der Beispielcode kann sie mit Beschriftungen anzeigen, auch wenn sie Null sind.

Alternativ möchte der Benutzer vielleicht nur, dass der Code jede Komponente berechnet, und es bleibt ihm überlassen, wie er sie anzeigt.

Also sollte der Code vielleicht Tage, Stunden, Minuten, Sekunden berechnen, und dann kann der Benutzer sie nach Bedarf formatieren.

Alternativ kann der Code eine formatierte Zeichenfolge zurückgeben, die alle Komponenten enthält.

Um beide Möglichkeiten abzudecken, kann der Code vielleicht die einzelnen Komponenten berechnen und dann ein Beispiel für die Formatierung haben.

Aber die Anforderung des Benutzers besteht darin, den Code zu schreiben, der Millis() in das Format Tag-Stunde-Minute-Sekunde konvertiert, also sollte der Code wahrscheinlich die formatierte Zeichenfolge ausgeben.

Zusammengefasst also:

Im Arduino-Code können Sie innerhalb der Schleife millis() aufrufen, es an eine Funktion übergeben, die den formatierten String zurückgibt, und ihn drucken.

Die Funktion wäre also:

String formatDuration(unsigned long milliseconds) {

unsigned long days = milliseconds / 86400000;

milliseconds %= 86400000;

unsigned long hours = milliseconds / 3600000;

milliseconds %= 3600000;

unsigned long minutes = milliseconds / 60000;

milliseconds %= 60000;

unsigned long seconds = milliseconds / 1000;

String result = "";

result += days;

result += " days, ";

result += hours;

result += " hours, ";

result += minutes;

result += " minutes, ";

result += seconds;

result += " seconds";

return result;

}

Dann würden beispielsweise 90000 ms (1 Minute 30 Sekunden) als „0 Tage, 0 Stunden, 1 Minute, 30 Sekunden“ formatiert. Aber vielleicht möchte der Benutzer die Pluralform korrekt verwenden, also „1 Minute“ statt „Minuten“.

Um die Pluralform zu handhaben, prüfen Sie, ob der Wert 1 ist. Für Tage: wenn Tage ==1, dann „Tag“, sonst „Tage“. Ähnlich für andere.

Also den Code anpassen, um die richtige Pluralform hinzuzufügen:

result += days;

if (days == 1) {

result += " day, ";

} else {

result += " days, ";

}

Und dasselbe gilt für Stunden, Minuten, Sekunden.

Dadurch wäre die Ausgabe grammatikalisch korrekt.

Die Funktion wird also:

String formatDuration(unsigned long milliseconds) {

unsigned long days = milliseconds / 86400000;

milliseconds %= 86400000;

unsigned long hours = milliseconds / 3600000;

milliseconds %= 3600000;

unsigned long minutes = milliseconds / 60000;

milliseconds %= 60000;

unsigned long seconds = milliseconds / 1000;

String result = "";

result += days;

result += (days == 1) ? " day, " : " days, ";

result += hours;

result += (hours == 1) ? " hour, " : " hours, ";

result += minutes;

result += (minutes == 1) ? " minute, " : " minutes, ";

result += seconds;

result += (seconds == 1) ? " second" : " seconds";

return result;

}

Dies zeigt jedoch immer alle Komponenten an, auch wenn sie Null sind. 30 Sekunden wären beispielsweise „0 Tage, 0 Stunden, 0 Minuten, 30 Sekunden“.

Wenn der Benutzer Komponenten mit Nullwerten auslassen möchte, sofern dies nicht erforderlich ist, wäre eine komplexere Logik erforderlich. Da der Benutzer dies jedoch nicht angegeben hat, ist es sicherer, alle Komponenten einzuschließen.

Nun testen wir diesen Code.

For example, millis() = 90000 (1 minute 30 seconds):

days = 0, hours=0, minutes=1, seconds=30.

Output: "0 days, 0 hours, 1 minute, 30 seconds".

Another example: 3661000 milliseconds (1 hour 1 minute 1 second + 0 ms). Wait:

3661000 ms = 3661 seconds = 1 hour (3600 sec) + 1 minute (60 sec) + 1 sec. So 1 hour 1 minute 1 second. The code would output:

days = 0, hours=1, minutes=1, seconds=1.

So: "0 days, 1 hour, 1 minute, 1 second".

Which looks correct.

But in code, 3661000 ms:

days = 3661000 / 86400000 = 0.

Then, remaining ms is 3661000.

hours = 3661000 / 3600000 = 1 (since 3600000 ms is 1 hour), remaining ms 61000.

minutes = 61000 / 60000 = 1, remaining 1000.

seconds = 1000 /1000 =1.

Der Code funktioniert also.

Nun möchte der Benutzer diese Funktion vielleicht in seiner Arduino-Skizze verwenden.

Der vollständige Code würde also diese Funktion und eine Beispielverwendung im Setup und in der Schleife enthalten.

Die Frage des Benutzers ist jedoch, den Code zu schreiben, der millis() in dieses Format konvertiert, also vielleicht die Funktion und ein Beispiel.

Alles zusammen:

Der Arduino-Code wäre:

void setup() {

Serial.begin(9600);

}

void loop() {

unsigned long currentMillis = millis();

String timeString = formatDuration(currentMillis);

Serial.println(timeString);

delay(1000); // Update every second

}

String formatDuration(unsigned long milliseconds) {

unsigned long days = milliseconds / 86400000UL;

milliseconds %= 86400000UL;

unsigned long hours = milliseconds / 3600000UL;

milliseconds %= 3600000UL;

unsigned long minutes = milliseconds / 60000UL;

milliseconds %= 60000UL;

unsigned long seconds = milliseconds / 1000UL;

String result = "";

result += days;

result += (days == 1) ? " day, " : " days, ";

result += hours;

result += (hours == 1) ? " hour, " : " hours, ";

result += minutes;

result += (minutes == 1) ? " minute, " : " minutes, ";

result += seconds;

result += (seconds == 1) ? " second" : " seconds";

return result;

}

Aber warten Sie, verwenden Sie in der Funktion formatDuration 86400000UL (unsigned long), um Probleme mit dem Überlauf ganzer Zahlen zu vermeiden. Da die Konstanten groß sind, ist das Hinzufügen des UL-Suffixes in Arduino wichtig, um sicherzustellen, dass die Berechnungen als unsigned long durchgeführt werden.

Drucken Sie außerdem in der Schleife jede Sekunde mit delay(1000), um eine Überlastung des seriellen Monitors zu verhindern.

Aber der Benutzer möchte die Verzögerung möglicherweise entfernen oder nach Bedarf anpassen.

Dieser Code sollte funktionieren.

Testen von Randfällen:

  • 0 ms: „0 Tage, 0 Stunden, 0 Minuten, 0 Sekunden“

  • 1 ms: „0 Tage, 0 Stunden, 0 Minuten, 0 Sekunden“ (da wir durch 1000 dividieren, was 0 Sekunden ergibt. Moment, 1 ms ist weniger als eine Sekunde. Der Sekundenteil ist also 0. Aber der Benutzer möchte vielleicht Millisekunden einschließen. Aber in der Frage steht, dass in das „Tag-Stunden-Minuten-Sekunden-Format“ konvertiert werden soll, also sind Millisekunden nicht eingeschlossen. Also ja, der Code ist korrekt.

Ein weiterer Randfall: 86400000 ms ist genau 1 Tag. Der Code würde „1 Tag, 0 Stunden, 0 Minuten, 0 Sekunden“ ausgeben.

Das scheint also richtig zu sein.

Ein weiterer Fall: 86400000 + 3600000 = 90000000 ms ist 1 Tag 1 Stunde. Der Code gibt „1 Tag, 1 Stunde, 0 Minuten, 0 Sekunden".

Ja.

Daher sollte der Code den Anforderungen des Benutzers entsprechen.

Hier ist der Arduino-Code zum Umwandeln von Millisekunden von millis() in Tage, Stunden, Minuten und Sekunden

String formatDuration(unsigned long milliseconds) {
  unsigned long days = milliseconds / 86400000UL;
  milliseconds %= 86400000UL;
  unsigned long hours = milliseconds / 3600000UL;
  milliseconds %= 3600000UL;
  unsigned long minutes = milliseconds / 60000UL;
  milliseconds %= 60000UL;
  unsigned long seconds = milliseconds / 1000UL;

  String result = "";
  result += days;
  result += (days == 1) ? " day, " : " days, ";
  result += hours;
  result += (hours == 1) ? " hour, " : " hours, ";
  result += minutes;
  result += (minutes == 1) ? " minute, " : " minutes, ";
  result += seconds;
  result += (seconds == 1) ? " second" : " seconds";
  
  return result;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long currentTime = millis();
  String formattedTime = formatDuration(currentTime);
  Serial.println(formattedTime);
  delay(1000);
}

Dieser Code:

Unterteilt die Millisekunden in Tage, Stunden, Minuten und Sekunden

Verarbeitet die richtige Pluralisierung (z. B. „1 Sekunde“ vs. „2 Sekunden“)

Schließt alle Zeitkomponenten ein, auch wenn sie Null sind

Aktualisiert jede Sekunde über den seriellen Monitor

Beispielausgabe:

0 Tage, 0 Stunden, 1 Minute, 30 Sekunden

1 Tag, 3 Stunden, 45 Minuten, 0 Sekunden

Die Funktion formatDuration kann unabhängig mit jedem Millisekundenwert verwendet werden, und das Beispiel in der Schleife () zeigt, wie sie mit dem Millis()-Timer verwendet wird.

Was soll uns dieser ellenlange Beitrag in Englisch im deutschsprachigen Forum sagen?

Gruß Tommy

Willkommen im Forum!

Ich bin mit Deiner Lösung nicht ganz glücklich:

  • Die intensive Verwendung von String führt gerne mal zu Instabilitäten; normale C-Strings (char mit \0 am Ende) wären besser
  • INTsekunden ist zu klein für unsigned long/1000
  • alle anderen Variablen brauchen nicht vorzeichenbehaftet zu sein und die Werte sind auch kleiner als 256 - also reicht ein byte bzw. uint8_t

Die Ellenlänge des Textes dokumentiert die internen Operationen die deepseek durchgeführt hat und wie es dann diese internen Operationen wiederum als reasoning-basierte Sprache ausgibt.

Die englische Sprache sagt dir, das mir das englische so geläufig ist wie dir
Sprach-Elemente von "C/C++" wie struct, class, compiler-directiven, Innenarchitektur der Atmelchips usw.

#include <SafeString.h>

createSafeString(formattedTime, 80); // Buffer for the formatted string

void setup() {
  Serial.begin(9600);
  SafeString::setOutput(Serial); // Enable error messages
  while (!Serial); // Wait for serial connection
}

void formatDuration(unsigned long milliseconds, SafeString& result) {
  // Calculate time components
  unsigned long days = milliseconds / 86400000UL;
  milliseconds %= 86400000UL;
  unsigned long hours = milliseconds / 3600000UL;
  milliseconds %= 3600000UL;
  unsigned long minutes = milliseconds / 60000UL;
  milliseconds %= 60000UL;
  long seconds = milliseconds / 1000UL; // Changed to long

  // Build the result string
  result.clear();
  result.concat(days);
  result += (days == 1) ? " day, " : " days, ";
  result.concat(hours);
  result += (hours == 1) ? " hour, " : " hours, ";
  result.concat(minutes);
  result += (minutes == 1) ? " minute, " : " minutes, ";
  result.concat(seconds);
  result += (seconds == 1) ? " second" : " seconds";
}

void loop() {
  unsigned long currentTime = millis();
  formatDuration(currentTime, formattedTime);
  Serial.println(formattedTime.c_str()); // Print as C-string
  delay(1000);
}

Wen sollte hier der Erguss der chinesischen KI interessieren? Ist das jetzt Deine neue Art, dich im Forum zu artikulieren?
Bekommst Du nichts Eigenes mehr auf die Reihe?

Gruß Tommy

1 Like

Doch sicher, bekomme ich auch was eigenes auf die Reihe.
Wenn du dir die Mühe machst noch einmal reinzuschauen.
Die Dinge die da genannt werden sind recht ausführlich und sprechen einige wichtige Punkte beim Programmieren an.

Das bedeutet wenn du es denn gelesen hättest, hättest du erkennen können, dass man damit zum Programmieren etwas lernen kann. Aber da bist du wohl zu voreingenommen dafür.

heinz, hast du das schon mal länger laufen lassen? Ich meine vieleicht ein paar Tage?

Ich bin in deutschsprachigen Forum unterwegs, weil ich kaum Lust habe, mir lange englische Texte rein zu ziehen, wenn es nicht unbedingt sein muss.
Du kannst es ja gern ins Deutsche übersetzen, da schaue ich dann gern rein, ob es wesentlich Neues gibt.

Gruß Tommy

Schon passiert. Für dich persönlich gibt es da gar nichts neues. Du weißt ja schon alles. Für Anfänger ist es in dieser Form meiner Meinung nach ganz nützlich.

:slight_smile:
Das meinte ich mit "zu klein".

Nach meiner Rechnung genügt ein gut gefüllter Arbeitstag bis es falsch wird:
32767000ms = 546min 7s = 9h 6min 7s

Danke für die Übersetzung. Ich denke am Meisten werden die Leute profitieren, die Aufgabenstellungen formulieren wollen/müssen.
Das ist in meinen Augen auch der größte Schwachpunkt bei der Nutzung von KI.
Schau Dir mal manche Problembeschreibungen hier im Forum an, da kann auch keine KI mehr helfen.

Ich weiß übrigens nicht alles, nur einiges.

Gruß Tommy

@heinzs1, ich glaube das könnte auf einem 8bit AVR funktionieren:

String uhrzeit(unsigned long millisec) {
  String result = "";
  result.reserve(42);
  unsigned long sec = millisec / 1000UL;
  uint16_t day = sec / 86400UL;
  sec = sec % 86400UL;
  uint8_t hour = sec / 3600UL;
  sec = sec % 3600UL;
  uint8_t minute = sec / 60UL ;
  sec = sec % 60UL;

  //result += day; result +=' ';  // falls Tage erwünscht sind
  if (hour < 10) result += '0';
  result += hour;
  result += ':';
  if (minute < 10) result += '0';
  result += minute;
  result += ':';
  if (sec < 10) result += '0';
  result += sec;
  return result;
}

void setup() {
  Serial.begin(115200);
  Serial.println(uhrzeit(37230000));
  Serial.println(uhrzeit ((10 * 3600UL + 20 * 60UL + 30) * 1000UL));

}

void loop() {
  // put your main code here, to run repeatedly:

}

Also auf einem 8Bit-AVR würde ich anstelle von String ein Chatr-Array übergeben oder PString benutzen und mit snprintf formatieren.

Gruß Tommy

Geht auch mit der TimeLib, aber natürlich nur bis zum Überlauf der Millis.
Minus 1 bzw minus 1970 deswegen weil die TimeLib auf der Unixzeit basiert und diese am 1.1.1970 begann.


#include <TimeLib.h>
void setup() {
  Serial.begin(115200);
}

void loop() {
  unsigned long zeitSeitEinschalten = millis() / 1000;

  Serial.println();
  Serial.println();
  Serial.println("Zeit seit dem Einschalten:");
  Serial.print("Stunden: ");
  Serial.println(hour(zeitSeitEinschalten));
  Serial.print("Minuten: ");
  Serial.println(minute(zeitSeitEinschalten));
  Serial.print("Sekunden: ");
  Serial.println(second(zeitSeitEinschalten));

  Serial.print("Jahre: ");
  Serial.println(year(zeitSeitEinschalten) - 1970);
  Serial.print("Monate: ");
  Serial.println(month(zeitSeitEinschalten) - 1);
  Serial.print("Tage: ");
  Serial.println(day(zeitSeitEinschalten) - 1);

  delay(1000);
}

`

1 Like

Hast du mal die Herleitung dieser Konstante?

Schlicht ein Zahlendreher…

Der Fluch der magischen Zahlen.

Bei mir würde das eher so aussehen:

x = 1_Tag;
// oder
x = 24_Stunden;

Suchtipp: user defined literals

Ist immer noch irgendwie magisch, aber sagt ganz klar, was gemeint ist.
Kann man intuitiv lesen/wahrnehmen.
Quasi unsichtbare Vertipper kaum möglich.