Hallo,

letztes Mal haben wir das LCD-Display an den Arduino angeschlossen und das Ganze mit einem passenden Sketch in eine Digitaluhr verwandelt.

Und heute machen wir wie versprochen mit diesem Projekt weiter und verpassen unserer Uhr eine Weltzeitanzeige und eine Alarmfunktion.

Dabei kommen wir mit relativ wenig neuer Hardware aus. Ein Taster genügt, um die verschiedenen Zeitzonen durchzuschalten. Und für den Alarm brauchst du natürlich einen Lautsprecher. Hier tut es ein einfacher Piezo-Summer, den du direkt an einen Digitalpin des Arduino anschließen kannst.

Beginnen wir mit der Weltzeituhr

Hier bauen wir auf das auf, was wir schon haben. Der Sketch aus der letzten Lektion stellt uns eine Funktion zur Verfügung, die aus einer Sekundenzahl eine komplette Uhrzeit-Anzeige im Stringformat macht. Die Idee ist jetzt, eine Liste mit Städten anzulegen und zu jedem Städtenamen jeweils zusätzlich die Zeitverschiebung in Stunden gegenüber unserer Ortszeit abzuspeichern. Mit einem Druck auf den Taster soll dann die nächste Stadt in die Anzeige geladen werden. Dazu geben wir den Städtenamen im Display aus und rufen  die Uhrzeit-Anzeige auf, wobei wir die Zeitverschiebung im Funktionsargument beim Aufruf berücksichtigen. Bereit? Prima, dann kann es losgehen:

Arduino Weltzeituhr
Arduino Weltzeituhr

Ein virtueller Sortimentskasten

Um eine Liste abzuspeichern lernen wir erstmal einen neuen Datentyp kennen. Listen sind ziemlich wichtige Datentypen, die in der Informatik ständig auftauchen. Schließlich sind sie die einfachste Möglichkeit, Daten zu speichern. Wir verwenden dazu ein sogenanntes Array. Ein Array ist eine durchnummerierte Liste von Variablen. Jeder Eintrag, der in einem Array gespeichert ist hat eine Nummer, seinen Index. Über den Index kannst du beliebige Elemente aus der Liste ansprechen, ihnen Werte zuweisen oder Werte auslesen. Vielleicht hast du einen Sortimentskasten für deine Elektronik-Bauteile. Ein Array ist eigentlich nichts anderes, als eine Reihe virtueller Kästen:

Mit dieser Zeile haben wir ein Array mit 4 Elementen definiert. Nun weisen wir den Sortimentskästen ein paar Werte zu:

Und du kannst überall im Code auf die einzelnen Fächer zugreifen, zum Beispiel mit einer Abfrage:

Anstatt die Werte einzeln zuzuweisen, kannst du auch direkt bei der Definition die Liste mit übergeben.  Wir legen jetzt für die Weltzeituhr ein Array mit Städtenamen an und gleich ein weiteres  mit den dazu passenden Zeitverschiebungen.

New York, Rio, Tokyo…

Wir benötigen also ein Stringarray für die Städte und ein Integer-Array für die Zeitverschiebung. Dazu übernehmen wir folgenden Code in den Definitionsteil zu Beginn des Sketchs:

Zunächst definieren wir eine Konstante, in der wir die Anzahl der Städte festhalten. Danach kommt die Array-Definition der Städtenamen und gleich dahinter werden in derselben Reihenfolge die Zeitverschiebungen in Stunden gespeichert. Die Liste kannst du natürlich beliebig erweitern und verändern. Denk daran, danach auch die Konstante LocNr anzupassen. Eventuell musst du auch die Sommerzeit berücksichtigen, die aktuelle Zeitverschiebung kannst du unter zeitverschiebung.net nachschlagen.

Die Variable currentLoc  ist der Indexzähler. Dort speichern wir zur Laufzeit die Nummer der Stadt, die aktuell angezeigt werden soll. Das Weiterschalten der Städte soll mit einem Taster gemacht werden.

