datetime per WLAN
Verfasst: Fr 27. Jan 2023, 15:47
Solange der ESP32 über eine Entwicklungsumgebung wie Thonny verbunden ist, bezieht er seine Systemzeit (inkl. Datum) vom Betriebssystem Ihres Rechners. Mit einer Instanz rtc = RTC() der RTC-Klasse erhält man dann das datetime-Tupel und kann es sich über die Methode datetime() anzeigen lassen:
print(rtc.datetime())
Wenn man ein Programm mit einer aktuellen Systemzeit "stand alone" (d. h. nicht über eine Programmierumgebung wie Thonny) starten, dann beginnt die Uhr bei 00:00:00 Uhr, Samstag 1.1.2000, zu laufen. Es besteht allerdings, die Möglichkeit, ein korrektes datetime-Tupel über WLAN von einem entsprechenden Zeit-Server zu beziehen. Dies geschieht mit Hilfe der Methode settime der Klasse ntptime (mehr dazu hier).
Dies leistet das folgende Programm; die Funktionsweise wird durch Kommentare erläutert. Bei den Angaben für die SSID und das Passwort müssen Sie natürlich die Daten des von Ihnen benutzten WLAN einsetzen.
Falls keine Verbindung zu einem Zeit-Server hergestellt werden kann, bietet das Programm eine manuelle Eingabe der benötigten Werte über die Tastatur an.
print(rtc.datetime())
Wenn man ein Programm mit einer aktuellen Systemzeit "stand alone" (d. h. nicht über eine Programmierumgebung wie Thonny) starten, dann beginnt die Uhr bei 00:00:00 Uhr, Samstag 1.1.2000, zu laufen. Es besteht allerdings, die Möglichkeit, ein korrektes datetime-Tupel über WLAN von einem entsprechenden Zeit-Server zu beziehen. Dies geschieht mit Hilfe der Methode settime der Klasse ntptime (mehr dazu hier).
Dies leistet das folgende Programm; die Funktionsweise wird durch Kommentare erläutert. Bei den Angaben für die SSID und das Passwort müssen Sie natürlich die Daten des von Ihnen benutzten WLAN einsetzen.
Code: Alles auswählen
# local_time_wlan_3.py
# nach: https://www.engineersgarage.com/micropython-esp8266-esp32-rtc-utc-local-time/
# Format des datetime-Tupels ist (Jahr, Monat, Tag, Wochentag(!), Stunde, Minute, Sekunde, "Subseconds")
# Dabei ergibt sich der Wochentag schon durch die restlichen Angaben.
print('MEZ durch Zeitserver bestimmen...')
print('---------------------------------')
from machine import RTC
import network
import ntptime
from time import time, sleep
def eingabe():
jahr = int(input('Jahr [4 Stellen]: '))
monat = int(input('Monat [1-12]: '))
tag = int(input('Tag [1-31]: '))
stunde = int(input('Stunde [0-23]: '))
minute = int(input('Minute [0-59]: '))
sekunde = int(input('Sekunde [0-59]: '))
datetime_list = [jahr, monat, tag, 0, stunde, minute, sekunde, 0]
datetime_tuple = tuple(datetime_list) # Liste -> Tupel
return datetime_tuple
############## hier ihre SSID und ihr Passwort einfügen ################
ssid = 'ABCDEFG'
password = 'abcdefg'
#################################################################
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
print('Verbindung zum Zeitserver aufbauen ', end = '')
time0 = time()
while (station.isconnected() == False) and (time() - time0 < 5): # 5 s auf Verbindung warten
sleep(0.5)
print('.', end = '')
print()
if station.isconnected():
print('WiFi connected')
rtc = RTC() # RTC-Objekt zum Lesen und Schreiben der Systemzeit instanziieren
ntptime.settime() # setzt die Systemzeit mittels ntptime
# Jetzt GMZ in MEZ umwandeln...
datetime_list = list(rtc.datetime()) # Tupel -> Liste
datetime_list[4] = datetime_list[4] + 1 # Stundenwert um 1 erhöhen; wenn 24 addiert wird, dann Wechsel zum nächsten Tag!
datetime_tuple = tuple(datetime_list) # Liste -> Tupel
rtc.datetime(datetime_tuple) # Systemzeit neu festlegen; datetime liefert jetzt MEZ = GMT + 1 )
print('MEZ:', rtc.datetime()[4], ':', rtc.datetime()[5], ':', rtc.datetime()[6])
station.disconnect()
else:
print('Verbindung zum Zeitserver fehlgeschlagen')
print('Geben Sie hier Datum und Uhrzeit ein (MEZ): ')
datetime_tuple = eingabe()
rtc = RTC() # RTC-Objekt zum Lesen und Schreiben der Systemzeit instanziieren
rtc.datetime(datetime_tuple) # Systemzeit neu festlegen; datetime liefert jetzt MEZ = GMT + 1 )
print('MEZ:', rtc.datetime()[4], ':', rtc.datetime()[5], ':', rtc.datetime()[6])
print('ENDE')
station.active(False)