NTP klok (Pico W)

De tijd aangeven op een Raspberry Pi of een Pico is eenvoudig te realiseren als je een RTC in je ontwerp opneemt. Het voordeel hiermee is dat je dan een autonome oplossing bouwt die overal werkt en, afhankelijk van de RTC, erg nauwkeurig de tijd kan weergeven. Ik wil een klok bouwen op basis van een NTP-verbinding die zonder een externe RTC de exacte tijd weergeeft. Hoe doe je dit en wat zijn de voor- en nadelen van dit ontwerp?

Je hebt voor deze tutorial slechts een Raspberry Pi Pico W en en display nodig, in dit geval heb ik een 7-segments TM1637 LED display gebruikt met 4 segmenten.

Dit project is gebaseerd op de tutorials ‘De juiste tijd met NTP (Pico W)‘ en ‘4 digits 7 segmenten LED display‘. Hier vind je meer uitleg voor het gebruik van NTP en het display op de Pico.

Daar gaan we…

Voor het script hebben we twee hoofdfuncties nodig, te weten een component dat de NTP tijd opgepikt en de aansturing van het TM1637 display waarop de actuele tijd getoond wordt.

NTP is een internetprotocol dat wordt gebruikt om de klokken op computernetwerken te synchroniseren tot op enkele milliseconden van de gecoördineerde wereldtijd UTC (de oude benaming was GMT)
– Nederland valt tijdens de wintertijd in tijdzone UTC +1.
– Nederland valt tijdens de zomertijd in tijdzone UTC +2.

Ofschoon het mogelijk is de seconden te tonen, neem ik dit in deze tutorial niet mee. Het enige dat je daarvoor hoeft te doen is een groter display te gebruiken, zoals de MAX7219 Led Module 7-Segment TM1637 (HW-179), en in het script de displayfunctie te voorzien van de seconden. In de naam van het 8-digit product zie je dezelfde chip die het display aanstuurt, de TM1637.

Wil je meer weten over dit display en hoe je het kan gebruiken? Klik dan hier.


Thonny
Ik ga er van uit dat je weet hoe Thonny werkt en hoe je de Raspberry Pi Pico ermee verbindt. Weet je dit niet of twijfel je? Kijk dan hier waar ik uitleg hoe je het moet doen.


Bibliotheken

We hebben zowel voor de NTP-tijd als voor het display een bibliotheek nodig.

Ga in Thonny naar Hulpmiddelen – Pakketten beheren en zoek je op:

micropython-tm1637

en

micropython-ntptime

Zodra de bibliotheken gevonden zijn, klik je op [Installeren]. De bibliotheken worden hierdoor in de /lib-map van de Pico geplaatst. Controleer dit even voordat je verder gaat.

Verbinden van het display met de Pico

De voeding (Vcc) van het display wordt met de 3,3V (pin36) en de GND (pin38) van de Pico verbonden. De klok (CLK) en de datalijn (DIO) van het display worden respectievelijk met GP19 (pin25) en GP18 (pin24) van de Pico verbonden.

Uiteraard kan iedere willekeurige GND pin van de Pico gebruikt worden.

Aansluittabel

Het microPython-script

Voor het script kun je onderstaande code gebruiken. Ik heb het script samengesteld door verschillende bronnen te combineren. De kern van de code is het verbinden met je lokale internet, vervolgens het verbinden met de NTP-server en de tijd ervan in te inlezen. Tot slot toont het script de tijd op het display.

import time
import ntptime    
import machine
import network
import tm1637
from machine import I2C, Pin

#Initialiseer display
mydisplay = tm1637.TM1637(clk=Pin(19), dio=Pin(18))
mydisplay.brightness(3)  # 0=low-7=high

# Router creferenties
ssid = "jouwSSID"   
pw = "SSIDwachtwoord"      
print("Met wifi verbinden...")

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

# wacht op verbinding
while not wifi.isconnected():
    pass

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

rtc = machine.RTC()
rtc.datetime((2000, 1, 1, 0, 0, 0, 00, 0))
ntptime.settime()
time.sleep(2)

dstadjust = 1   # wintertijd = 1, zomertijd = 2

while True:
    yyyy = time.localtime()[0]
    mm   = time.localtime()[1]
    dd   = time.localtime()[2]
    hour = time.localtime()[3]
    hh   = hour + dstadjust
    min  = time.localtime()[4]
            
    mydisplay.numbers(hh,min,True)
    time.sleep(1)
    mydisplay.numbers(hh,min,False)
    time.sleep(1)

De helderheid van het display kan geregeld worden door de regel mydisplay.brightness() een waarde tussen 0 en 7 te geven. Hierbij geeft 0 een vaag- en 7 een fel display.

Mijn NTP-klok

Conclusie

Met bovenstaand ontwerp heb je altijd de exacte tijd omdat deze met de NTP-server communiceert. Het enige nadeel is dat als internet niet werkt de tijd niet meer gesynchroniseerd wordt. Daarnaast moet je het wachtwoord van je WiFi in het script opgeven, niet iedereen wil dit vanwege beveiligingsrisico’s. Een oplossing hiervoor kan zijn de code onleesbaar (obfuscatie) te maken. Hier kom ik nog een keer op terug.

Mocht je nog vragen of opmerkingen hebben, geef dan hieronder een reactie.

Veel plezier ermee!

Have A Nice Day!

Geef als eerste een reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*