datetime per WLAN

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 183
Registriert: Do 21. Okt 2010, 18:31

datetime per WLAN

Beitrag von Heinrichs » 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.

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)
Falls keine Verbindung zu einem Zeit-Server hergestellt werden kann, bietet das Programm eine manuelle Eingabe der benötigten Werte über die Tastatur an.

Antworten