Funktion millis() to Uhrzeit

Keine Angst.
Meine Fehler mach ich mir selbst.
Grüße Uwe

Also erstmal Danke für die vielen Anregungen.

Ich lasse es mal ein paar Tage laufen um zu sehen was passiert...

Noch eine Frage:
Wenn ich als Rückgabe zwei werte ausgebe zB:
return backString; taUHR;

Wie handhabe ich sowas ?? (mit einer Variable als Rückgabewert weis ich es ... aber wie sieht das aus mit 2 ? Wie sieht der Aufruf der Funktion aus ?)

Geht nicht. Aber du kannst eine Struktur zurückgeben: Returning multiple values from a C++ function - Stack Overflow

Sorry @uwefed: Das ging an @StefanL38, nicht an Dich.

Gruß Tommy

wegen den mehreren Werten übergeben:

geht das dann so nicht ?

nein zu nicht. Geht schon.
Lies dir den ganzen Thread durch, probiere die Beispiele aus.
Auch das was dir hier schon gepostet wurde (--> z.B. die Hinweis auf die Struktur)

Wie schon geschrieben, an eine Datenstruktur können mehrere Datenwerte zurückgegeben werden.

Beispiel:

#include <Streaming.h>
Print &cout {Serial};

struct myTime {
  uint8_t hours;
  uint8_t minutes;
  uint8_t seconds;
};

// Rückgabe mehrerer Einzelwerte in eine Datenstruktur
myTime getTime() {
  uint8_t fHours {12};
  uint8_t fMinutes {56};
  uint8_t fSeconds {10};
  return {fHours, fMinutes, fSeconds};
}

void setup() {
  Serial.begin(115200);
  myTime data;
  data = getTime();
  cout << "Time: " << data.hours << ":" << data.minutes << ":" << data.seconds;

}

void loop() {}

Weiß ich. Wollte aber dennoch klarstellen daß ich keine fremden Fehler als meine eigenen ausgebe, sondern meine selbst mache.
:smiley: :wink:

Grüße Uwe

1 Like

Ah, ok. Jetzt habe ich es verstanden.

Gruß Tommy

In Anlehnung an @Kai-R eine andere Variante

#include <Streaming.h>
Print &cout {Serial};


uint8_t hours;
uint8_t minutes;
uint8_t seconds;


// Rückgabe mehrerer Einzelwerte in eine Datenstruktur
void getTime(uint8_t &h, uint8_t &m, uint8_t &s)
{
  h = 12;
  m = 56;
  s = 10;
}

void setup()
{
  Serial.begin(115200);
  getTime(hours, minutes, seconds);
  cout << "Time: " << hours << ":" << minutes << ":" << seconds;
}

void loop() {}

Jo, eine Möglichkeit, nur keine Antwort auf die Frage…

Da wird nichts von einer Funktion zurückgegeben. Es wird der Inhalt des Speichers geändert, auf den die Referenzen verweisen.

Nur, um für den @TO mal den Unterschied zu erläutern.

Hallo,

@ heinzs1:
wie noiasca schon schrieb. Lies bitte den ganzen von dir gefundenen Thread. Dein Problem ähnelt sehr stark meinem. Ist das wirklich schon 12 Jahre her. :thinking: Und jurs gibts leider nicht mehr. Im Grunde steht alles im Thread zur Frage. Danach kann man hier auf Fragen dazu eingehen.
Stichworte für dich sind erstmal Call by Value oder Call by Reference und deren Unterschied klar machen. Erst danach wirst du die Infos aus dem Thread hier verstehen.

... dass die Foren-App (discors?) in Betracht ziehen könnte, KI zu verwenden, um sprachneutral zu werden, indem sie Interaktionen (nicht Code) in der bevorzugten Sprache des Benutzers anzeigt. Danke für die Nachfrage. <3 Hz

ich habs mal bsichen umgeschreiben und bleiber vorerst mal bei der Version bis ich im C etwas weiter bin.

