Raspberry Pi Pico W: RTC-Zeit mit NTP-Zeitserver einstellen

Der Raspberry Pi Pico hat eine Echtzeituhr (Real-time Clock, RTC), die aber mangels eigener Stromversorgung nicht die Uhrzeit mitführen kann. Das heißt, die interne RTC beginnt bei jedem Neustart wieder von vorne. Trotzdem kann man zeitabhängige Funktionen nutzen. Wenn aber die Funktionen von einem konkreten Datum oder der Uhrzeit abhängig ist, dann funktioniert das natürlich nicht. Man kann dann mit externen RTC-Modulen, wie einem DS3231 arbeiten, die aber zumindest einmal manuell eingestellt werden müssen.

Hinweis: Wenn Du den Thonny-Editor zum Programmieren verwendest, dann stellt dieser automatisch die Uhrzeit der Echtzeituhr auf dem verbundenen Pico ein.

Eine Alternative kann hier der Raspberry Pi Pico W sein, der dank WLAN auf das Internet zugreifen kann, sofern ein WLAN mit Internet-Zugang verfügbar ist. Im Internet gibt es Zeit-Server, von denen man die aktuelle Uhrzeit und das Datum abfragen kann. Hierfür gibt es mit NTP (Network Time Protocol) sogar ein eigenes Kommunikationsprotokoll.

Im folgenden Programmcode geht es darum, eine Verbindung zum WLAN herzustellen und anschließend Datum und Uhrzeit von einem Zeitserver per NTP abzurufen und die interne RTC des Raspberry Pi Pico W einzustellen.

Programmcode und Konfiguration

Bevor der Programmcode gestartet wird, sollte er an zwei Stellen konfiguriert werden:

  • WLAN: Damit der Verbindungsaufbau zu Deinem WLAN funktioniert, musst Du den WLAN-Name und das WLAN-Passwort korrekt im Programmcode eintragen.
  • Winterzeit/Sommerzeit: Bitte stelle noch ein, ob momentan Winterzeit oder Sommerzeit ist (GMT_OFFSET). Die Erkennung ist nicht automatisch möglich bzw. vorgesehen.

Wenn der Programmcode gestartet wird, dann wird zuerst die Verbindung zum WLAN hergestellt. Dabei blinkt die Onboard-LED auf dem Pico. Leuchtet die LED dauerhaft, wurde die Verbindung erfolgreich hergestellt. Allerdings leuchtet die LED auch dann, wenn irgendwann die WLAN-Verbindung abbrechen sollte.

Danach wird die Zeit des internen RTCs gesetzt. Dazu wird vorher die aktuelle Zeit von einem NTP-Zeitserver abgerufen.

# Bibliotheken laden
import machine
import network
import rp2
import sys
import utime as time
import usocket as socket
import ustruct as struct

# WLAN-Konfiguration
wlanSSID = 'name'
wlanPW = 'passwort'
rp2.country('DE')

# Winterzeit / Sommerzeit
#GMT_OFFSET = 3600 * 1 # 3600 = 1 h (Winterzeit)
GMT_OFFSET = 3600 * 2 # 3600 = 1 h (Sommerzeit)

# Status-LED
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)

# NTP-Host
NTP_HOST = 'pool.ntp.org'

# Funktion: WLAN-Verbindung
def wlanConnect():
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print('WLAN-Verbindung herstellen')
        wlan.active(True)
        wlan.connect(wlanSSID, wlanPW)
        for i in range(10):
            if wlan.status() < 0 or wlan.status() >= 3:
                break
            led_onboard.toggle()
            print('.')
            time.sleep(1)
    if wlan.isconnected():
        print('WLAN-Verbindung hergestellt / WLAN-Status:', wlan.status())
        led_onboard.on()
    else:
        print('Keine WLAN-Verbindung')
        led_onboard.off()
        print('WLAN-Status:', wlan.status())

# Funktion: Zeit per NTP holen
def getTimeNTP():
    NTP_DELTA = 2208988800
    NTP_QUERY = bytearray(48)
    NTP_QUERY[0] = 0x1B
    addr = socket.getaddrinfo(NTP_HOST, 123)[0][-1]
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.settimeout(1)
        res = s.sendto(NTP_QUERY, addr)
        msg = s.recv(48)
    finally:
        s.close()
    ntp_time = struct.unpack("!I", msg[40:44])[0]
    return time.gmtime(ntp_time - NTP_DELTA + GMT_OFFSET)

# Funktion: RTC-Zeit setzen
def setTimeRTC():
    # NTP-Zeit holen
    tm = getTimeNTP()
    machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0))

# WLAN-Verbindung herstellen
wlanConnect()

# Zeit setzen
setTimeRTC()

# Aktuelles Datum ausgeben
print()
print(machine.RTC().datetime())

Die Ausgabe ist ein Tuple mit der aktuellen Zeit im Formate Jahr, Monat, Tag, Wochentag, Stunden, Minuten und Sekunden.

Gut zu wissen!

  • Zeitumstellung: Der Programmcode kann nicht erkennen, wo der Raspberry Pi Pico W betrieben wird und welche landesspezifischen Parameter bezüglich Datum und Zeitzeit zu berücksichtigen sind. Das betrifft die Zeitzone und die Zeitumstellung. In einem Betriebssystem müssen bei der Ersteinrichtung diese Angaben durch den Benutzer definiert werden. Mit den entsprechenden Parametern wird eine globale Zeit, zum Beispiel aus dem Netzwerk, korrigiert. Dieser Programmcode kann diese Parameter berücksichtigen, wenn man das manuell einträgt und bei Bedarf ändert (GMT_OFFSET).
  • Zeitermittlung: Die Zeitermittlung erfolgt in der Regel anhand der Anzahl der Sekunden, die ab einem bestimmten Zeitpunkt vergangen sind. Die NTP-Zeitrechnung beginnt ab dem 1.1.1900, bei Unix/Linux ist es der 1.1.1970 und bei MicroPython ist es der 1.1.2000. Was ist hierbei zu beachten? Wenn die NTP-Zeit abgeholt wird und in MicroPython in ein Datum umgewandelt werden soll, dann geht das nicht mit der NTP-Zeit, weil MicroPython von einem anderen Start ausgeht. Deshalb muss die Anzahl der Sekunden zwischen dem 1.1.1900 und dem 1.1.2000 (NTP_DELTA) von der abgerufenen NTP-Zeit abgezogen werden. Nur durch diese Korrektur ist es möglich, mit dem Wert in MicroPython zu arbeiten. Der Programmcode berücksichtigt das automatisch.

Weitere verwandte Themen:

Teilen:

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das "Elektronik-Set Pico Edition" ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Online-Workshop Mehr Informationen Elektronik-Set jetzt bestellen

Programmieren mit dem Raspberry Pi Pico
Online-Workshop

Programmieren mit dem Raspberry Pi Pico

Online-Workshop mit einer Einführung ins Physical Computing mit Leuchtdioden, Taster und Temperatursensor.

  • Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython ohne Vorkenntnisse
  • Optimaler Einstieg, um eigene Ideen zu verwirklichen und Steuerungen zu programmieren
  • Inklusive Elektronik-Set mit einem Raspberry Pi Pico, Zubehör und elektronischen Bauteilen

Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)

Zum PicoTalk Mehr Informationen Am Online-Workshop teilnehmen

Elektronik-Set Pico Edition
Elektronik-Set Pico Edition

Hardware-nahes Programmieren mit dem Raspberry Pi Pico

Das "Elektronik-Set Pico Edition" ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Online-Workshop Mehr Informationen Elektronik-Set jetzt bestellen