Long formtiert ausgeben

Hallo, ich bekomme von einem GPS Modul die Uhrzeit in UTC Teim als Long Variable. z.B. 102356 diese möchte ich auf einem OLED Display in einer lesbaren Art ausgeben z.B. 10:35:56

Kann mir da jemand bitte weiterhelfen

Gruß Ingo

Wenn du die Zahl 123456 als “12:34:56” ausgeben willst,
musst du sie zuerst in einen Text wandeln, ( ltoa )
dann auf eventuell erforderliche führende Null prüfen ( strlen )
und dann die 5 bis 6 Zeichen einzeln in einen anderen Text “hh:mm:ss” umkopieren.

long time = 65432;
char buffer[10];
ltoa(time, buffer,10);
char myTime[]="hh:mm:ss";

byte shift =1; // default: copy 1:1

if strlen(buffer < 6) {
   myTime[0] = '0';
   shift = 0;   // copy 1->2 2->3  usw.
}
else {
   myTime[0]= buffer[0];
}
for (byte i = 0; i < 5;i++)
  myTime[i+1] = buffer[i+shift];

Soll das Ganze auch in der Zeit (00:00 ... 00:59) funktionieren, und welche Zahl hast du da ?

Sind es also 1 .. 6 Zeichen, und nicht 5 .. 6, musst du noch ein bisschen was selber machen.

Wie du z.B.

102356 ... auf einem OLED Display ... 10:35:56

hinkriegen kannst, weiss ich übrigens nicht.

Hallo Michael, Danke für die schnelle Antwort. Wie die Uhrzeit um Mitternacht aussieht muss ich mal heute Abend testen. Die Ausgabe für das Display ist kein Problem, dank der Lib ist es ähnlich wie bei der seriellen Ausgabe an's Terminal. Dein Beispiel werde ich nachher mal testen. Gruß Ingo

Du kannst auch einfach bei Zahlen bleiben und dividieren.

sek = zeit%100
min = (zeit/100)%100
stu = zeit/10000

Nachteil ist daß Du führende Nullen bei der Ausgabe hinzufügen mußt.

if (sek <10) print(“0”);
print (sek);

Grüße Uwe

Hallo Uwe, auch Dir vielen Dank.

Wenn ich Eure Beispiel getestet habe, gebe ich eine Rückmeldung.

Gruß Ingo

So ich habe es mal Probiert.
Das Beispiel vom Uwe läuft.
Musste ich noch etwas anpassen, da ich vom GPS auch die 100’stle Sekunden angezeigt bekomme.
Also z.b. 224515452

int mics = utcTime%100;
int sek = utcTime/1000%100;
int min = (utcTime/100000)%100;
int stu = utcTime/10000000;

und gebe es dann so aus

 GOFoled.print(stu+2);
    GOFoled.print(":");
    GOFoled.print(min);
    GOFoled.print(":");
    if (sek <10) GOFoled.print("0");
    GOFoled.println(sek);

GOFoled kommt von der OLED Lib (GOFi2cOLED) und könnt z.B. auch durch Serial… ausgetauscht werden.

Das Beispiel vom
Michael will bei mir gar nicht.
Bei der Zeile if strlen(buffer < 6) { fehlen die Klammern
Wenn ich es in if (strlen(buffer < 6)) { ändere
bekomme ich die Fehlermeldung
ISO C++ forbids comparison between pointer and integer

Hier dann noch das Resultat.

Gruß Ingo

Bei int sek = utcTime/1000%100; solltest Du noch Klammern setzen. Ich weiß nicht in welcher Reihenfolge die Rechenoperationen ausgeführt werden. ok, Punktrechnung vor Strichrechnung aber was ist Modus? Grüße Uwe

Wenn ich es in if (strlen(buffer < 6)) { ändere
bekomme ich die Fehlermeldung
ISO C++ forbids comparison between pointer and integer

Sorry für die späte Antwort:

if (strlen(buffer) < 6) {
  // Die Länge des Texts in buffer ist hier kürzer als 6 Buchstaben 
  // ...  
}

das sollte ich, auch ohne den Compiler anzuwerfen, nun richtig hinbekommen haben.

Uwe’s Lösung ist auch ein guter Ansatz, und wenns wie gewünscht läuft: Glückwunsch !

Danke

Gern geschehen,

der Glückwunsch galt aber mehr Scotch :wink:

Von mir auch noch mal Danke für die Korrektur.
Werde es heute Abend auch noch mal probieren.
Gruß Ingo

michael_x:
Gern geschehen,

der Glückwunsch galt aber mehr Scotch :wink:

das Danke war aber für

Uwe’s Lösung ist auch ein guter Ansatz …

:wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink:

Uwe