|
34. Lektion: NTP/RTC: Unterschied zwischen den Versionen
Aus Attraktor Wiki
|
|
(41 dazwischenliegende Versionen des gleichen Benutzers werden nicht angezeigt) | Zeile 1: |
Zeile 1: |
− | ===== Unix-Zeit===== | + | == Vorbereitung== |
− | ACHTUNG ESP32 und Pico arbeiten mit unterschiedlichen Epochen: | + | Für diese Lektion muss die Funktion "Synchronisiere die Echtzeituhr des Gerätes" abgeschaltet werden. |
| + | <br> |
| + | Dieses geschieht unter Werkzeuge/Optionen/Interpreter: |
| + | <br> |
| + | [[file:echtzeituhr_aus.png|Echtzeituhr ausschalten]] |
| + | |
| + | == Unix-Zeit== |
| + | Micropython verwendet das Zeitkonzept von UNIX/LINUX. Es zählt die Sekunden, die seit dem Beginn der Epoche vergangen sind. Bei UNIX/LINUX ist das der 1.1.1970. In Micropython wird häufig der 1.1.2000 als Epochenbeginn genommen. Beim Pico entspricht die Epoche der von UNIX/LINUX. |
| + | <br> |
| + | '''ACHTUNG ESP32 und Pico arbeiten mit unterschiedlichen Epochen:''' |
| <pre> | | <pre> |
| MicroPython v1.20.0 on 2023-04-26; Raspberry Pi Pico W with RP2040 | | MicroPython v1.20.0 on 2023-04-26; Raspberry Pi Pico W with RP2040 |
Zeile 16: |
Zeile 25: |
| >>> | | >>> |
| </pre> | | </pre> |
− | ===== NTP/RTC=====
| |
− | Die RTC des ESP32 soll sehr ungenau sein.
| |
| | | |
− | * https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/rtc-und-ntp-in-micropython-mit-esp8266-und-esp32-teil-1
| + | == NTP/RTC== |
− | * https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/rtc-und-ntp-in-micropython-mit-esp8266-und-esp32-teil-2-tiefschlaf?utm_source=90%20Day%20Engaged&utm_medium=email&utm_campaign=220523_Hydroponik%20-%20Pflanzen%20ohne%20Erde_Blog%20%2801H0SBCNDVZF5ZP2WDDDZXW24A%29&utm_content=RTC%20und%20NTP%20in%20MicroPython%20Teil%202&utm_term=Campaign&_kx=t6chfMYPTCmi3Q3FmsDDDGHlL3Kt6ctVyJh9Hkft9JU%3D.QVRJMi
| + | Mit Micropython auf unserem Pico haben wir zwei Zeitsysteme zur Verfügung. Das Eine ist die Netzzeit, die wir uns aus dem Internet herunterladen können. Das Andere ist die interne RealTimeClock (RTC) aus der wir das aktuelle Datum und die aktuelle Uhrzeit beziehen können. |
| | | |
| + | == NTP== |
| + | Da der Pico keine Backup-Batterie an Board hat, so wie der PC, muss die RTC beim Programmstart gestellt werden. Wenn der Pico Kontakt zum Internet hat geht das ganz einfach: |
| <pre> | | <pre> |
− | MicroPython v1.20.0 on 2023-04-26; ESP32S3 module with ESP32S3
| + | # automatisches Stellen der RTC in Thonny wurde abgeschaltet. |
| + | # Thonny und der Pico wurden neu gestartet. |
| | | |
− | Type "help()" for more information.
| + | >>> import time |
| | | |
− | >>> import network | + | >>> import wlantools as wl |
− | >>> import ntptime
| + | connecting to network... |
− | >>> from machine import RTC
| + | network config: ('192.168.5.120', '255.255.255.0', '192.168.5.1', '192.168.5.1') |
| | | |
− | # WLAN einrichten
| + | >>> time.localtime() |
− | | + | (2021, 1, 1, 0, 0, 36, 4, 1) # Hier sind Datum und Uhrzeit falsch. |
− | >>> wlan = network.WLAN(network.STA_IF) | + | |
− | >>> wlan.active(True)
| + | |
− | True
| + | |
− | >>> wlan.connect('SSID', 'PW')
| + | |
− | >>> wlan.isconnected()
| + | |
− | False
| + | |
− | >>> wlan.isconnected()
| + | |
− | True
| + | |
− | >>> wlan.ifconfig()
| + | |
− | ('192.168.5.109', '255.255.255.0', '192.168.5.1', '192.168.5.1')
| + | |
− | | + | |
− | # Die RTC mit NTP einstellen | + | |
| | | |
| + | >>> import ntptime |
| >>> ntptime.settime() | | >>> ntptime.settime() |
| + | >>> time.localtime() |
| + | (2024, 1, 10, 13, 33, 1, 2, 10) # Hier sind Datum und Uhrzeit richtig. |
| + | >>> |
| + | </pre> |
| + | Mit <code>ntptime.settime()</code> wird die RTC mit der Netzzeit sychronisiert. |
| + | <br> |
| + | Das Modul '''ntptime''' bietet noch eine weitere Möglichkeiten: |
| + | Mit der Methode <code>time()</code> bekommen wir die aktuelle Sekundenanzahl, den '''Timestamp'''. |
| + | <pre> |
| + | >>> ntptime.time() |
| + | 1704895875 |
| + | </pre> |
| + | Wenn wir das Ergebnis in einer für uns lesbaren Form darstellen wollen, so geht das so: |
| + | <pre> |
| + | >>> time.localtime(ntptime.time()) |
| + | (2024, 1, 10, 14, 24, 47, 2, 10) |
| + | </pre> |
| + | Das Modul <code>ntptime</code> bietet uns also in erster Line eine einfache Möglichkeit die interne RTC zu stellen. |
| | | |
− | # Die RTC einrichten
| + | === NTP-Server einstellen=== |
| + | Ob so der NTP-Server eingestellt werden kann muss noch getestet werden: |
| + | <pre> |
| + | >>> ntptime.host = 'ntp.rz.tu-harburg.de' |
| + | >>> ntptime.host |
| + | 'ntp.rz.tu-harburg.de' |
| + | >>> |
| + | </pre> |
| | | |
− | >>> rtc = RTC() | + | == RTC== |
| + | Die Klasse <code>machine.RTC</code> bietet uns nur eine Methode: |
| + | <pre> |
| + | >>> dir(machine.RTC) |
| + | ['__class__', '__name__', '__bases__', '__dict__', 'datetime'] |
| + | </pre> |
| + | Die Methode <code>datetime()</code>gibt die aktuelle Zeit/Datum aus, oder stellt die RTC wenn die Daten übergeben werden. |
| + | <pre> |
| + | >>> import machine |
| + | |
| + | >>> rtc = machine.RTC() |
| | | |
| >>> rtc.datetime() | | >>> rtc.datetime() |
− | (2023, 9, 5, 1, 15, 39, 56, 427762) | + | (2024, 2, 4, 6, 17, 10, 3, 0) |
− | >>> rtc.datetime() | + | </pre> |
− | (2023, 9, 5, 1, 16, 14, 5, 837765) | + | Die Daten werden in einem Tuple übergeben: |
− | >>> rtc.datetime() | + | <br> |
− | (2023, 9, 5, 1, 16, 21, 42, 597764)
| + | '''(Jahr, Monat, Tag, Wochentag, Stunden, Minuten, Sekunden, subseconds)''' |
− | >>> dir(ntptime) | + | <br> |
− | ['__class__', '__name__', '__dict__', '__file__', 'socket', 'struct', 'time', 'timeout', 'utime', '__version__', 'host', 'settime']
| + | Wochentag ist eine Zahl von 0 bis 6. Die Woche beginnt am Montag.<br> |
− | >>> ntptime.time()
| + | Subseconds ist Hardwareabhängig. |
− | 747246194
| + | |
− | >>> rtc.datetime()
| + | == Den Wochentag als Namen ausgeben== |
− | (2023, 9, 5, 1, 16, 23, 49, 897771)
| + | Mit einer Liste lassen sich die Namen der Wochentage ausgeben: |
− | >>> ntptime.time() | + | <br> |
− | 747246234
| + | '''Übung''' |
− | >>> ntptime.utime | + | |
− | <module 'utime'>
| + | == Das Module '''time'''== |
− | >>> rtc.datetime()
| + | Das Modul time bietet 3 Methoden zum Umgang mit Datum und Uhrzeit: |
− | (2023, 9, 5, 1, 16, 24, 29, 867765) | + | === gmtime()/localtime()=== |
− | >>> ntptime.time() | + | Geben ein Tupel mit den Datums- und Zeitdaten zurück. Das Tuple entspricht nicht ganz dem von <code>rtc.datetime()</code>. |
− | 747246276
| + | <br> |
| + | '''(Jahr, Monat, Tag, Stunden, Minuten, Sekunden, Wochentag, subseconds)''' |
| + | <pre> |
| >>> import time | | >>> import time |
− | >>> dir(time)
| + | |
− | ['__class__', '__name__', '__dict__', 'gmtime', 'localtime', 'mktime', 'sleep', 'sleep_ms', 'sleep_us', 'ticks_add', 'ticks_cpu', 'ticks_diff', 'ticks_ms', 'ticks_us', 'time', 'time_ns']
| + | |
| >>> time.gmtime() | | >>> time.gmtime() |
− | (2023, 9, 5, 16, 25, 39, 1, 248) | + | (2021, 1, 1, 0, 0, 16, 4, 1) |
| + | |
| >>> time.localtime() | | >>> time.localtime() |
− | (2023, 9, 5, 16, 25, 57, 1, 248) | + | (2021, 1, 1, 0, 0, 41, 4, 1) |
− | >>> time.mktime(rtc.datetime())
| + | |
− | 747191787
| + | |
− | >>> ntptime.time()
| + | |
− | 747246461
| + | |
− | >>> time.mktime(rtc.datetime())
| + | |
− | 747191787
| + | |
− | >>> ntptime.time()
| + | |
− | 747246472
| + | |
− | >>> time.mktime(rtc.datetime())
| + | |
− | 747191788
| + | |
− | >>> ntptime.time()
| + | |
− | 747246489
| + | |
− | >>>
| + | |
| </pre> | | </pre> |
| + | |
| + | === mktime=== |
| + | Die Methode <code>mktime()</code> ist das Gegenteil zu <code>gmtime()/localtime()</code>. Sie erzeugt aus einem Tupel mit den Datums- und Zeitangaben einen Timestamp: |
| + | <pre> |
| + | >>> import time |
| + | |
| + | >>> time.mktime(time.localtime()) |
| + | 1609459860 |
| + | </pre> |
| + | |
| + | == Beispiele== |
| + | Hier folgen 2 Beispiele für die Anwendung der Datums- und Zeitfunktionen in Micropython. |
| + | <br> |
| + | Das erste Beispiel ist eine Funktion die das Datum als menschemlesbaren String erzeugt: |
| + | <pre> |
| + | def get_date(): |
| + | import time |
| + | date_time = time.localtime() |
| + | return '-'.join((str(date_time[2]), str(date_time[1]), str(date_time[0]))) |
| + | </pre> |
| + | Das zweite Beispiel ist eine Funktion die die Uhrzeit als menschemlesbaren String erzeugt: |
| + | <pre> |
| + | def get_time(): |
| + | import time |
| + | date_time = time.localtime() |
| + | return ':'.join((str(date_time[3]), str(date_time[4]), str(date_time[5]))) |
| + | </pre> |
| + | Wenn man diese beiden Funktionen in das Modul <code>wlantools.py</code> integriert hat man sie immer zur Hand. |
| + | <br> |
| + | So kann man die Werte in einem Rutsch in die entsprechenden Variablen laden: |
| + | <pre> |
| + | >>> (year, month, mday, name_of_weekday, hour, minute, second, milisecond) = rtc.datetime() |
| + | >>> year |
| + | 2024 |
| + | </pre> |
| + | |
| + | == Links== |
| + | Hier ein paar Links zum Thema: |
| + | |
| + | * https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/rtc-und-ntp-in-micropython-mit-esp8266-und-esp32-teil-1 |
| + | * https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/rtc-und-ntp-in-micropython-mit-esp8266-und-esp32-teil-2-tiefschlaf?utm_source=90%20Day%20Engaged&utm_medium=email&utm_campaign=220523_Hydroponik%20-%20Pflanzen%20ohne%20Erde_Blog%20%2801H0SBCNDVZF5ZP2WDDDZXW24A%29&utm_content=RTC%20und%20NTP%20in%20MicroPython%20Teil%202&utm_term=Campaign&_kx=t6chfMYPTCmi3Q3FmsDDDGHlL3Kt6ctVyJh9Hkft9JU%3D.QVRJMi |
| + | |
| + | ==Navigation== |
| + | [[Micropython_Kurs_2023_-_Teil_2|Zurück zur "Micropython Kurs 2023 Teil 2" Startseite]]<br> |
| + | [[Micropython Kurs 2023|Zurück zur "Micropython Kurs 2023" Startseite]]<br> |
| + | [[Programmieren|Zurück zur Programmieren Startseite]]<br> |
| + | [[Attraktor_Wiki|Zurück zur Wiki Startseite]]<br> |
Aktuelle Version vom 5. Februar 2024, 23:00 Uhr
Vorbereitung
Für diese Lektion muss die Funktion "Synchronisiere die Echtzeituhr des Gerätes" abgeschaltet werden.
Dieses geschieht unter Werkzeuge/Optionen/Interpreter:
Unix-Zeit
Micropython verwendet das Zeitkonzept von UNIX/LINUX. Es zählt die Sekunden, die seit dem Beginn der Epoche vergangen sind. Bei UNIX/LINUX ist das der 1.1.1970. In Micropython wird häufig der 1.1.2000 als Epochenbeginn genommen. Beim Pico entspricht die Epoche der von UNIX/LINUX.
ACHTUNG ESP32 und Pico arbeiten mit unterschiedlichen Epochen:
MicroPython v1.20.0 on 2023-04-26; Raspberry Pi Pico W with RP2040
>>> import time
>>> time.gmtime(0)
(1970, 1, 1, 0, 0, 0, 3, 1)
>>>
MicroPython v1.20.0 on 2023-04-26; ESP32 module with ESP32
>>> import time
>>> time.gmtime(0)
(2000, 1, 1, 0, 0, 0, 5, 1)
>>>
NTP/RTC
Mit Micropython auf unserem Pico haben wir zwei Zeitsysteme zur Verfügung. Das Eine ist die Netzzeit, die wir uns aus dem Internet herunterladen können. Das Andere ist die interne RealTimeClock (RTC) aus der wir das aktuelle Datum und die aktuelle Uhrzeit beziehen können.
NTP
Da der Pico keine Backup-Batterie an Board hat, so wie der PC, muss die RTC beim Programmstart gestellt werden. Wenn der Pico Kontakt zum Internet hat geht das ganz einfach:
# automatisches Stellen der RTC in Thonny wurde abgeschaltet.
# Thonny und der Pico wurden neu gestartet.
>>> import time
>>> import wlantools as wl
connecting to network...
network config: ('192.168.5.120', '255.255.255.0', '192.168.5.1', '192.168.5.1')
>>> time.localtime()
(2021, 1, 1, 0, 0, 36, 4, 1) # Hier sind Datum und Uhrzeit falsch.
>>> import ntptime
>>> ntptime.settime()
>>> time.localtime()
(2024, 1, 10, 13, 33, 1, 2, 10) # Hier sind Datum und Uhrzeit richtig.
>>>
Mit ntptime.settime() wird die RTC mit der Netzzeit sychronisiert.
Das Modul ntptime bietet noch eine weitere Möglichkeiten:
Mit der Methode time() bekommen wir die aktuelle Sekundenanzahl, den Timestamp.
>>> ntptime.time()
1704895875
Wenn wir das Ergebnis in einer für uns lesbaren Form darstellen wollen, so geht das so:
>>> time.localtime(ntptime.time())
(2024, 1, 10, 14, 24, 47, 2, 10)
Das Modul ntptime bietet uns also in erster Line eine einfache Möglichkeit die interne RTC zu stellen.
NTP-Server einstellen
Ob so der NTP-Server eingestellt werden kann muss noch getestet werden:
>>> ntptime.host = 'ntp.rz.tu-harburg.de'
>>> ntptime.host
'ntp.rz.tu-harburg.de'
>>>
RTC
Die Klasse machine.RTC bietet uns nur eine Methode:
>>> dir(machine.RTC)
['__class__', '__name__', '__bases__', '__dict__', 'datetime']
Die Methode datetime() gibt die aktuelle Zeit/Datum aus, oder stellt die RTC wenn die Daten übergeben werden.
>>> import machine
>>> rtc = machine.RTC()
>>> rtc.datetime()
(2024, 2, 4, 6, 17, 10, 3, 0)
Die Daten werden in einem Tuple übergeben:
(Jahr, Monat, Tag, Wochentag, Stunden, Minuten, Sekunden, subseconds)
Wochentag ist eine Zahl von 0 bis 6. Die Woche beginnt am Montag.
Subseconds ist Hardwareabhängig.
Den Wochentag als Namen ausgeben
Mit einer Liste lassen sich die Namen der Wochentage ausgeben:
Übung
Das Module time
Das Modul time bietet 3 Methoden zum Umgang mit Datum und Uhrzeit:
gmtime()/localtime()
Geben ein Tupel mit den Datums- und Zeitdaten zurück. Das Tuple entspricht nicht ganz dem von rtc.datetime() .
(Jahr, Monat, Tag, Stunden, Minuten, Sekunden, Wochentag, subseconds)
>>> import time
>>> time.gmtime()
(2021, 1, 1, 0, 0, 16, 4, 1)
>>> time.localtime()
(2021, 1, 1, 0, 0, 41, 4, 1)
mktime
Die Methode mktime() ist das Gegenteil zu gmtime()/localtime() . Sie erzeugt aus einem Tupel mit den Datums- und Zeitangaben einen Timestamp:
>>> import time
>>> time.mktime(time.localtime())
1609459860
Beispiele
Hier folgen 2 Beispiele für die Anwendung der Datums- und Zeitfunktionen in Micropython.
Das erste Beispiel ist eine Funktion die das Datum als menschemlesbaren String erzeugt:
def get_date():
import time
date_time = time.localtime()
return '-'.join((str(date_time[2]), str(date_time[1]), str(date_time[0])))
Das zweite Beispiel ist eine Funktion die die Uhrzeit als menschemlesbaren String erzeugt:
def get_time():
import time
date_time = time.localtime()
return ':'.join((str(date_time[3]), str(date_time[4]), str(date_time[5])))
Wenn man diese beiden Funktionen in das Modul wlantools.py integriert hat man sie immer zur Hand.
So kann man die Werte in einem Rutsch in die entsprechenden Variablen laden:
>>> (year, month, mday, name_of_weekday, hour, minute, second, milisecond) = rtc.datetime()
>>> year
2024
Links
Hier ein paar Links zum Thema:
Navigation
Zurück zur "Micropython Kurs 2023 Teil 2" Startseite
Zurück zur "Micropython Kurs 2023" Startseite
Zurück zur Programmieren Startseite
Zurück zur Wiki Startseite
|