//Funktion uhrzeit _____________________________________________________________________________________________
String uhrzeit(unsigned long millisekunden) {  //Übergabe von millis() und Rückgabewert Uhrzeit im Format String 00:00:00
  //Serial.println("___________(f) start_________");
  uint8_t secUHR; uint8_t sec10; uint8_t sec01; unsigned long Sekunden;
  uint8_t minUHR; uint8_t min10; uint8_t min01; unsigned long Minuten;
  uint8_t stdUHR; uint8_t std10; uint8_t std01; unsigned long Stunden;
  uint8_t tagUHR; unsigned long Tag;
  String backString;
  //Serial.print(millisekunden);Serial.println(" millisekunden");
  Sekunden = millisekunden / 1000;
  //Serial.print(Sekunden);Serial.println("Sekunden");
  Minuten = Sekunden / 60;
  //Serial.print(Minuten);Serial.println("Minuten");
  Stunden = Minuten / 60;
  //Serial.print(Stunden);Serial.println("Stunden");
  Tag = Stunden / 24;
  //Serial.print(Tag);Serial.println("Tag");

  tagUHR = Tag;
  stdUHR = Stunden - Tag * 24;
  minUHR = Minuten - Stunden * 60;
  secUHR = Sekunden - Minuten * 60;

  //Tag******************************************
  //Serial.print(tagUHR);Serial.println(" taUHR");
  //Stunden******************************************
  //Serial.print(stdUHR);Serial.println(" stdUHR");
  std10 = stdUHR / 10;
  std01 = stdUHR - std10 * 10;
  //Serial.print(std10);Serial.println(" std10");
  //Serial.print(std01);Serial.println(" std01");
  //Minuten******************************************
  //Serial.print(minUHR);Serial.println(" minUHR");
  min10 = minUHR / 10;
  min01 = minUHR - min10 * 10;
  //Serial.print(min10);Serial.println(" min10");
  //Serial.print(min01);Serial.println(" min01");
  //Sekunden******************************************
  //Serial.print(secUHR);
  //Serial.println(" secUHR");
  sec10 = secUHR / 10;
  sec01 = secUHR - sec10 * 10;
  //Serial.print(sec10);Serial.println(" sec10");
  //Serial.print(sec01);Serial.println(" sec01");
  //String zusammensetzen******************************************
  backString = String(tagUHR) + "/" + String(std10) + String(std01) + ":" + String(min10) + String(min01) + ":" + String(sec10) + String(sec01);
  //oder für ohne Tag:
  //backString = String(std10) + String(std01) + ":" + String(min10) + String(min01) + ":" + String(sec10) + String(sec01);
  //Serial.print(backString);Serial.println(" (f)ZEIT");
  //Serial.println("___________(f) ende_________");
  //delay(2000);
  return backString;
  
}  // Funktion UHRZEIT ENDE ________________________________________________________________

Einen sehr wichtigen.

Ich habe eine ähnliche Routine in einer meiner Projekte verwendet.
Es geht dabei nicht wirklich um die Uhrzeit. Sondern um die Abgelaufene Zeit in einer verständlichen Darstellung.

In meine Fall war es ein ablaufender Timer.

Allerdings ist meine Routine bedeutet kleiner . :wink:

Edit ich würde sie ja posten aber sie ist nin B4R geschrieben, deshalb hier nur die Vorgehensweise.

Abgelaufende_millis / 1000 = Sekunden
INT (Sekunden / 3600) = Std.
Sekunden - (std * 3600) = Rest_in_Sekunden
INT ( Rest_in_sekunden / 60) = Minuten
Die restlichen Sekunden jucken mich nicht.

Das ergebnis einfach an das Display schicken.

Fertig ist.

Gruß

Pucki

Ich würde dann mal ein Beispiel u.a. mit dem von @Combi in #20 erwähnten Mechanismus
nachschieben:

Code
#include <Streaming.h>
Print& cout {Serial};

// Anleihe von @Combie
using Millis = decltype(millis());   // mostly 32Bit, sometimes 64Bit
constexpr Millis operator"" _ms(unsigned long long int t) { return t; }

constexpr Millis operator"" _seconds(unsigned long long int t) { return t * 1000_ms; }
constexpr Millis operator"" _minutes(unsigned long long int t) { return t * 60_seconds; }
constexpr Millis operator"" _hours(unsigned long long int t) { return t * 60_minutes; }
constexpr Millis operator"" _days(unsigned long long int t) { return t * 24_hours; }

constexpr Millis operator"" _second(unsigned long long int t) { return t * 1000_ms; }
constexpr Millis operator"" _minute(unsigned long long int t) { return t * 60_seconds; }
constexpr Millis operator"" _hour(unsigned long long int t) { return t * 60_minutes; }
constexpr Millis operator"" _day(unsigned long long int t) { return t * 24_hours; }

class Timer
{
  public:
    void start() {timeStamp = millis();}
    bool operator() (const unsigned long duration) const {
      return (millis() - timeStamp >= duration) ?  true : false;
    }
  private:
    unsigned long timeStamp {0};
};


class MillisToTime {
public:
   void time(Millis tMillis) {
    vDays = tMillis / 1_day;
    tMillis %= 1_days;
    vHours = tMillis / 1_hour;
    tMillis %= 1_hours;
    vMinutes = tMillis / 1_minute;
    tMillis %= 1_minutes;
    vSeconds = tMillis / 1_second;
  }

  uint8_t seconds() const { return vSeconds; }
  uint8_t minutes() const { return vMinutes; }
  uint8_t hours() const { return vHours; }
  uint8_t days() const { return vDays; }

private:
  uint8_t vSeconds {0};
  uint8_t vMinutes {0};
  uint8_t vHours {0};
  uint8_t vDays {0};
};

Timer interval;
MillisToTime mtt;

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

void loop() {
  static char tBuffer[12] {"00:00:00:00"};

  if (interval(1_second)) {
    interval.start();
    mtt.time(millis());
    
    snprintf(tBuffer, sizeof(tBuffer), "%02d:%02d:%02d:%02d", mtt.days(), mtt.hours(), mtt.minutes(), mtt.seconds());
    cout << tBuffer << endl;
    
    // cout << _FMT("%:%:%:%", _WIDTHZ(mtt.days(), 2), _WIDTHZ(mtt.hours(), 2), _WIDTHZ(mtt.minutes(), 2),
    // _WIDTHZ(mtt.seconds(), 2))
    // << endl;
  }
}

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