Arduino Lektion 93: setzen der Uhrzeit an einer RTC DS3231 RealTimeClock

In diesem Beitrag möchte ich gesondert auf das setzen der Uhrzeit an einer RTC DS3231 eingehen. 

Ich habe bereits ein ausführliches Tutorial zur RTC DS3231 unter Arduino Lektion 17: RealTimeClock RTC DS3231 erstellt, jedoch sind noch einpaar Fragen offen geblieben welche ich nun hier ergänzend liefern möchte.

Es gibt die RTC in zwei Varianten wobei beide Ihren Vor und Nachteil haben, die kleinere hat die gleiche Funktion jedoch ist die Batterie verlötet d.h. wenn diese einmal verschlissen ist muss eine neue Eingelötet werden wobei beim größeren Model die Batterie einfach ausgetauscht werden kann.

Für die große RTC mit Batteriefach für eine LIR-2032 wird eine wiederaufladbare Knopfzelle CR2032 (Bezeichnung LIR-2032) benötigt. Diese sind deutlich teurer als die „normalen“ einmal Batterien. Diese wiederaufladbaren Akkus sind auf ebay.de für ca. 4€ inkl. Versandkosten erhältlich.

Teileliste

Microcontroller

Für die nachfolgenden Beschreibungen verwende ich den kompatiblen Arduino UNO Microcontroller von Keyestudio.

Arduino UNO kompatibles Board von Keyestudio
Arduino UNO kompatibles Board von Keyestudio

Diesen Microcontroller habe ich bereits im Tutorial Arduino UNO kompatibles Board von Keyestudio ausführlich beschrieben. Jedoch ist dieser wie ein „normaler“ Arduino UNO nur das dieser einpaar Pins mehr hat.

Module

Und man benötigt den Hauptakteur die RTC, wie bereits erwähnt verwende ich hier 2 verschiedene Module welche jedoch mit der selben Bibliothek betrieben werden kann und somit sich eigentlich nicht unterscheiden. Einmal habe ich die RTC DS3231 in Groß und einmal in Klein. Was beide Varianten eint ist, das diese über I2C angeschlossen werden (SDA & SCL).

Zubehör

Des Weiteren werden einige Breadboardkabel und ggf. ein Breadboard (min. 170 Pins) benötigt.

Breadboards
Breadboards

Aufbau & Schaltung

Die beiden RTC Module verfügen jeweils über die I2C Pins somit werden diese an die analogen Pins A4 (SDA) & analogen Pin A5 (SCL) angeschlossen.

RTC DS3231 am Arduino UNO
RTC DS3231 am Arduino UNO

Anschluß

RTC DS3231 groß  RTC DS3231 klein  Arduino UNO  
SCLDanaloger Pin A5
SDACanaloger Pin A4
5V+5V
GNDGND

Erstmal verwende ich die kleine Variante der RTC DS3231 und möchte aufzeigen wie diese programmiert wird.

RTC DS3231 am Arduino UNO von Keyestudio
RTC DS3231 am Arduino UNO von Keyestudio

Programmieren

Nun, nachdem die RTC erfolgreich mit dem Arduino verbunden wurde, können wir diese programmieren. Zunächst einmal müssen wir die Zeit setzen, dieses können wir mit zwei Methoden tun, einmal manuell über die Eingabe des seriellen Monitors oder über einen Zeitstempel eines Sketches. Beides hat seine Vor & Nachteile aber sie funktionieren.

manuelle Eingabe über den seriellen Monitor der Arduino IDE

Als erstes möchte ich erläutern wie man das Datum und die Uhrzeit über den seriellen Monitor der Arduino IDE einstellen kann. 

Es gibt auch andere Programme über welche man eine serielle Verbindung zu einem Microcontroller wie dem Arduino UNO aufbauen kann, zbsp. Platform I/O  oder aber Atmels eigene Entwicklung Atmel Studio. Beide Tools sind sehr gut aber auch sehr Umfangreich und für kleinere Projekte viel zu umständlich (nach meiner Meinung).

Den seriellen Monitor der Arduino IDE erreicht man entweder über den Shortcut Strg + Umschalt + M , der Schaltfläche oben rechts oder aber über das Hauptmenü Werkzeuge > Serieller Monitor.

serieller Monitor der Arduino IDE
serieller Monitor der Arduino IDE

