De juiste tijd met NTP (Pico W)

Wanneer je een computer of tablet opstart, zal je merken dat deze de juiste tijd weergeeft. Dat komt omdat deze apparaten de tijd van het internet halen. Er zijn servers die de juiste tijd leveren, te weten Network Time Protocol servers genoemd, afgekort: NTP servers. NTP servers bestaan ​​al lang. Databasesystemen en bedrijfsservers zijn afhankelijk van ze om de systemen te synchroniseren. Mooi meegenomen is dat iedereen die wil toegang mag hebben tot deze servers.

Zoals bekend is heeft de Raspberry Pi Pico wel een RTC, maar deze houdt de actuele tijd niet vast dus ben je afhankelijk van of een externe RTC of je moet de tijd ergens anders vandaan halen.

Ik dacht dat het niet zo moeilijk kon zijn om de tijd, die de Pico van Thonny ontvangt, vast te houden als je de Pico van een batterijvoeding voorziet. Dat viel tegen! Inmiddels ben ik al een week op zoek naar een werkend script waarmee ik de actuele tijd van het internet (NTP-server) kan halen om daarmee het main.py-script van de actuele tijd te voorzien

Daar gaan we!

De verstopte bibliotheek

De website van Luc Volders wees me erop dat er voor MicroPython een speciale bibliotheek was om de tijd van een NTP server te halen. Helaas is deze niet opgenomen in de standaardbibliotheken en een beetje verborgen in de MicroPython Github Repository. Klik hier voor de link.

De bibliotheek haalt de tijd op van een NTP server en het script werkt de RTC ermee bij. Daarmee krijgt de RTC van de Pico de juiste tijd en dat kan gebruikt worden in je eigen (mobiele) projecten.

De Code

Hieronder staat het microPython script (NTP_Time.py) om de NTP uit te lezen en om te zetten naar de actuele tijd. Vergeet niet om eerst de bibliotheek in de /lib-directory van de Pico te zetten alvorens het script te starten.

Geef bij ssid de naam van je WiFi in en bij pw het bijbehorende wachtwoord.

import time
import ntptime    
import machine
import network

# Router credentials
ssid = "WIFI_NAME"   
pw = "PASSWORD"      
print("Connecting to wifi...")

# wifi connection
wifi = network.WLAN(network.STA_IF)   
wifi.active(True)
wifi.connect(ssid, pw)

# wait for connection
while not wifi.isconnected():
    pass

# wifi connected
print("Connected. IP: ",str(wifi.ifconfig()[0], "\n")) 

rtc = machine.RTC()

rtc.datetime((2000, 1, 1, 0, 0, 0, 00, 0))
print(time.localtime())

ntptime.settime()
time.sleep(2)

dstadjust = 1

while True:
    print ("Year   = ", time.localtime()[0])
    print ("Month  = ", time.localtime()[1])
    print ("Day    = ", time.localtime()[2])
    hour = time.localtime()[3]
    hour = hour + dstadjust
    print ("Hour   = ", hour)
    print ("Minute = ", time.localtime()[4])
    print ("===============")
    time.sleep(10)

Code uitleg

Omdat dit een bijzonder stukje code is, zal ik de onderdelen apart verduidelijken.

import time
import ntptime
import machine
import network

De bibliotheken die we nodig hebben zijn geladen. Vergeet niet de ntptime.py-bibliotheek te kopiëren naar de lib-map van Pico.

# Router credentials
ssid = "WiFi name"     # wifi naam
pw = "WiFi password"   # wifi wachtwoord
print("Connecting to wifi...")

# wifi connection
wifi = network.WLAN(network.STA_IF)   # station mode
wifi.active(True)
wifi.connect(ssid, pw)

Zorg ervoor dat je hier de inloggegevens van jouw WiFi invult. Het programma gebruikt deze om verbinding te maken met internet.

# wait for connection
while not wifi.isconnected():
    pass

Het programma wacht tot er een verbinding met het internet tot stand is gebracht.

# wifi connected
print("Connected. IP: ",str(wifi.ifconfig()[0], "\n"))

Voor het gemak staat het IP-nummer van de Raspberry Pi Pico in de Shell van Thonny vermeld.

rtc = machine.RTC()

rtc.datetime((2000, 1, 1, 0, 0, 0, 00, 0))
print(time.localtime())

De RTC (real time clock) wordt geactiveerd en de datum en tijd worden in eerste instantie ingesteld op het jaar 2000, maand 1 en dag 1, 0 uur en 0 minuten.

ntptime.settime()
time.sleep(2)

De ntptime-bibliotheek haalt de juiste tijd van het internet en zet deze in de RTC van de Raspberry Pi Pico. Vervolgens wachten we 2 seconden tot alles tot rust is gekomen.

dstadjust = 1

dstadjust is de zomertijdaanpassing. Ik gebruik hier de waarde 1 omdat ik in Nederland woon. Pas deze waarde aan naar je eigen behoefte.

while True:
print ("Year = ", time.localtime()[0])
print ("Month = ", time.localtime()[1])
print ("Day = ", time.localtime()[2])
hour = time.localtime()[3]
hour = hour + dstadjust
print ("Hour = ", hour)
print ("Minute = ", time.localtime()[4])

print ("===============")
time.sleep(10)

De while-True-lus loopt voor altijd en in de lus wordt de relevante informatie afgedrukt in Thonny’s shell.

time.localtime() is een tuple. Elk element van de tuple kan als volgt worden geadresseerd:

time.localtime()[X])

Hierbij vertegenwoordigt de X de elementen van de tuple.
0 is het jaar, 1 is de maand, 2 is de datum, 3 is het uur en 4 zijn de minuten. De elementen 5, 6 en 7 zijn de seconden, de dag van de week en de dag van het jaar. Deze laatste 3 elementen worden niet gebruikt in dit project.

    hour = time.localtime()[3]
hour = hour + dstadjust
print ("Hour = ", hour)

Eerst wordt time.localtime()[3] gekopieerd in een variabele met de naam hour. Vervolgens passen we die variabele aan met de dstadjust-waarde om het juiste uur te krijgen en vervolgens printen we de waarde. 

Het resultaat

Hieronder zie je hoe het programma zijn gegevens toont in Thonny’s shell. 
Als je van plan bent om wat tijdgerelateerde projecten te bouwen, zou dit je op weg moeten helpen.

Mocht je nog vragen en/of opmerkingen hebben, plaats dan een reactie hieronder.

Have A Nice Day!

Geef als eerste een reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*