TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
rtc

16. ECHTZEIT-CLOCK

 

 

DU LERNST HIER...

 

wie du beim Starten eines Programms das aktuelle Datum und die Uhrzeit erhalten kannst. Bei vielen Echtzeitanwendungen ist es wichtig, dass jedem Messwert ein Zeitstempel (timestamp) zugeordnet wird, damit man nachvollziehen kann, zu welchem Zeitpunkt die Messung erfolgt ist.

 

 

MUSTERBEISPIELE

 


RTC-MODULE

Der ESP32-Mikrocontroller kann eine einmal gesetzte Zeit weiterführen, solange er nicht abgeschaltet wird. Um beim Einschalten die aktuelle Datumzeit zu erhalten, kann eine externe Realtime Clock (RTC) mit einer Bufferbatterie verwendet werden. Im Folgenden verwendest du ein Breakout-Board mit dem bekannten RTC-Chip DS3231, das ein I2C-Interface hat (Bezugsquelle: eBay). Für den Anschluss an die den I2C-Hub der Oxocard lötest du entweder ein Grove-Kabel oder einen Grove-Stecker ein.

   

Der RTC-Chip speichert die aktuelle Datumzeit (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Wochentag). Wie üblich kapselt ein Treiber ds3231 die I2C-Kommunikation. Mit dem Aufruf von setDateTime(yy, mm, dd, h, m, s, w) setzt du die aktuelle Datumzeit. Solange die Stromversorgung durch die Knopfzelle erhalten bleibt, wird die Datumzeit automatisch vorgerückt und du kannst sie mit getDateTime() abrufen. In diesem Fall benötigst du also die interne RTC des ESP nicht.

In deinem Programm kannst du zuerst die auskommentierte Zeile verwenden, um die aktuelle Datumzeit zu setzen. Nachher musst du die Zeile wieder auskommentieren, damit das Programm bei jedem Start die aktuelle Zeit auf dem LED-Display ausschreibt.

Programm:

from oxocard import *
from ds3231 import DS3231
from time import sleep

def show():
    display(h)
    sleep(2)
    display(m)
    
    sleep(2)
    display(s)
    sleep(2)
    display("::")
    sleep(5)

rtc = DS3231()
# year, month, day, hours, minutes, seconds,dayOfWeek = 0 for monday
#rtc.setDateTime(2019, 1, 22, 8, 10, 0, 3)       
    
while True:
    yy, mm, dd, h, m, s, w = rtc.getDateTime()
    print("%04d-%02d-%02d - %d:%02d:%02d" %(yy, mm, dd, h, m, s))
    show()
► In Zwischenablage kopieren


NTP-ZEITSERVER

Internet-Zeitserver bieten Zeitdienste für weltweit mehrere hundert Millionen Systeme an. Sie benützen ein standardisiertes Datenformat, das Netwerk Time Protocol (NTP). Ein Client macht einen NTP-Request an einen bestimmten Host und erhält die Datumzeit zurück, die aus Jahr, Monat, Tag, Stunde, Minute, Sekunde, Wochentag und Jahrestag (Anzahl Tage seit Jahresbeginn) besteht. Im nachfolgenden Programm synchronisierst du mit dieser Information die im ESP eingebaute RTC.

Um auf das Internet zu gelangen, loggt sich die Oxocard auf einem Access Point ein,  holt sich die Zeitinformation vom Server pool.ntp.orgt und setzt damit die interne RTC. Nachher wird die Verbindung zum Access Point geschlossen und die Zeit periodisch angezeigt.

Programm:

import ntptime, utime
from oxocard import *

def show():
    mez = h + 1  # time zone shift
    display(mez)
    sleep(2)
    display("%02d" % m)
    sleep(2)
    display("%02d" % s)
    sleep(2)
    display("::")
    sleep(5)

ssid = "mySSID"
pwd = "myPassword"

rc = Wlan.connect(ssid, pwd)
ntptime.settime()
Wlan.disconnect()
while True:
    yy, mm, dd, h, m, s, w, b = utime.localtime()
    show()
► In Zwischenablage kopieren


 

MERKE DIR...

 

Meist müssen Messwerte der aktuellen Zeit zugeordnet werden. Damit diese Information verfügbar bleibt, auch wenn das Messsystem neu gestartet wird, verwendet man eine batteriebgebufferte Realtime-Clock oder bezieht die Zeit über das Internet von einem NTP-Server.

 

 

ZUM SELBST LÖSEN

 

 

1.

Verwende den NTP-Server, um das externe RTC-Modul zu synchronisieren, sofern beim Booten eine Internet-Verbindung aufgebaut werden kann.

2.

Erstelle ein Messsystem mit irgendeinem Sensor, z.B. dem Temperatur-/Feuchtigkeitssensor von Sensirion und einer Realtime-Clock. Auf der Oxocard läuft ein Webserver, der die aktuelle Information, also Zeit und Messwert, dem Browser mitteilt.