Man kann in diesem Fenster nicht nur Daten betrachten welche vom Microcontroller zbsp. per Serial.print(), Serial.println() gesendet werden sondern man kann auch Daten absenden. Die Daten werden in dem Eingabefeld eingegeben und mit Enter bestätigt. 

empfangen von Daten über einer seriellen Schnittstelle

Um Daten in einem Sketch zu verarbeiten, müssen wir zunächst auf das empfangen von Daten reagieren. Dazu prüft man zunächst ob Daten anliegen und kann diese danach auswerten.

Dabei wird jedes Zeichen als ASCII Nummer zurück geliefert.

Ausgabe der ASCII Nummern auf dem seriellen Monitor
Ausgabe der ASCII Nummern auf dem seriellen Monitor

Wir wollen jedoch keine ASCII Zeichen speichern sondern Text, daher benötigen wir ein Char Array. Das Char Array bietet uns vereinfacht gesagt „out of the Box“ die Möglichkeit unsere ASCII Nummern Werte in lesbare Zeichen umzuwandeln. Des Weiten benötigen wir noch eine Funktion um zu prüfen ob nun in diesem Char Array die Zeichenkette „set“ vorkommt, denn nur dann soll die Auswertung der Eingabe erfolgen.

Ein Problem ist hier jedoch dass, nicht geprüft wird ob die Zeichenkette „set“ am Anfang oder Ende steht, es wird lediglich geprüft das diese Vorkommt.

Ausgabe der Prüfung auf das Vorkommen der Zeichenkette "set"
Ausgabe der Prüfung auf das Vorkommen der Zeichenkette „set“

Nun kann man mit der Pointer Substraction aus dem Char Array die Position herausrechnen.

Die Programmiersprache für den Arduino ist C bzw. C++. Diese Programmiersprache arbeitet mit Pointern diese Zeigen auf Adressen im Speicher. Wie das genau funktioniert werden ich in einem späteren Tutorial erläutern, für dieses Tutorial sollte es reichen zu wissen das man in diese Speicherbereiche lesen und schreiben kann.

Nachdem wir nun die Position der Zeichenkette „set“ ermitteln können, wollen wir festlegen das die Eingabe nur ausgewertet wird denn die Zeichenkette bei Position 0 steht (quasi am Anfang der Eingabe).

Wenn nun die Zeichenkette nicht gefunden wird und / oder nicht an Position 1 steht dann soll eine entsprechende Meldung ausgegeben werden.

Fehlermeldung nach dem validieren der empfangenen Daten
Fehlermeldung nach dem validieren der empfangenen Daten

Wir haben nun die empfangenen Daten erfolgreich validiert somit können wir nun im nächsten Gang die Zeichenkette parsen und das Datum und die Uhrzeit extrahieren.

Um den Sketch jedoch übersichtlich zu halten wird das ganze zunächst in eine eigene Funktion ausgelagert welche als Rückgabewert ein Boolean hat. Ein Boolean kann zwei Status annehmen True & False. Die neue Funktion liefert also Boolean.True zurück wenn das lesen der Werte okay ist und Boolean.False wenn ein Fehler aufgetreten ist. (Die Fehlermeldungen werden weiterhin ausgegeben.)

parsen von Datum & Uhrzeit

definieren des Datumsformats

Bevor wir mit dem parsen des Datums und der Uhrzeit beginnen, müssen wir zunächst definieren in welchem Format dieses geliefert werden muss. Da ich aus Deutschland komme und die meisten Besucher / Betrachter meines Blogs aus eben Deutschland sind, möchte ich erläutern wie man das Format TT.MM.JJJJ HH:mm:SS parst. 

Wobei

  • TT – für den Tag mit ggf. führender 0 steht, (min. 00, max. 31)
  • MM – für den Monat mit ggf. führender 0 steht, (min. 01, max. 12)
  • JJJJ – für das Jahr in 4 stellig steht, (min. 1900, max. 9999)
  • HH – für die Stunde mit ggf. führender 0 steht, (min. 00, max. 23)
  • mm – für die Minute mit ggf. führender 0 steht, (min. 00, max. 59)
  • SS – für die Sekunde mit ggf. führende 0 steht, (min. 00, max. 59)

Das Trennzeichen für Tag,Monat und Jahr ist ein Punkt und für die Uhrzeit der Doppelpunkt.

