Arduino Tutorial: Real Time Clock (RTC)

Eine RTC ist eine Echtzeituhr, die mit einer Batterie betrieben wird und auch bei Stromausfall die Zeit hält. Mit einer Echtzeituhr können Sie lange Zeitreihen verfolgen, auch wenn Sie Ihren Mikrocontroller neu programmieren oder ihn von USB oder einem Netzstecker trennen.

Die meisten Mikrocontroller, einschließlich des Arduino, verfügen über einen integrierten Zeitnehmer namens millis (). Außerdem sind im Chip Zeitgeber eingebaut, die längere Zeiträume wie Minuten oder Tage nachverfolgen können.

 

Warum sollten Sie also einen separaten RTC-Chip haben?

Nun, der Hauptgrund ist, dass millis () nur die Zeit verfolgt, seit der letzten Stromversorgung des Arduinos. Das heißt, wenn der Strom eingeschaltet wird, wird der Millisekunden-Timer auf 0 zurückgesetzt. Der Arduino weiß nicht, dass es "Dienstag" oder der "8. März" ist. Der Arduino kann lediglich angeben, dass beispielsweise 14.000 Millisekunden vergangen sind, seitdem er das letzte Mal angeschaltet war.

Während diese Art der Zeitmessung für einige Projekte in Ordnung ist, müssen einige Projekte wie Datenlogger, Uhren usw. eine konsistente Zeitmessung haben, die nicht zurückgesetzt wird, wenn der Arduino-Akku ausfällt oder neu programmiert wird und hier kommt die RTC ins Spiel!

Der RTC-Chip ist ein spezieller Chip, der nur die Zeit verfolgt. Es kann Schaltjahre zählen und weiß, wie viele Tage ein Monat hat.

 

Arduino und die RTC DS3231

Sie können das RTC Breakout problemlos an einen beliebigen Mikrocontroller anschließen. Sie müssen nur sicherstellen, dass I2C vorhanden ist, und dann den Code portieren - das ist ziemlich einfach!

In diesem Beispiel wird ein Arduino-Mikrocontrollerboard verwendet.

 

Pinout und Verkabelung:

  • Verbinden Sie Vin mit der Stromversorgung, 3-5V ist in Ordnung. Verwenden Sie die gleiche Spannung, auf der die Mikrocontroller-Logik basiert. Für die meisten Arduinos sind das 5V.
  • Verbinden Sie GND mit der gemeinsamen Strom- / Datenmasse
  • Verbinden Sie den SCL-Pin mit dem I2C-Clock-SCL-Pin Ihres Arduino. Auf einem Arduino Uno ist dieses auch als A5 bekannt, auf einem Mega auch als digital 21 und auf einem Leonardo / Micro digital 3.
  • Verbinden Sie den SDA-Pin mit dem I2C-Data-SDA-Pin Ihres Arduino. Auf einem UNO ist dies auch als A4 bekannt, auf einem Arduino Mega auch als digital 20 und auf einem Leonardo bzw. Micro als digital 2.

Der DS3231 hat eine Standard-I2C-Adresse 0x68. Diese kann nicht geändert werden.

 

Download der RTCLib

Für die RTC-Bibliothek wird ein Fork aus JeeLabs hervorragender RTC-Bibliothek RTClib verwendet.

Um mit dem Lesen von Daten zu beginnen, müssen Sie die RTCLib von Adafruit aus dem Github-Repository herunterladen. Sie können dies tun, indem Sie das Github-Repo besuchen und manuell herunterladen oder direkt die zip-Datei herunterladen.

Benennen Sie den unkomprimierten Ordner in RTCLib um und überprüfen Sie, ob der Ordner RTCLib die Dateien RTCLib.cpp und RTCLib.h enthält

Platzieren Sie den RTCLib-Bibliotheksordner in Ihrem Ordner arduinosketchfolder / libraries /.

Möglicherweise müssen Sie den Bibliotheksunterordner erstellen, wenn es sich um Ihre erste Bibliothek handelt. Starten Sie die Arduino IDE neu.

 

RTC Test

Mit einem Testsketch wird die Uhrzeit einmal pro Sekunde aus der RTC gelesen. Nehmen Sie zunächst die Batterie aus der Halterung, wenn der Arduino nicht mit Strom versorgt oder an USB angeschlossen ist. Warten Sie 3 Sekunden und ersetzen Sie die Batterie. Dies setzt den RTC-Chip zurück.

 

Demo laden

Öffnen Sie Datei-> Beispiele-> RTClib-> DS3231 und laden Sie die Demo auf Ihren Arduino, der mit der RTC verkabelt ist.

 

 

Überprüfen Sie die serielle Konsole auf 9600 Baud. Nach wenigen Sekunden sehen Sie den Bericht, dass der Arduino bemerkt hat, dass die DS3231 RTC zum ersten Mal eingeschaltet wurde, und die Uhrzeit anhand des Arduino-Sketches eingestellt wird.

 

 

Trennen Sie Ihr Arduino und die RTC für einige Sekunden (oder Minuten, Stunden oder Wochen) und schließen Sie es wieder an.

Wenn Sie es das nächste Mal ausführen, wird nicht dieselbe "RTC lost power" -Meldung angezeigt, sondern sie wird sofort angezeigt und informiert Sie über die korrekte Zeit!

 

 

Von jetzt an müssen Sie die Uhrzeit nicht mehr einstellen: Die Batterie hält mindestens 5 Jahre.

 

Die Zeit abfragen

Um die Zeit abfragen zu können, schauen wir uns den Sketch noch einmal an.

 

void loop () {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

 

Es gibt nur eine Möglichkeit, die Zeit mithilfe der RTClib zu ermitteln, nämlich dem Aufruf von now (), einer Funktion, die ein DateTime-Objekt zurückgibt, das das Jahr, den Monat, den Tag, die Stunde, die Minute und die Sekunde beschreibt, als Sie jetzt () aufgerufen haben.

Es gibt einige RTC-Bibliotheken, in denen Sie stattdessen etwas wie RTC.year () und RTC.hour () aufrufen, um das aktuelle Jahr und die aktuelle Stunde abzurufen. Es gibt jedoch ein Problem, wenn Sie direkt vor der nächsten Minute um 3:14:59 nach der Minute fragen, und dann die Sekunde direkt nach der Minute (also um 3:15:00 Uhr). Man sieht dann die Zeit als 3:14:00, was eine Minute Pause dedeutet. Wenn Sie es umgekehrt machen, könnten Sie 3:15:59 Uhr bekommen - also eine Minute in die andere Richtung.

Da dies kein besonders unwahrscheinliches Ereignis ist - insbesondere, wenn Sie die Uhrzeit häufig abfragen - nehmen wir eine Momentaufnahme der RTC auf und können sie dann in day () oder second () unterteilen (wie oben gesehen). Es ist ein bisschen mehr Aufwand, aber es lohnt sich, den Fehler zu vermeiden!

Sie können auch einen "Zeitstempel" aus dem DateTime-Objekt erhalten, indem Sie unixtime aufrufen, das dann die Anzahl von Sekunden (keine Schaltsekunden) seit Mitternacht (1. Januar 1970) zählt.

 

Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

 

Da es an einem Tag 60 * 60 * 24 = 86400 Sekunden gibt, können wir seit diesem Zeitpunkt auch Tage zählen. Dies kann nützlich sein, wenn Sie nachverfolgen möchten, wie viel Zeit seit der letzten Abfrage verstrichen ist. 

Passend dazu

sparkfun-real-time-clock-module-bob-12708-01_600x600.jpgsparkfun-real-time-clock-module-bob-12708-02_600x600.jpg
Sparkfun Sparkfun Real Time Clock Module DS1307 RTC
Sonderpreis5,13 €
Nur noch 3 Mal auf Lager
14558-SparkFun_Real_Time_Clock_Module_-_RV-1805__Qwiic_-01_600x600.jpg14558-SparkFun_Real_Time_Clock_Module_-_RV-1805__Qwiic_-05_600x600.jpg
Sparkfun SparkFun Real Time Clock Module - RV-1805 (Qwiic)
Sonderpreis6,94 €
Auf Lager, 5 Stück

Passend zu diesem Artikel

View all
adafruit-tpl5110-low-power-timer-breakout_600x600.jpgadafruit-tpl5110-low-power-timer-breakout-02_600x600.jpg
Adafruit Adafruit TPL5110 Low Power Timer Breakout
Sonderpreis2,59 €
Auf Lager, 5 Stück
sparkfun-real-time-clock-module-bob-12708-01_600x600.jpgsparkfun-real-time-clock-module-bob-12708-02_600x600.jpg
Sparkfun Sparkfun Real Time Clock Module DS1307 RTC
Sonderpreis5,13 €
Nur noch 3 Mal auf Lager
16281-SparkFun_Real_Time_Clock_Module_-_RV-8803__Qwiic_-01_600x600.jpg16281-SparkFun_Real_Time_Clock_Module_-_RV-8803__Qwiic_-03_600x600.jpg
Sparkfun SparkFun Real Time Clock Module - RV-8803 (Qwiic)
Sonderpreis5,58 €
Nur noch 2 Mal auf Lager
14558-SparkFun_Real_Time_Clock_Module_-_RV-1805__Qwiic_-01_600x600.jpg14558-SparkFun_Real_Time_Clock_Module_-_RV-1805__Qwiic_-05_600x600.jpg
Sparkfun SparkFun Real Time Clock Module - RV-1805 (Qwiic)
Sonderpreis6,94 €
Auf Lager, 5 Stück
15734-SparkFun_Clock_Generator_Breakout_-_5P49V60__Qwiic_-01_600x600.jpg15734-SparkFun_Clock_Generator_Breakout_-_5P49V60__Qwiic_-02_600x600.jpg
Sparkfun SparkFun Clock Generator Breakout - 5P49V60 (Qwiic)
Sonderpreis8,63 €
Nur noch 3 Mal auf Lager