Das kannst du schon, denn in Lektion 2 und zu Beginn von Lektion 4 haben wir uns mit dem Einbauen und Abfragen eines Tasters beschäftigt. Schau im Zweifelsfall einfach dort nochmal nach.

Wir schließen den Taster zwischen GND und DIGITAL 7 an. Doch wie setzen wir nun die Abfrage des Tasters und das Umschalten der Zeit um?

Du erinnerst dich vielleicht an den Anfang der vierten Lektion, wo die  Abfrage des Tasters mit einer kleinen Verzögerung nochmal wiederholt haben, um ihn damit zu entprellen. Dieser Code leistet uns auch heute wieder gute Dienste:

Wenn der Arduino einen Tastendruck erkennt, wird erstmal ein String aus 20 Leerzeichen auf den Bildschirm geschickt. Das ist nötig, weil sonst etwas auf dem Display stehen bleiben könnte, wenn dort zum Beispiel gerade „Los Angeles“ mit 11 Zeichen angezeigt wird und dies mit den 8 Zeichen „New York“ überschrieben würde, dann blieben hinten 3 Zeichen stehen und wir hätten „New Yorkles“ aus dem Display. Deshalb löschen wir vorher die komplette Anzeigebreite.

Das Wichtigste passiert aber in der Zeile

Der Zeiger auf den aktuellen Anzeigeort wird eins hochgezählt. Du erkennst wieder den Modulo-Operator % , der uns schon bei der Anzeige der Uhrzeit in der letzten Lektion sehr nützlich war. Diesmal sorgt er dafür, dass wir wenn wir über den letzten Eintrag der Liste hinausgehen, wieder vorne bei 0 anfangen. Der Techniker nennt das dann „zyklisch durchschalten“.

Als nächstes schaun wir unter der Position currentLoc  in der Liste nach dem Stadtnamen und schreiben ihn ins Display:

Aber auch auf die Zeitanzeige hat das natürlich eine Auswirkung.

Vom letzten mal weißt du noch wie wir das gemacht hatten: Wie haben in der Variablen  secs   die Anzahl an Sekunden seit dem Start des Sketches eingelesen und über eine Funktion daraus die Uhrzeit berechnet und in einen Anzeigestring umgewandelt.

An dieser Stelle kommt jetzt einfach die Zeitverschiebung dazu:

Offset  war die eingestellte Start-Uhrzeit und danach addieren wir die aktuelle Zeitverschiebung in Sekunden.

Aus dieser Variablen wird dann die Anzeigezeit berechnet.

Mit diesen Anpassungen kann die Weltzeituhr an den Start gehen! Übrigens: Manche Zeitzonen haben gegenüber unserer Zeit noch eine halbstündige Verschiebung, das kopmmt zum Beispiel in Indien vor. Das könnten wir mit der jetzigen Version nicht abbilden.  Kannst du den Sketch dafür erweitern? (Tipp: Zeitverschiebung in Minuten angeben).

Jetzt wird der Arduino laut

Kommen wir nun zum Abschluss des Projekts und erweitern die Uhr um eine Alarm-Funktion. Dabei wirst du dem Arduino zum ersten Mal Töne entlocken. Der Arduino-Compiler hat dafür bereits eine eingebaute Funktion tone().

Diese schickt eine sogenannte Rechteckwelle mit wählbarer Frequenz auf einen digitalen Pin. Wir werden uns in einer späteren Lektion ausführlicher mit Tonerzeugung beschäftigen, heute genügt erstmal, dass eine Rechteckwelle einen recht scharfen und künstlich klingenden Ton ergibt und dass die Frequenz der Tonhöhe entspricht. Der Ton dauert an, bis ein neuer Ton gespielt wird, oder bis du mit der Funktion noTone() den Lautsprecher wieder abschaltest.

Du brauchst natürlich einen Lautsprecher oder Piezo-Summer für die Tonerzeugung. Piezo-Töner gibt es im Elektronikhandel.

