Wortuhr Zeitumstellung (Arduino Due)

Hallo Arduino Forum.

Ich bin ziemlich neu im Forum und brauche eure Hilfe zu einem Projekt.
Ich arbeite seit einiger Zeit an einem Nachbau einer "Wortuhr" die ich mit einem Arduino Due ansteuren möchte.
Ich habe dazu ein ziemlich simples Programm dafür geschrieben.
Die Uhr funktioniert seit einigen Tagen einwandfrei und sehr präzise doch ich weiss leider nicht wie ich sie dazu bringe, die Zeit umzustellen.

Das ganze funktioniert mit der Schedulerfunktion mit der ich 2 Schleifen (In meinem Fall sind es loop2 und loop3) gleichzeitig laufen lasse. Die erste Schleife beinhaltet die 4 Eck-LED`s die die einzelnen Minuten anzeigen. Die andere Schleife ändert im 5 minuten takt die anzuzeigenden Wörter.

Nun meine Frage:
Gibt es eine Möglichkeit 1 Button zu integrieren mit der ich beispielsweise loop3 unterbrechen kann und an einer anderen Stelle innerhalb der Schleife weiterlaufen lassen kann? Soquasi den Code für eine Stunde zu überspringen?

Habe schon verschiedene Youtube- Tutorials angeschaut und das Arduino Tutorial durchgelesen doch irgendwie komme ich einfach nicht weiter.

Ich bedanke mich herzlich im Voraus für jeden Tipp.

Hier noch ein Teil meines Codes:

#include <Scheduler.h>

Scheduler.startLoop(loop2);
Scheduler.startLoop(loop3);

//Dieser Teil zeigt die Minuten an (Eck LED`s)
void loop2() {
digitalWrite(erstemin, LOW);
digitalWrite(zweitemin,LOW);
digitalWrite(drittemin,LOW);
digitalWrite(viertemin,LOW);
delay(60000);
digitalWrite(erstemin, HIGH);
delay(60000);
digitalWrite(zweitemin,HIGH);
delay(60000);
digitalWrite(drittemin,HIGH);
delay(60000);
digitalWrite(viertemin,HIGH);
delay(60000);
digitalWrite(erstemin,LOW);
digitalWrite(zweitemin,LOW);
digitalWrite(drittemin,LOW);
digitalWrite(viertemin,LOW);
}
void loop3() { // Hier startet dann die erste Stunde
digitalWrite(esist,HIGH);
digitalWrite(zwoelf, HIGH);
digitalWrite(uhr,HIGH);
delay(300000);
digitalWrite(uhr,LOW);
digitalWrite(fuenf2,HIGH);
digitalWrite(nach,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(zehn2,HIGH);
delay(300000);
digitalWrite(zehn2,LOW);
digitalWrite(viertel,HIGH);
delay(300000);
digitalWrite(viertel,LOW);
digitalWrite(zwanzig,HIGH);
delay(300000);
digitalWrite(zwanzig,LOW);
digitalWrite(nach,LOW);
digitalWrite(zwoelf,LOW);
digitalWrite(fuenf2,HIGH);
digitalWrite(vor,HIGH);
digitalWrite(halb,HIGH);
digitalWrite(eins,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(vor,LOW);
delay(300000);
digitalWrite(fuenf2,HIGH);
digitalWrite(nach,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(nach,LOW);
digitalWrite(halb,LOW);
digitalWrite(vor,HIGH);
digitalWrite(zwanzig,HIGH);
delay(300000);
digitalWrite(zwanzig,LOW);
digitalWrite(viertel,HIGH);
delay(300000);
digitalWrite(viertel,LOW);
digitalWrite(zehn2,HIGH);
delay(300000);
digitalWrite(zehn2,LOW);
digitalWrite(fuenf2,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(vor,LOW);
digitalWrite(uhr,HIGH);
delay(300000);
// Hier die 2te Stunde
digitalWrite(uhr,LOW);
digitalWrite(fuenf2,HIGH);
digitalWrite(nach,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(zehn2,HIGH);
delay(300000);
digitalWrite(zehn2,LOW);
digitalWrite(viertel,HIGH);
delay(300000);
digitalWrite(viertel,LOW);
digitalWrite(zwanzig,HIGH);
delay(300000);
digitalWrite(zwanzig,LOW);
digitalWrite(nach,LOW);
digitalWrite(eins,LOW);
digitalWrite(fuenf2,HIGH);
digitalWrite(vor,HIGH);
digitalWrite(halb,HIGH);
digitalWrite(zwei,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(vor,LOW);
delay(300000);
digitalWrite(fuenf2,HIGH);
digitalWrite(nach,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(nach,LOW);
digitalWrite(halb,LOW);
digitalWrite(vor,HIGH);
digitalWrite(zwanzig,HIGH);
delay(300000);
digitalWrite(zwanzig,LOW);
digitalWrite(viertel,HIGH);
delay(300000);
digitalWrite(viertel,LOW);
digitalWrite(zehn2,HIGH);
delay(300000);
digitalWrite(zehn2,LOW);
digitalWrite(fuenf2,HIGH);
delay(300000);
digitalWrite(fuenf2,LOW);
digitalWrite(vor,LOW);
digitalWrite(uhr,HIGH);
delay(300000);

Der arme Due wird bald das Zeitliche segnen, verstorben an akuter Langeweile. :wink:
Wir hatten hier im Forum neulich einen Vergleich, da hieß es in etwa so: "Das ist, als würdest du mit dem 7,5-Gönner Brötchen holen fahren." Du setzt noch einen oben drauf und fliegst gleich mit dem Jumbojet... :smiley:

Wie auch immer, die Benutzung von delays sind kontraproduktiv: Zum einen sind sie nur so genau wie der Referenztakt, zum anderen blockieren sie den Programmablauf. Die Nutzung der Scheduler-Library ist dann nur der Versuch, einen ungünstigen Programmieransatz auszubügeln.

Noch was: Bitte immer den Code in die entsprechenden Code-Tags setzen.

hi,

kontraproduktiv deshalb, weil Du knöpfe drücken kannst, soviele Du willst. Du wirst praktisch immer grade in einer der 300000 mS-phasen sein und dann ist dem arduino das wurst. schau mal bei Examples>Blinkwithoutdelay nach und bau Deinen code um, vorher macht das keinen sinn.

gruß stefan

Wie hast Du die LED angesteuert?

Wieso verwendest Du keinen RTC-Baustein und dann einen DCF77 Empfänger oder einen UKW Radio-Empfänger mit RDS? Mit beiden kannst Du den RTC synchronisieren und hast eine hochgenaue Zeitanzeige mit automatischer Umschaltung zur Sommerzeit.

Grüße Uwe

Danke für die schnellen hilfreichen Tipps.

Ich hatte es mir schon gedacht, dass das Programm grundlegend anderst geschrieben werden muss:) funktioniert fürs erste jedoch auch so ganz gut :slight_smile:

Werde mich demnächst ans neue Programm rantasten.

Das "taktgefühl" hat der Due übrigens gut im Griff... Hatte zeitgleich eine Stoppuhr laufen lassen. Nach 20 Tagen war die Abweichung kleiner als 0.1 Sekunden. Das sind weniger als 2 Sekunden aufs Jahr.

Für jeden weiteren Tip bin ich natürlich sehr dankbar.

maestro_dom

maestro_dom:
Danke für die schnellen hilfreichen Tipps.

Ich hatte es mir schon gedacht, dass das Programm grundlegend anderst geschrieben werden muss:) funktioniert fürs erste jedoch auch so ganz gut :slight_smile:

Werde mich demnächst ans neue Programm rantasten.

Das "taktgefühl" hat der Due übrigens gut im Griff... Hatte zeitgleich eine Stoppuhr laufen lassen. Nach 20 Tagen war die Abweichung kleiner als 0.1 Sekunden. Das sind weniger als 2 Sekunden aufs Jahr.

Für jeden weiteren Tip bin ich natürlich sehr dankbar.

maestro_dom

Also ich habe mal die Wortuhr von hier http://www.mathias-wilhelm.de/arduino/projects/text-clock/ auf den Arduino portiert rödelt auf nen TFT vor sich hin. Sketch füge ich mal an. RTC lib findest du hier GitHub - MarkusLange/Arduino-Due-RTC-Library: RTC Library for the Arduino Due. Habe das ganze aber auch mal auf ein LCD gewuchtet neben ein paar anderen Anzeigen, hänge ich auch mal an.

Grundsätzlich hat sth77 recht der Due hat dabei langeweile und viel zu viel Speicher übrig ein AtMega328P reicht da völlig.

Markus

Text_Clock_om_Due.ino (9.47 KB)

DCF_Uhr_fuer_Rainer_final_mit_Sensor_for_Board.ino (14.4 KB)

20 Tage und dann nur 0.1s Abweichung??? Das wären 57 ppb. Das erreicht man in der Regel nur mit sehr teurem Meßequipment. Hast Du Deine Uhr mal mit einer Funkuhr verglichen?

Wie sieht es aus mit der Wortuhr weitere Erfolge?
Ich habe vor einem halben Jahr eine Wortuhr mit hilfe von Microcontoller.net (Frontplatte) gebaut.Die Hardware ist mit zwei MAX7221 über SPI (LED Array 10*11) Als die haupt CPU ist eine Arduino Nano und eine RTC DS1308 und ein Pushbutton mit OneButton Bedienung (>750ms is Moduswechsel >10ms und <700ms ist +1).
Kann gerne mal den Sketch on stellen wennn Bedarf da.

Vielleicht gerade weil ihm "so langweilig" war, war er so genau mit der Zeit. Ich hatte eine Stoppuhr aus der Schule mit integrierter Funkuhr benutzt. Ich nehme an, diese ist schon ziemlich genau da Sie letztes Jahr bei Skirennveranstaltungen gebraucht wurde.

Leider bin ich nicht mehr dazu gekommen das Programm umzuschreibem. Bin neulich auf ein Link gestossen bei dem auf 70 Seiten Schritt-für-schritt der Aufbau einer Wortuhr erklärt wird, inklusiv Sketch. Allerdings wurde der Arduino durch ein RBBB ersetzt.

Wen ich ihn nochmals finde, poste ich ihn hier.

MFG maestro_dom