
Al een tijd wil ik een barometer bouwen dat volledig autonoom werkt. Ik wil met behulp van een BME680 module de waarden van de temperatuur, de relatieve luchtvochtigheid en de luchtdruk meten. Omdat ik de barometer met batterijvoeding ga voorzien kan deze overal geplaatst worden. Het station heeft geen internet-verbinding beschikbaar en de gemeten data wil ik met de actuele tijd op een SD-kaart opslaan. Hiervoor plaats ik een externe RTC, de DS3231. Ik sluit ook een micro SD-kaartmodule aan waardoor ik een micro SD-kaart kan gebruiken om de gemeten data te loggen.
Het aansluiten en werkend opleveren van de SD-kaart module, de BME680 en de externe RTC (DS3231) is niet zo spannend. Het aandachtspunt in deze complexe tutorial is dat de actuele tijd (DateTime) in de log vermeld moet worden. Om dit te bereiken dient de externe RTC van de actuele datum/tijd voorzien te zijn. Hoe je dit doet? Kijk op de pagina van de DS3231 (zie link hieronder) waar dit wordt uitgelegd.
Daar gaan we…
Wat heb je nodig
- Raspberry Pi Pico of Pico W (incl. 5V voeding)
- Micro SD-kaart module
- BME680
- DS3231
- Breadboard
- Verbindingsdraden

Meer info
De modules zijn als tutorials op picademie.nl besproken. Mocht je hier meer over willen weten, klik dan op onderstaande links.
- Micro SD-kaart: https://www.picademie.nl/index.php/2025/04/19/micro-sd-kaart-pico/
- RTC DS3231: https://www.picademie.nl/index.php/2025/04/15/precizie-klok-met-rtc-ds3231-pico/
- BME680: https://www.picademie.nl/index.php/2021/07/13/weer-milieustation-met-de-bme680-sensor/
- Voeding voor mobiele Pico: https://www.picademie.nl/index.php/2025/02/12/voeding-voor-een-mobiele-pico/
Aansluitschema/-tabel
Aangezien we drie modules op de Pico aansluiten, wil ik het verbinden overzichtelijk houden middels drie aansluittabellen. Sluit de modules aan zoals hieronder is aangegeven. Voor de volledigheid heb ik de Pico pinout erbij gezet. Voor de GND aansluiting voldoet iedere willekeurige GND-pin.
BME680 (I2C)


DS3231 (I2C)


SD-kaart (SPI)


Thonny IDE
Ik ga er van uit dat je weet hoe Thonny IDE werkt en hoe je de Raspberry Pi Pico ermee verbind. Weet je het niet of twijfel je? Kijk dan hier waar ik uitleg hoe je het kunt doen.
Bibliotheken
Om de drie modules aan te kunnen sturen hebben we bibliotheken nodig. Deze kunnen via Thonny automatisch of handmatig geïnstalleerd worden. Hieronder leg ik uit hoe je het kunt doen.
DS3231 – bibliotheek
- Ga in Thonny naar het tabblad Hulpmiddelen – Pakketten beheren
- Zoek naar micropython-ds3231 of ds3231 en klik op [Search micropython and PyPi]
Of download de bibliotheek hier van picademie.nl.
Of download de code van GitHub
Heb je het bestand gedownload en (eventueel) uitgepakt? Dan gaan we verder.
- Open in Thonny een nieuw (leeg) bestand
- Kopieer de code van het gedownloade bestand
- Plak de gekopieerde code in het lege bestand
- Sla het bestand als ds3231.py op in de /lib-map op de Pico
BME680 – bibliotheek
- Ga in Thonny naar het tabblad Hulpmiddelen – Pakketten beheren
- Zoek naar micropython-bme680 of bme680 en klik op [Search micropython and PyPi]
Of download de bibliotheek hier van picademie.nl.
Heb je het bestand gedownload en (eventueel) uitgepakt? Dan gaan we verder.
- Open in Thonny een nieuw (leeg) bestand
- Kopieer de code van het gedownloade bestand
- Plak de gekopieerde code in het lege bestand
- Sla het bestand als bme680.py op in de /lib-map op de Pico
Micro SD-kaart – bibliotheek
- Ga in Thonny naar het tabblad Hulpmiddelen – Pakketten beheren
- Zoek naar sdcard en klik op [Search micropython and PyPi]
- Het resultaat is de sdcard @ micropython-lib SDCard block device driver
- Klik op de bibliotheek en vervolgens op [Installeren].
De bibliotheek wordt nu in de \lib-map van de Pico geplaatst.
Aandachtspunt – De micro SD-kaart formatteren voor gebruik
Voordat je verder gaat met de tutorial, moet je de micro SD-kaart formatteren. Plaats de SD-kaart in je pc, open de Verkenner, zoek de SD-kaart en formatteer de kaart als FAT32. Plaats daarna de geformatteerde SD-kaart in de module.
De MicroPython code van de barometer
- Open in Thonny een nieuw bestand
- Kopieer onderstaande code en zet deze in het lege bestand
- Sla het bestand op de Pico op onder een te kiezen naam, bijv. barometer.py
- Wil je de Pico er automatisch mee op laten starten, geef het dan de naam main.py
- Start het programma door op [F5] of de run-knop te klikken.
Barometer.py
'''
Autonome barometer
Raspberry Pi Pico / DS3231 / BME680 / micro SD-kaart module
Door HanD - Picademie.nl
April 2025
'''
# Importeer bibliotheken en onderdelen ervan
from machine import Timer, SPI, Pin, I2C
from time import sleep
from bme680 import *
from ds3231 import *
import sdcard, os
import machine
import time
# Bestandspad voor de log
SD_MOUNT_PATH = '/sd'
FILE_PATH = '/sd/temperatuur.txt'
# Initieer SPI communicatie voor micro SD-kaart module
spi = SPI(0, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
cs = Pin(5)
# Initieer SPI communicatie voor bme680
i2c = I2C(id=0, scl=Pin(13), sda=Pin(12))
bme = BME680_I2C(i2c=i2c)
# Initieer SPI communicatie voor ds3231
i2c = I2C(1, scl=Pin(11), sda=Pin(10))
time.sleep(0.5)
ds = DS3231(i2c)
def mount_sdcard(spi, cs_pin):
try:
sd = sdcard.SDCard(spi, cs_pin)
# Koppel de micro SD-kaart
os.mount(sd, SD_MOUNT_PATH)
print("\nSDCard is gekoppeld\n")
# Toon de bestanden op de micro SD-kaart
print("Bestanden op SDCard:")
print(os.listdir(SD_MOUNT_PATH))
except Exception as e:
print('Er is een probleem met het koppelen van de SD card:', e)
def bme680(timer):
temp = str(round(bme.temperature, 2)) + ' C'
#temp = (bme.temperature) * (9/5) + 32 # tbv Fahrenheit berekening
#temp = str(round(temp, 2)) + 'F' # tbv Fahrenheit berekening
hum = str(round(bme.humidity, 2)) + ' %'
pres = str(round(bme.pressure, 2)) + ' hPa'
gas = str(round(bme.gas/1000, 2)) + ' kOhms'
print('\nBME680 meetwaarden:')
print('--------------------')
print('Temperatuur :', temp)
print('Luchtvochtigheid :', hum)
print('Luchtdruk :', pres)
print('Gas :', gas)
print("---------------------------")
RTC_ds3231(temp, hum, pres)
def RTC_ds3231(temp, hum, pres):
jjjj = str(ds.get_time()[0])
dd = str(ds.get_time()[1])
mm = str(ds.get_time()[2])
hh = str(ds.get_time()[3])
min = str(ds.get_time()[4])
sec = str(ds.get_time()[5]) # wordt niet gebruikt
print("RTC DS3231 info:")
print("- Datum : " + dd + "/" + mm + "/" + jjjj)
print("- Tijd : {:02}:{:02}" .format(ds.get_time()[3], ds.get_time()[4]))
write_to_sdcard(temp,hum,pres,jjjj,mm,dd,hh,min)
def write_to_sdcard(temp,hum,pres,jjjj,mm,dd,hh,min):
# Lees Pico RTC tijd
rtc=machine.RTC()
timestamp=rtc.datetime()
timestring="%04d-%02d-%02d %02d:%02d:%02d"%(timestamp[0:3] + timestamp[4:7])
print("\nPico RTC =",timestring)
# Schrijf naar het bestand
with open(FILE_PATH, 'a') as file:
logdata = str(temp + ", " + hum + ", " + pres)
print("\nDe volgende data wordt op de SD-kaart gelogd:")
print("---------------------------------------------")
print (dd + "/" + mm + "/" + jjjj + " " + hh + ":" + min + " -> "+ logdata + "\n")
file.write("\n"+ dd + "/" + mm + "/" + jjjj + " " + hh + ":" + min + " = "+ logdata + "\n")
# Pico tijd opslaan (Check of de tijd correct is)
file.write("Pico tijd: " + timestring + "\n")
print("De data is succesvol gelogd!")
print('==============================')
lees_logbestand()
def lees_logbestand():
FILE_PATH = '/sd/temperatuur.txt'
file = open(FILE_PATH, "r")
if file != 0:
print("\nReading from SD card")
print("--------------------")
read_data = file.read()
print (read_data)
file.close()
#####################################################################
# Koppel de SD-kaart
mount_sdcard(spi, cs)
# Meet temperatuur als het programma doorlopen wordt en log data
bme680(None)
# Creeer een timer die iedere 30 sec de bme-informatie leest
log_timer = Timer(period=30000, mode=Timer.PERIODIC, callback=bme680)
# Programmalus
try:
while True:
time.sleep(0.1)
except KeyboardInterrupt:
# Maak alles schoon en stop het programma dmv Ctrl-c
log_timer.deinit()
print("Keyboard Interrupt")
Exit-codes
Ik kreeg een tip van Kees die aangaf dat, als de SD-kaart niet in het moduleslot zit, het programma naast het geven van de melding: ‘An error occurred accessing the file or getting temperature [Errno 2] ENOENT’ blijft wachten tot de SD-kaart zichtbaar is. Hij adviseert daarom sys.exit(1) toe te voegen aan de exeptie Exeption as e:-routine binnen de functie mount_sdcard(). Hier hoort de import sys bij.
In bovenstaande code heb het advies van Kees doorgevoerd.
Wat betekent 0 en 1 als de exit-codes?
- exit(0) betekent een schone exit zonder fouten/problemen
- exit(1) betekent dat er een probleem/fout/probleem is opgetreden en dat het programma daarom wordt afgesloten.

Het Resultaat in de Thonny Shell
In de Shell lees je na het starten van de code het volgende:

Ofschoon de BME680 ook de gasweerstand kan meten, laat ik deze achterwege in de log.
Log
Op de micro SD-kaart, in het bestand temperatuur.txt is de opgeslagen data te lezen:

Veel plezier ermee! Mocht je vragen of opmerkingen hebben, laat dan hieronder een reactie achter.
Have A Nice Day!
Laat een reactie achter