Zeitberechnung für MicroSD Ausgabe - Rätsel oder Blindheit?

So, dann muss ich Euch nun auch mal was fragen ^^

Ich denke die "üblichen Infos" (Board, Anwendung, ...) darf ich in dem Fall mal weg lassen :innocent:

Anwendung:
Ich erhebe für ein Projekt Messdaten und schreibe diese auf eine MicroSD.
Damit ich in der Excel später nicht so viel Zeit verliere (Umrechnungen, Diagramme, Auswertung)
lasse ich mir unter loop() gleich die Zeit für Stunde, Minute und Sekunde in int berechnen und schreibe diese mit auf die SD.

Problem:
Nach ca. 9h und 4 Minuten springt die Berechnung auf einmal ins Minus und läuft ab da Rückwärts ... :man_shrugging: :joy:

Auszug Excel:

9 4 45 04 45 9:04:45
-9 -5 -20 -05 -20 -9:-05:-20
-9 -3 -10 -03 -10 -9:-03:-10
-9 -1 0 -01 00 -9:-01:00
-8 -58 -50 -58 -50 -8:-58:-50
-8 -56 -40 -56 -40 -8:-56:-40
-8 -54 -30 -54 -30 -8:-54:-30

Erklärung:
a) |...| = je 1 Spalte
b) |int Berechnung Stunde|int Berechnung Minute|... Sekunde|Excel Umformung Minute auf zwei Stellen (statt 1 = 01)|Excel Umformung Sekunde auf zwei Stellen (statt 1 = 01)|Ausgabe Gesamtzeit (Umformung Excel)|

Die Berechnung läuft mit:

//zusätzliche Variablen zur Berechnung der Verlaufszeit für Ausgabe+DatenLogger (Stunde, Minute, Sekunde) auf Basis "millis()"
  int time = millis()/1000;
  int hh = time / 60 / 60;
  int min = time / 60 - time / 60 / 60 * 60;
  int sek = time - time / 60 * 60;

Frage:
Woher kommt der plötzliche Rücklauf?
Nach meiner Recherche hat das nichts mit "int" zu tun und entweder ist das ein wirkliches Rätsel oder ich seh grad den Wald vor lauter Bäumen nicht :joy:

Bin sehr gespannt und bedanke mich vorab fürs mit rätseln :smile:

PS:

  1. Falls Ihr doch "alle" Infos haben wollt, sagt bescheid - aber des wird ä laaaange Text ^^
  2. Ich hoffe die Kategorie deutsch ist richtig, weitere Unterkategorien habe ich hier nicht gefunden :frowning:

Edit: Prüfung auf Reproduktion läuft, daher leider noch keine verwertbare Aussage hierzu, aber 9h ist auch schwer unter zu bekomm^^

Für Zeiten sollte unsigned long verwendet werden. Dann kann nichts mehr negativ werden.

1 Like

time hat als Wertebereich -32.768 bis 32.767.
32767 Sekunden sind 546 Minuten
546 Minuten sind deine 9 Stunden +x.
Mach da ein unsigned long draus.

1 Like

Je nach board hat ein int bei 32767 einen Überlauf auf -32768.
(formal sogar Undefiniertes Verhalten)

32767 Sekunden sind 9 Stunden und 6 Minuten :slight_smile:

unsigned int geht doppelt so weit und kommt schon fast in den Bereich wo du dich fragen solltest, was du nach 24 Stunden machen willst.

1 Like

Das sind 9 * 60 * 60 + 4 * 60 = 32640
Eine 16 Bit Int Variable mit Vorzeichen kann Zahlen von -32,768 bis 32,767 darstellen wobei das höchste Bit das Vorszeichen darstellt und die restlichen 15 Bit das Zweierkomplement .
siehe: int - Arduino-Referenz

Darum ist Deine Aussage
"Nach ca. 9h und 4 Minuten springt die Berechnung auf einmal ins Minus und läuft ab da Rückwärts " völlig fisiologisch und nachvollziebar bei den Verwendeten Variabeltypen.

Nimm für millis() unsigned long Variablen. Da springt die Zahl nach 4,294,967,295 Sekunden wieder auf null (ca 136 Jahre)

Grüße Uwe

1 Like

Ohje, ich wusste ich sollte die Frage nicht stellen ^^

Vielen Dank euch!

Hatte auch den Verdacht Variable, hab aber dann falsch umegrechnet in der Eile.
Danke für eure Zeit! :smiley:

