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.
- Raspberry Pi Pico: Grundlagen zur Echtzeituhr (Real-time Clock, RTC)
- Raspberry Pi Pico: Externe Echtzeituhr (RTC) mit DS3231
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
- Raspberry Pi Pico W als WLAN-Client
- Raspberry Pi Pico W als WLAN-Client mit fester IPv4-Adresse
- Raspberry Pi Pico W: Hostname ändern
- Raspberry Pi Pico W: Internet-Verbindung prüfen
Weitere verwandte Themen:
- Raspberry Pi Pico: Externe Echtzeituhr (RTC) mit DS3231
- Raspberry Pi Pico: Grundlagen zur Echtzeituhr (Real-time Clock, RTC)
- NTP - Network Time Protocol
- Raspberry Pi Pico W: Grundlagen zum WLAN
- Raspberry Pi Pico W: Troubleshooting WLAN
Teilen:
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.
Online-Workshop: 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.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)