Ein RTC-Modul DS3231 am Raspberry Pi betreiben

Du bist hier:

1. Motivation

Real Time Clock

Uhrzeit am Raspberry Pi

Wenn es um die genaue Uhrzeit geht, ist ein Raspberry Pi auf Hilfe angewiesen. Wenn der Minicomputer mit Internet verbunden ist, wird die Uhrzeit mit einem NTP-Server synchronisiert. Ist eine Internetverbindung nicht möglich, bekommt man mit der Uhrzeit ein Problem. Dies ist besonders dann problematisch, wenn man auf einen Zeitstempel angewiesen ist. Für solche Aufgaben gibt Echtzeituhren (real time clock) als Module. In diesem Beitrag soll es um das RTC-Modul vom Typ DS3231 von Maxim (Datenblatt) gehen.

Nach vielen erfolglosen Versuchen und Studium vieler Anleitungen wurde ich unter http://www.forum-raspberrypi.de/ fündig. Insbesondere sind die Kommentare dabei ganz hilfreich. Allerdings musste ich für meine Lösung eine Kombination der Lösungen anwenden.

2. Kurzfassung

1. In der Datei /boot/config.txt am Ende folgende Zeile hinzufügen:

dtoverlay=i2c-rtc,ds3231

2. Den Service fake-hwclock deaktivieren

sudo systemctl stop fake-hwclock.service
sudo systemctl disable fake-hwclock.service

3. Neue Regel erstellen: /etc/udev/rules.d/rtc-start.rules

ACTION=="add", SUBSYSTEM=="rtc", ATTRS{hctosys}=="0", RUN+="/sbin/hwclock -s --utc"

3. Ausführliche Beschreibung

3.1. Das Modul beim Bootvorgang aktivieren

In Raspbian Stretch ist die Aktivierung des RTC-Moduls weitestgehend automatisiert. Es reicht einfach in der /boot/config.txt eine Zeile hinzuzufügen.

$ nano vim /boot/config.txt

Am Ende wird die Zeile

dtoverlay=i2c-rtc,ds3231

hinzugefügt. Wichtig hierbei ist, dass vor ds3231 kein Leerzeichen eingetippt wird, sonst wird das Modul nicht richtig geladen. Nach einem Neustart werden die Treiber für das RTC-Modul geladen. Das kann man mit folgendem Befehl testen:

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

An der Stelle 60/8 stehen zwei U. Das bedeutet, dass der Treiber für DS3231 geladen wurde und dieser jetzt einsatzbereit ist.

3.2. fake-hwclock deaktivieren

Wie bereits erwähnt, verfügt Raspberry Pi über keine interne Uhr. Dies hat zur Folge, dass beim Start des Raspberry Pi irgendeine Uhrzeit angenommen werden muss. Entweder ist es die, bei der für den Raspberry Pi die Zeitrechnung beginn, also 1.1.1970 oder das System merkt sich wenigstens die Uhrzeit, die es beim Letzten Herunterfahren hatte. Dafür ist fake-hwclock da. Es sorgt auch dafür, dass bei vorhandener Internetverbindung die Uhrzeit automatisch aktualisiert wird. Da wir jetzt eine echte hwclock haben, darf der service fake-hwclock nicht mehr laufen, sonst gibt es Probleme.
Dazu deaktivieren wir den Service fake-hwclock.

$ sudo systemctl stop fake-hwclock.service

Der Service ist jetzt zwar ausgeschaltet, muss aber für den nächsten Start vollständig deaktiviert werden (beim nächsten Systemstart).

$ sudo systemctl disable fake-hwclock.service

Prinzipiell funktioniert die Echtzeituhr bereits. Solange der Raspberry Pi im Netz ist, wird die Softwareuhr über das NTP-Protokoll aktualisiert. Um es zu testen, kann die Hardwareclock bewusst verstellt werden.

$ sudo hwclock --set --date="18 Nov 2016 12:00"

Auslesen der Uhrzeit aus der Echtzeituhr und der Softwareuhr ergeben dann unterschiedliche Daten:

$ sudo hwclock -r; date
Fr 18 Nov 2016 09:00:05 CET  -0.706809 seconds
Fr 18. Nov 20:56:28 CET 2016

Nach einer Weile kann man die Uhrzeit noch einmal prüfen:

$ sudo hwclock -r; date
Fr 18 Nov 2016 21:14:57 CET  -0.583170 seconds
Fr 18. Nov 21:14:57 CET 2016

Die Echtzeituhr wurde mit der Internetzeit synchronisiert. Jetzt soll die Echtzeituhr ohne Internet getestet werden.

3.3. Letzte Anpassung

Um das ganze auch mal richtig zu testen, wird das Netzwerkkabel entfernt und WLAN deaktiviert (Wenn man sich über WLAN angemeldet hat). Nach einem Neustart stellt man fest, dass etwas nicht stimmt. Wir schreiten das Jahr 1970! Wieso ist auf einmal eine falsche Zeit eingetragen? Der service fake-hwclock, der sich die Zeit merkte wann das System heruntergefahren wurde, ist jetzt deaktiviert. Eine Synchronisation mit Internet ist aufgrund getrennter Verbindung nicht möglich. Und was ist mit RTC? Wie es aussieht, wurde die Uhrzeit nicht übernommen. An dieser Stelle müssen wir nochmal aktiv werden. Wir müssen dem Raspberry Pi irgendwie beibringen, dass er beim Start die Uhrzeit aus dem RTC-Modul auslesen soll.
Es muss noch eine Regel erstellt werden, die immer, wenn RTC aufgerufen wird (beim laden der Treiber), die Uhrzeit synchronisiert wird.

$ sudo nano /etc/udev/rules.d/60-rtc_synch.rules

Der Inhalt der Datei soll wie folgt aussehen:

ACTION=="add", SUBSYSTEM=="rtc", ATTRS{hctosys}=="0", RUN+="/sbin/hwclock -s --utc"

Datei speichern und beenden. Das wars. Für einen Test kann das System für einige Minuten heruntergefahren werden. Wenn das System danach hochgefahren wird, sollte die richtige Uhrzeit angezeigt werden.

War dieser Artikel hilfreich?
Dislike 0