Nu de libraries zijn geïnstalleerd, kun je metingen uitvoeren. All de voorbeelden staan ook in de folder voorbeelden van het github-repository.
Let erop dat de hardware juist is aangesloten. De software gaat er vanuit dat de sensoren op GPIO-0 en GPIO-1 aangesloten zijn. Als dat niet het geval is, pas de code aan! Door de voorgeschreven SDA/SCL pinnen van de Raspberry Pi Pico te gebruiken kan de snelle, hardware, implementatie gebruikt worden. Als er andere pinnen gebruikt worden moet de softwere I2C bibliotheek, SoftI2C uit de machine module gebruikt worden.
Weergave van data in Thonny¶
Lees de meetwaarden van de sensor uit en geef ze weer in de Shell van Thonny. De code kan worden gekopieerd naar het editor-scherm van Thonny. Daarna kun je de code uitvoeren met de groene run-knop.
import machine
import time
# Importeer de SEN63C of SEN66 bibliotheek
# zet een # voor de regel die je niet nodig hebt!
from meting_sen6x import Sensor # SEN63-C fijnstof sensor
#from meting_sps30 import Sensor # SPS30 fijnstof sensor
# maak verbinding met de fijnstof sensor
# sensor verbonden met pin 0 en 1 (sda en scl) op de Raspberrypi Pico.
i2c = machine.I2C(0, sda = machine.Pin(0), scl = machine.Pin(1), freq=100000)
delay = 5 # wacht 5 seconden na elke meting
separator = ";" # scheidingsteken tussen de verschillende meetwaarden
#### Geen wijzigingen meer nodig #####
sensor = Sensor(i2c)
sensor.start_measurement()
sensor.meet_data()
time.sleep(1)
# print de beschrijving van de dataset
print(separator.join(str(ii) for ii in sensor.data_header))
# start de metingen
measure = 1
while measure:
try:
# zolang ctrl-c niet ingedrukt...
sensor.meet_data()
data = separator.join(str(ii) for ii in sensor.waarden)
print(data)
time.sleep(delay)
except KeyboardInterrupt:
measure = 0
Als de Raspberry Pi Pico is aangesloten en MicroPython is gekozen als Python-versie, verschijnen er regels met meetwaarden:
tijd [s];pm 1.0 [ug/m3];pm 2.5 [ug/m3];pm 4.0 [ug/m3];pm 10 [ug/m3];temp [degC];rel. hum [%];CO2 [ppm]
1783375431;6553.5;6553.5;6553.5;6553.5;28.315;46.72;32767
1783375436;0.2;0.2;0.2;0.3;28.315;46.72;32767
1783375441;0.3;0.4;0.4;0.4;28.295;46.71;32767
1783375446;0.3;0.4;0.4;0.4;28.2;46.7;32767
1783375451;0.5;0.6;0.7;0.7;27.825;46.71;32767
1783375456;0.5;0.7;0.8;0.8;27.045;46.75;790
1783375461;0.7;0.9;1.0;1.1;26.39;47.47;637De eerste kolom is de tijd. Deze staat in seconden sinds 1 januari 1970. Dit heet een Unix-timestamp. De volgende vier kolommen zijn de PM1.0-, PM2.5-, PM4.0- en PM10-waarden. Daarna volgen de temperatuur in graden Celsius, de relatieve luchtvochtigheid en de concentratie in ppm. De eerste regel kan onjuiste data teruggeven. De sensor geeft als eerste waarden de maximale waarden terug. Het is niet zo dat de fijnstof concentratie extreem hoog was, die meetpunten kunnen uit de dataset gehaald worden.
Metingen opslaan op de Raspberry Pi Pico¶
Om de data in een bestand op te slaan, moet er een bestand op de Raspberry Pi Pico worden aangemaakt. Dan kun je de waarden later opnieuw gebruiken. In dit voorbeeldscript wordt een bestand met de naam meting_000.csv aangemaakt. Als dit bestand al bestaat, wordt de volgende naam geprobeerd: meting_001.csv. Dit gaat zo door totdat er een bestandsnaam is gevonden die nog niet bestaat.
import machine
import time
import os
# Importeer de SEN63C of SEN66 bibliotheek
# zet een # voor de regel die je niet nodig hebt!
from meting_sen6x import Sensor # SEN63-C fijnstof sensor
#from meting_sps30 import SPS30 as Sensor # SPS30 fijnstof sensor
# maak verbinding met de fijnstof sensor
# sensor verbonden met pin 0 en 1 (sda en scl) op de Raspberrypi Pico.
i2c = machine.I2C(0, sda = machine.Pin(0), scl = machine.Pin(1), freq=100000)
delay = 5 # wacht 5 seconden na elke meting
separator = ";" # scheidings teken tussen de verschillende meetwaarden
basis_fn = 'meting_%03d.csv' # filenaam in de form meting_000.csv
#### Geen wijzigingen meer nodig #####
sensor = Sensor(i2c)
sensor.start_measurement()
sensor.meet_data()
time.sleep(1)
# vind de eerste filenaam die nog niet bestaat
N = 0
running = True
while running:
try:
fn = basis_fn %(N)
vals = os.stat(fn)
N+=1
except OSError:
running = False
# open een lege file
fh = open(fn, 'w')
# print de beschrijving van de dataset naar de file
print(separator.join(str(ii) for ii in sensor.data_header), file=fh)
# start de metingen
measure = 1
while measure:
try:
# zolang ctrl-c niet ingedrukt...
sensor.meet_data()
data = separator.join(str(ii) for ii in sensor.waarden)
print(data, file=fh)
print(data)
fh.flush() # schrijf de data echt weg naar de file
time.sleep(delay)
except KeyboardInterrupt:
measure = 0
# sluit de file af
fh.close()
Na de metingen kan de Raspberry Pi Pico weer met de computer worden verbonden via Thonny. Daarna kun je het meetbestand downloaden naar de computer. Klik daarvoor met de rechtermuisknop op de bestandsnaam in het Raspberry Pi-deel van de bestanden in Thonny.
Een voorbeeld dataset staat in voorbeelden/data, meting_001.csv. Het format is hetzelfde als hierboven weergegeven, punt-komma gescheiden data met als eerste regel de beschrijving van de datapunten. Een voorbeeld van weergave van de data is in het analyse hoofdstuk weergegeven.
Weergave op OLED-scherm¶
Door een OLED-scherm (128x64 of 64x64) aan de Raspberry Pi Pico aan te sluiten, kunnen meetgegevens op het scherm worden weergegeven. Ook kan de status van de meting worden bijgehouden, of kan er feedback worden gegeven aan de gebruiker van het meetsysteem.
import machine
import time
import ssd1306
# Importeer de SEN63C of SEN66 bibliotheek
# zet een # voor de regel die je niet nodig hebt!
from meting_sen6x import Sensor # SEN63-C fijnstof sensor
#from meting_sps30 import SPS30 as Sensor # SPS30 fijnstof sensor
# maak verbinding met de fijnstof sensor
# sensor verbonden met pin 0 en 1 (sda en scl) op de Raspberrypi Pico.
i2c = machine.I2C(0, sda = machine.Pin(0), scl = machine.Pin(1), freq=100000)
# scherm verbonden met pin 6 en 7 (sda en scl) op de Raspberrypi Pico
i2c_oled = machine.I2C(1, sda = machine.Pin(6), scl = machine.Pin(7))
# kies voor een vierkant (64x64) scherm of rechthoekig (128x64) pixels.
#display = ssd1306.SSD1306_I2C(64,64, i2c_oled)
display = ssd1306.SSD1306_I2C(128,64, i2c_oled)
delay = 5 # wacht 5 seconden na elke meting
separator = ";" # scheidings teken tussen de verschillende meetwaarden
#### Geen wijzigingen meer nodig #####
ssd1306.write(display, 'starting', 0,16)
sensor = Sensor(i2c)
sensor.start_measurement()
# start metingen
measure = 1
t0 = time.time()
while measure:
try:
# zolang ctrl-c niet ingedrukt...
sensor.meet_data()
data = sensor.waarden
print(data)
# schrijf de data weg naar het scherm
# eerste regel de tijd (sinds het opstarten van de meting)
# tweede regel PM1.0
# derde regel PM2.5
# vierde regel PM5
ssd1306.write(display, ['t:%d' %(data[0] - t0), '1.0:%2.2f' %(data[1]), '2.5:%2.2f' %(data[2])], [0,0,0], [16,32,48])
time.sleep(delay)
except KeyboardInterrupt:
measure = 0
De driver (ssd1306.py) staat al in de lib folder. Als alle files al naar de lib folder op de Raspberry Pi Pico gekopieerd zijn dan kan het voorbeeld script direct uitgevoerd worden.
Koppeling met GPS-sensor¶
Met een GPS-unit kan de locatie van de sensor op elk moment worden opgeslagen. Door deze data tegelijk met de sensordata naar een bestand te schrijven, kun je achteraf zien op welke locatie de blootstelling is gemeten.
import machine
import time
import gps
# Importeer de SEN63C of SEN66 bibliotheek
# zet een # voor de regel die je niet nodig hebt!
from meting_sen6x import Sensor # SEN63-C fijnstof sensor
#from meting_sps30 import SPS30 as Sensor # SPS30 fijnstof sensor
# maak verbinding met de fijnstof sensor
# sensor verbonden met pin 0 en 1 (sda en scl) op de Raspberrypi Pico.
i2c = machine.I2C(0, sda = machine.Pin(0), scl = machine.Pin(1), freq=100000)
# maak verbinding met de GPS
# GPS op pin 4 en 5 van de Raspberrypi Pico aangesloten
uart = machine.UART(1, baudrate=9600, tx=machine.Pin(4), rx=machine.Pin(5))
delay = 5 # wacht 5 seconden na elke meting
separator = ";" # scheidings teken tussen de verschillende meetwaarden
#### Geen wijzigingen meer nodig #####
gps = gps.GPS(uart)
sensor = Sensor(i2c)
sensor.start_measurement()
# start de metingen
measure = 1
while measure:
try:
# zolang ctrl-c niet ingedrukt...
sensor.meet_data()
data = separator.join(str(ii) for ii in sensor.waarden)
print('sensor: ',data)
print('gps: ',gps.gpsdata)
time.sleep(delay)
except KeyboardInterrupt:
measure = 0
gps.running = False
while gps.running: # laat de gps afsluiten
pass
print('all done...')