das mit der Lib hat bisher prima funktioniert; und tatsächlich so einfach gehalten, dass selbst ich's verstehe.
Was mir nur etwas negativ auffällt: Ich gebe die Uhrzeit auf meinem LCD aus; und die Funktion scheint keine anführenden 0en zurück zu geben.
Beispiel:
23:4:5 statt 23:04:50
Im Source konnte ich keinen Trigger finden, mit dem ich das umstellen kann. Gibt es da eine Möglichkeit, oder muss ich die Sekunden/Minuten/Stunden zuvor per IF abfangen, prüfen ob es einstellige Zahlen sind, und darauf eine 0 voran stellen?
in der Lib gibt es dazu so viel ich weiss keine Funktion dazu
eine Lösung des Problems ist die von dir genannte Variante, eine andere Möglichkeit ist sprintf zu verwenden
habe mir überlegt ggf. eine andere Library zu verwenden. Auf der Arduino-Seite wurde "Time" (ehem. DateTime) aufgelistet. Also mal schnell den Code umgekrempelt und festgestellt, dass das iwie mit meiner RTC nicht funktioniert.
Im Quelltext habe ich aber einen Punkt gefunden, der genau das tut, was ich mit der obigen RTC-Lib vor hatte: Wenn Zahl < 10, gibt vor der Zahl eine 0 aus. Also kann ich mir die Time-Lib sparen und das selbst schreiben.
Gesagt, getan. Komischerweise hat das nicht funktioniert - wenn die Zahl kleiner als 10 war, sollte auf dem Display eine 0 und dann die eigentliche Zahl ausgegeben werden. Da hatte ich dann komische Anzeigen im Display; also einfach mal die Zahlen mit und ohne Funktion über Serial ausgegeben.
Wenn wir z.B. den 5. diesen Monats haben, wurde einmal eine 5 ausgegeben (ohne meine Funktion), und mit Funktion eine 1.
Nun ist mir eine Idee gekommen (den soviel Fehlerpotential bietet diese IF-Abfrage nicht): Kann es sein, dass von der DateTime-Funktion kein INT für HOUR, MIN, etc. ausgegeben wird? Und die nächste Frage: Kann ich feststellen, welcher Datentyp der Wert einer Variable hat?
thewknd:
in der Lib gibt es dazu so viel ich weiss keine Funktion dazu
eine Lösung des Problems ist die von dir genannte Variante, eine andere Möglichkeit ist sprintf zu verwenden
sprintf(outstring,"%d:%02d:%02d",hour,min,sec);
Noch eine kurze Frage dazu: Funktionsweise von sprintf() verstanden - nur nicht, was es mit %02d auf sich hat?
ob der Arduino alle Optionen unterstützt -> keine Ahnung
sprintf(outstring,"%d:%02d:%02d",hour,min,sec);
der grüne Bereich ist der "Platzhalter/die Formatanweisung" für die Variable "sec". Die Ausgabe wird so formatiert, dass zwei Digit (Stellen) angezeigt werden und falls "sec" kleiner als 10 ist, wird eine "0" eingefügt.
feine Sache, das mit der Funktion Habe mir gleich mal was kleines geschrieben; da ich ja doch mehrfach auf die Uhrzeiten und Datumsdaten zurückgreifen muss:
int DisplayDate(int type) {
// Gibt eine der nachfolgenden Daten auf dem LCD aus
// 1: hh:mm:ss
// 2: hh:mm
// 3: dd.mm.yyyy
// 4: dd.mm.
char string[ 10 ] = { "" };
DateTime now = RTC.now();
switch (type) {
case 1:
sprintf(string,"%d:%02d:%02d",now.hour(),now.minute(),now.second());
lcd.print(string);
break;
case 2:
sprintf(string,"%02d:%02d",now.hour(),now.minute());
lcd.print(string);
break;
case 3:
sprintf(string,"%02d.%02d.%d",now.day(),now.month(),now.year());
lcd.print(string);
break;
case 4:
sprintf(string,"%02d.%02d.",now.day(),now.month());
lcd.print(string);
break;
}
}
deine Variable string ist zu kurz. Bei der Option 3 hast du schon 10 Zeichen Text. In einem char Array muss immer ein abschliessendes '\0' Platz haben.