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 die Uhrzeit nicht dauerhaft mitführen kann. Das heißt, die interne RTC beginnt bei jedem Neustart des Picos wieder von vorne. Trotzdem kann man zeitabhängige Funktionen mit der RTC nutzen. Wenn aber die Funktionen von einem konkreten Datum oder der Uhrzeit abhängig ist, dann braucht ein externes RTC-Modul mit einer Batterie oder muss die Uhrzeit bei jedem Start manuell einstellen.

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 sys
import time
import usocket as socket
import ustruct as struct

# WLAN-Konfiguration
wlanSSID = 'name'
wlanPW = 'passwort'
network.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.

Übersicht: Netzwerk-Konfiguration

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Elektronik-Set Pico WLAN Edition

Elektronik-Set Pico WLAN Edition

Hardware-nahes Programmieren mit dem Mikrocontroller Raspberry Pi Pico W und MicroPython.

  • Raspberry Pi Pico W mit gelöteten Stiftleisten
  • Spezielles Steckbrett mit GPIO-Beschriftung
  • Einführung ins Hardware-nahe Programmieren
  • Schwerpunkte: WLAN, MQTT und Internet
  • Deutschsprachige Anleitung als PDF-Datei zum Download

In unseren Online-Workshops bieten wir intensiven Erfahrungsaustausch in kleinen Gruppen und Unterstützung bei individuellen Problemen.

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren