
De CPU (rp2040) van de Raspberry Pi Pico bevat een opvallend component, te weten een RTC. Weliswaar is deze erg nauwkeurig, maar helaas is deze RTC niet direct te gebruiken als klok ofschoon bij het oproepen van de RTC-tijd in Thonny de Pico de exacte tijd aangeeft. Hoe zit dat en hoe gebruik je de Pico om de exacte tijd weer te geven in projecten.
RTC? Mijn Pico heeft al de nauwkeurige tijd!
Voor degenen die (net als ik) een beetje in de war waren toen de Raspberry Pi Pico de juiste tijd in Thonny aangaf. Hoe zit dat? Er is hier een goede reden voor.
Als je de RTC van de Pico uitleest zie je dat de tijd begint op 1/1/2021 0:0:0. Om de RTC tijd te kunnen gebruiken zal je deze eerst met de actuele tijd moeten synchroniseren.
Een tijd geleden is er een wijziging in de code van Thonny doorgevoerd, waardoor een klein stukje code op de hostcomputer (Windows, Mac of Linux) wordt uitgevoerd. De computer vindt daarmee niet alleen automatisch een aangesloten Pico, maar synchroniseert ermee vervolgens de actuele datum en tijd!
Het verschil met een losse RTC-module (incl. oplaadbare batterij) die de tijd vasthoudt als de Pico geen spanning heeft, is dat je de interne RTC van de Pico steeds opnieuw op tijd moet zetten als de spanning eraf geweest is. Erg onhandig!

Battery back-up houdt datum en tijd vast
Wil je niet dat de Pico na het synchroniseren met de actuele tijd de RTC-tijd verliest, zorg er dan voor dat de Pico van een (permanente) voeding is voorzien. In deze tutorial zie je hoe je dit kunt doen.
Daar gaan we!
Interne RTC uitlezen van (actuele) datum en tijd
In deze tutorial laat ik een drietal voorbeelden zien hoe je de (interne) RTC van de Pico uitleest en in verschillende formaten weergeeft. Ik gebruik Thonny om de code te laten draaien, de Shell ervan toont het resultaat.
Script 1
Om de datum en tijd uit de RTC te lezen en in in het gebruikelijke format te tonen zijn slechts een paar coderegels nodig:
import machine
import time
while True:
rtc=machine.RTC()
timestamp=rtc.datetime()
timestring="%04d-%02d-%02d %02d:%02d:%02d"%(timestamp[0:3] + timestamp[4:7])
print(timestring)
time.sleep(1)Het resultaat:
2025-02-12 16:29:40
2025-02-12 16:29:41
2025-02-12 16:29:42
2025-02-12 16:29:43
enz.Script 2
Ben je meer op zoek naar de losse elementen van de datum en tijd:
from machine import RTC
import time
while True:
rtc = RTC()
t=rtc.datetime()
print(t)
time.sleep(1)Het resultaat:
(2025, 2, 11, 1, 6, 47, 4, 0)
(2025, 2, 11, 1, 6, 47, 5, 0)
(2025, 2, 11, 1, 6, 47, 6, 0)
(2025, 2, 11, 1, 6, 47, 7, 0)
enz.Script 3
Wil je slechts de dag en de datum:
from machine import RTC
rtc = RTC()
year, month, day, dow, hour, mins, secs = rtc.datetime()[0:7]
days = ["Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"]
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
day_name = days[dow]
month_name = months[month-1]
#s = "{}, {} {}, {}".format(day_name, day, month_name, year)
s = "{}, {} {} {}".format(day_name, day, month_name, year)
print('\nHet is',s)Het resultaat:
Het is Woensdag, 12 Feb 2025Er zijn nog een paar verschijningen, maar ik beperk het tot deze drie. Mocht je nog vragen hebben, plaats hieronder dan je reactie.
Have A Nice Day!

Een Pi Pico is verbonden met een DS3231 RTC module (voorzien van een backup batterij en de juiste tijd), een sensor en een SD-card module.
De Pi Pico zorgt ervoor dat de sensordata samen met de actuele tijd in een bestand op de SD card wordt weggeschreven. Dat gebeurt ook. Om die taak, los van een pc uit te voeren is de Pi Pico voorzien van main.py.
Als ik de Pi Pico opnieuw op een externe voeding aansluit dan is het bestand met de data en de actuele tijd gevuld, maar de aanmaakdatum van dit bestand blijkt 31-12-2020 23:00 te zijn. Het zou eigenlijk zo moeten zijn dat eerst de PiPico datum en tijd wordt bijgewerkt met de actuele datum en tijd uit de RTC module(met batterij) en dat daarna pas het bestand op de SD card wordt aangemaakt. Hoe kan ik deze volgorde programmeren (afdwingen)? Alvast hartelijk dank voor uw hulp.
Hallo Kees, dank voor je vraag. Ik denk te begrijpen wat je wilt.
Ik heb een paar vragen voordat ik antwoord kan geven.
– Waar komt de aanmaakdatum vandaan? Is dit de tijd van de externe RTC (DS3231) of de interne RTC van de Pico? Te zien aan de datum lijkt het dit laatste te zijn.
– Heb je de DS3231 met de actuele tijd voorzien? Dit is (eenmalig) nodig om bij spanningsonderbreking de actuele (RTC) tijd te gebruiken. Ik heb net een artikel geplaatst waarin dit beschreven wordt, zie https://www.picademie.nl/index.php/2025/04/15/precizie-klok-met-rtc-ds3231-pico/
– Net zo belangrijk is het dat de (oplaadbare) batterij nog werkt. Ik heb een tiental DS3231 (voor de Raspberry Pi – gele vaste batterij) in bezit waarvan er 6 een defecte batterij hebben. De batterij zou zo’n 3V moeten afgeven om de DS3231-chip te kunnen voorzien.
Ik hoor het van je.
– Het lijkt de datum van de Pi Pico te zijn ten tijde van het inschakelen van de Pi Pico. En die datum is blijkbaar gebruikt als creation date voor het aanmaken van het bestand op de Sd card. Misschien is het voor mij duidelijker als ik weet hoe ik die interne RTC tijd van de Pi Pico kan veranderen, maar dan nog voordat de creationdate van het bestand is vastgelegd. En de DS3231 heeft zeker de actuele datum aan boord. De backup batterij (LIR2032) is in orde.
Er komen twee functies in het programma voor.
Een SD Mount functie:
def mount_sdcard(spi, cs_pin):
try:
sd = sdcard.SDCard(spi, cs_pin)
# Mount microSD card
os.mount(sd, SD_MOUNT_PATH)
# List files on the microSD card
#print(os.listdir(SD_MOUNT_PATH))
# Open a file
path = ‘/sd’
dirs = os.listdir( path )
# Print all the files and directories
for file in dirs:
print(file)
except Exception as e:
print(‘An error occurred mounting the SD card:’, e)
en een schrijf weg functie
def log_data(timer): waarin voorkomt:
with open(FILE_PATH, ‘a’) as file:
file.write(“\n”+formatted_datetime+” “+str(tempC)+” “+str(hum)+” “+str(pres))
Tenslotte de programma afwikkeling daaronder, daar staat:
# Mount SD card
mount_sdcard(spi, cs)
# Log temperature when the program first runs
log_data(None)
# Create a timer that calls log_temperature every 30 seconds
log_timer = Timer(period=30000, mode=Timer.PERIODIC, callback=log_data)
# Keep the program running
try:
while True:
time.sleep(0.1)
except KeyboardInterrupt:
# Clean up and stop the timer on keyboard interrupt
log_timer.deinit()
print(“Keyboard Interrupt”)
Als proef had ik voor de opdracht
# Mount SD card
mount_sdcard(spi, cs)
een pauze ingebouwd om dan pas het SD kaartje er in te steken, maar dat hielp niet. Want nog steeds de onjuiste creation date. Misschien is dit niet de juiste plek in het programma om dit te bekijken.