Piezo-Lautsprecher
Piezo-Lautsprecher

Den Töner kannst du direkt zwischn GND und einem freien digitalen Pin anschließen, wir haben Pin 8 gewählt.

Um Krach zu schlagen, fehlt nun noch eine kleine Hilfsfunktion.  Sie legt die Tonfolge des Alarmsignals fest. Das kannst du natürlich frei gestalten. Diese Variante hier erinnert etwas an eine Polizeisirene:

Und schon wieder etwas Neues! Die for-Schleife ist eine wichtige Kontrollstruktur in der Programmierung. Sie dient dazu, einen Anweisungsblock mehrere Male zu wiederholen. Dabei wird eine Indexvariable hochgezählt. Du gibst in der Definiiton nach for  an, von wo bis wo der Index laufen soll und welche Schrittweite er haben soll.Diesen Index kannst du dann innerhalb des Anweisungsblocks verwenden. Sehr nützlich in Verbindung mit Arrays, wenn zum Beispiel irgendetwas gemacht werden soll für jedes Element.

In diesem Beispiel hier heißt der Index i und läuft von 0 ( int i=0; ) bis 2 ( i < 3; ) in Einer-Schritten ( i++  ist eine Anweisung, die i um eins hochzählt.).

Die for-Schleife wird also genau drei mal ausgeführt, das heißt unser Alarmton wiederholt sich dreimal.

Nun wird es Zeit alles zusammenzufügen und damit das Projekt Weltzeituhr mit Alarmfunktion abzuschließen!

Hier siehst du den Aufbau mit den beiden neuen Elementen:

 

Weltzeituhr mit Alarmfunktion
Weltzeituhr mit Alarmfunktion

Wir kommen zum Sketch. Die meisten Neuerungen haben wir schon oben im Text besprochen.

Es fehlt nur noch das Auslösen des Alarms. Die Alarmzeit übergeben wir genauso, wie die Startuhrzeit beim Hochladen des Sketchs. Das geschieht in Zeile 22. Intern geben wir alle Uhrzeiten als Sekundenzahl seit 0:00:00 Uhr an, daher rechnet Zeile 23 die Alarmzeit in dieses Format um.

Was jetzt noch fehlt? Klar, eine if-Abfrage!

Die steht in Zeile 88 und ist ziemlich selbsterklärend: Wenn die Uhrzeit gleich der Alarmzeit ist, dann soll Alarm ins Display geschrieben werden und die Funktion alarm() soll ihr Signal abspielen.

Das wars! Unser erstes größeres Projekt ist geschafft!

Und wenn du von Uhren nicht genug bekommen kannst, nutze doch den Taster und das LCD-Display für den Bau einer Stoppuhr! Dafür kannst du wieder mit der Funktion millis() arbeiten und diesmal vielleicht die Anzeige um die Ausgabe der Hundertstelsekunden erweitern.

Wenn du bisher alle Lektionen durchgearbeitet hast, dann hast du das notwendige Rüstzeug dafür parat. Es wäre toll, wenn du in den Kommentaren über deine Erfahrungen damit berichtest. Viel Spaß beim Uhrenbasteln und bis zum nächsten Mal!

 

Die Weltzeituhr mit Alarmfunktion Teil 2 von 2

3 Gedanken zu „Die Weltzeituhr mit Alarmfunktion Teil 2 von 2

  • 28. September 2015 um 11:10
    Permalink

    Mein Päckchen aus Schanghai ist da! jetzt wird umgesetzt!

    Antworten
    • 28. September 2015 um 11:25
      Permalink

      Ja super! Dann wünsche ich viel Spaß beim Basteln. Und wenn es noch Fragen zum Arduino oder sonstigen Teilen gibt, gerne hier in den Kommentaren posten.

      Herzliche Grüße,

      Robert

      Antworten
      • 28. September 2015 um 11:26
        Permalink

        worauf Du Dich verlassen kannst! 😉

        Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.