@agmue
Ich antworte mal hier - dachte das passt nicht zu den Neujahrsgrüßen.
Habe vor zwei Jahren durch Spielerei, Interesse für eine Uni-Arbeit ein Arduino Starterkit bestellt und zum Thema H-Brücke geschrieben.
Danach hatte ich vor Geburt Tochter etwas Zeit und bin die einzelnen Projekte im Projektbuch durch (für alle Anfänger sehr empfehlenswert). Nun bin ich am Ende von meinem Studium und hab für die vorletzte "kleine" Arbeit das Ding ausgegraben und mir eine CO2-Messstation (DHT22, MH-Z19C, SPI MIcroSD und SSD1306 + LEDs gebaut. Einmal UNO einmal ESP8266 mit eigenem Webseiten abruf.
Die Codes bastel ich immer zusammen nachdem ich die Beispiel-Sketche (einzelne Parameter/Funktionen) verstanden hab + Forum + C/C++ Befehle.

Kurz um - ich bin sehr begeistert von dem Thema und ärgere mich wirklich sehr dass ich früher keine Elektronik- oder Informatikausbildung gemacht habe.
Nun ist es aber so und ich freue mich auf die Zeit nachdem Studium auf ein sehr geiles Hobby, bei dem es noch seeeehr viele Elektronik- und Programmierfragen gibt. Außerdem fallen mir einfach zig-1000 Sachen ein die ich mit dem Zeug gern bauen/machen würde... :joy:

Zunächst Dank für Deine Antwort!

Die Faszination kann einen schon mächtig packen, daher schließe ich gleich die Warnung an, die wichtigen Dinge im Leben darüber nicht zu vergessen, sie kann sich wie eine Sucht breit machen.

ESP8266/ESP32 haben schon eine Menge Potential, aber auch mit einem UNO bringt man nette Dinge zusammen.

Also dann bis zu Deiner nächsten Frage :slightly_smiling_face:

1 Like

Die Zeitberechnung kann man auch noch etwas verkürzen:

  uint32_t time = millis() / 1000;
  uint16_t hh = time / 3600;
  uint16_t min = (time / 60) % 60;
  uint16_t sek = time % 60;

Nachtrag ... die "vergessene" / 1000 ergänzt.

1 Like

Da fehlt was :wink:

Uhh das sieht nice aus, aber jetzt nicht böse nehmen ist das "verifiziert"?
Konnte dazu auf die schnelle nichts finden.
Nachdem was ich gelesen hab ist ja eben die besonderheit gerade das für C das x-x nicht Null ist und die gerade beim googeln gefunde <time.h> verwende ich nicht.
Hab eh schon arge KB-Platzprobleme bei dem lütten Speicher ^^

Da hat er Recht :grin:

Ok stimmt

uint32_t time = millis()/1000;

die 1000 ist beim Übertragen flöten gegangen ....

Probier es aus :slightly_smiling_face:

btw...
Ein schönes Projekt bei dem man sieht wie dolle doch die Resonatoren abweichen und die Temperaturkorrelation. Hab unter 20°C tatsächlich wie in einigen Arbeiten zu lesen mittlere Abweichungen von bis zu 1 Sekunde :joy:

Ja.
Die Rechnung ist die selbe wie Deine - nur kompakter geschrieben.

Möchtest Du Deinen Code vorstellen?
Ich wette, da lässt sich ganz viel Platz finden.

Hi und ein schön Sonntag gewünscht :slight_smile:

Ja vielen Dank für das Angebot, das mach ich gern. Schaffe ich aber erst zu Ende der Woche.
Dienstag ist nächster Abgabetermin schwitz :rofl:

Wenn Ihr wollt könnt ihr auch gern die ganze Arbeit haben (nach anonymisierung :stuck_out_tongue: ), ist wirklich low-level und sollte für alle verständlich sein. Oder jemand von euch Profis liest mal drüber und wir ergänzen noch an passenden Stellen - macht aber natürlich nur Sinn wenn Ihr das hier im Forum verwenden könnt und wie gesagt frühestens Ende der Woche ^^

PS: Nach meiner Recherche sind es die zu großen Bibs und um die zu kürzen fehlt mir Programmierer KnowHow. (dht.h, spi.h, sd.h, mhz19.h, softwareserial.h und dann wahrscheinlich noch adafruit gfx und ssd1306. Eigentlich sollte der dht auch die onewire "wire.h" benötigen, aber es läuft auch ohne)

So nun aber! bis denne

Ha! Da bleibt ja noch ein ganzer Montag fürs Labor :grinning:

Ja, die Bibs sind schon gewaltig, aber drüberschaun schad' nix und gibt vielleicht dann doch noch die eine oder andere Anregung.

Na mal schaun.
Sonntag gewünscht...

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