Wir haben nun die Werte für Tag, Monat, Jahr, Stunde, Minute und Sekunde in den Felder t, mo, j, st, mi, s.
Im nächsten Schritt müssen wir diese Werte auf die RealTimeClock schreiben. Da diese Funktion auch für die 2. Lösung benötigt wird möchte ich zunächst erläutern wie man einen Zeitstempel aus einem deployten Sketch auslesen kann. Hier gehts zur Funktion zum schreiben eines Zeitstempels auf die RTC.

lesen eines Zeitstempels von einem deployten Sketch

Wenn ein Sketch auf den Arduino hochgeladen wird (umgangssprachlich als deployment bezeichnet),  dann wird zusätzlich ein Timestamp abgelegt, dieser entspricht bis auf wenige Sekunden dem aktuellen Zeitstempel. Das Problem ist nur dass, der Sketch einmal ausgeführt und die Zeit sofort auf die RTC geschrieben werden muss, danach darf dieses nicht erneut gestartet werden.

Daher wird das ganze nicht in der loop ausgeführt sondern im Setup somit wird sichergestellt dass, diese Funktion nur einmal beim starten ausgeführt wird.

Für den nachfolgenden Sketch bedienen wir uns zweier Konstanten „__DATE__“ & „__TIME__“ diese werden mit dem Zeitstempel des Uploads setzt. 

Das Datum ist im Format „Jun 30 2019“ somit müssen wir die engl. Abkürzungen für die Monate gegen den Monatsnamen prüfen. Diese Prüfung mache ich mit einer einfachen Schleife über die Monate und wenn diese Werte gleich sind breche ich die Schleife ab und merke mir den Index. Zu diesem Index muss jedoch noch eine Zahl drauf addiert werden, denn Arrays beginnen immer bei 0 jedoch die Monate bei 1.

Die Funktion „loop“ bleibt in diesem Beispiel leer da der Code wie bereits beschrieben nur einmal ausgeführt werden soll.

Was nun noch fehlt ist ein Sketch um sich dann die Zeit anzuzeigen bzw. etwas damit zu tun.

Video

Hier nun ein kurzes Video.

 

schreiben eines Zeitstempels auf die RTC

Für das schreiben des Zeitstempels benötigen wir zusätzlich eine Bibliothek damit wir auf die RTC zugreifen können. (Es ist die Wire Bibliothek.)

Diese Bibliothek ist der Arduino IDE bereits beigefügt somit muss in der Regel nichts installiert werden.

Zusätzlich müssen wir die Adresse der RTC definieren, diese können wir entweder dem Datenblatt entnehmen oder aber mit einem I2C Scanner herausfinden.

Des Weiteren benötigen wir 2 zusätzliche Hilfsfunktionen welche uns die Integerwerte für Tag, Monat, Jahr usw. in Binäre Werte umwandelt (und wieder zurück).

Diese beiden Funktionen setze ich im Sketch ganz nach unten da diese nur zur Hilfe dienen.

Wie bereits erwähnt dient dieses Tutorial zur Ergänzung daher nutze ich im groben die Funktionen aus dem bereits bekannten Tutorial wieder. Daher, hier nun die Methode um die Zeit zu setzen:

Diese Funktion rufen wir bei erfolgreichen lesen und parsen des Zeitstempels auf.

Ausgabe der aktuellen Zeit von der RTC

Damit wir die aktuelle Zeit lesen können benötigen wir wiederum eine Funktion welche die Daten von der RTC ließt und für uns umwandelt.

In der vorletzen Zeile der Funktion, formatieren wir uns unseren Zeitstempel wieder in das deutsche Format.

Damit wir in einem Sketch einen Zeitstempel lesen und setzen können habe ich dieses so gelöst das alle 5 Sekunden ein Zeitstempel ausgegeben wird. Somit kann man eine ggf. auftretende Fehlermeldung lesen.

 

Downloads

Hier möchte ich nun die Sketche für den Arduino zum Download anbieten.

 

 

2 Gedanken zu „Arduino Lektion 93: setzen der Uhrzeit an einer RTC DS3231 RealTimeClock

  • September 2, 2019 um 16:11
    Permalink

    Die obige Tabelle „Anschluss“…
    SDA und SCL vertauscht ?

    Antwort
    • September 3, 2019 um 16:33
      Permalink

      Hi,

      ja sorry. Habe ich nun korrigiert.
      Danke für den Hinweis.

      Gruß,

      Stefan

      Antwort

Schreibe einen Kommentar

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