4.3.9 Micro:bit Multi-sensor OLED Monitoring Platform
4.3.9.1 Overzicht

In dit project gebruiken we het micro:bit bord als de centrale verwerkingsunit om de waarden uit de ingebouwde sensoren te lezen (inclusief lichtsensor, temperatuursensor, microfoon) en externe sensoren (zoals PM2.5 stofsensor, stoomsensor en zonne-ultraviolet sensor). Deze waarden worden vervolgens in real-time weergegeven op de OLED via de I2C-interface.
Tegelijkertijd kan de rotatie van de ventilator op de 130 motormodule worden geregeld door op knop A op het Micro:bit bord te drukken, en het watermistspuiten van de vernevelingsmodule kan worden geregeld door op knop B op het Micro:bit bord te drukken.

4.3.9.2 Benodigde componenten
|
|
|
|---|---|---|
micro:bit V2-bord ×1 |
micro:bit shield ×1 |
OLED-display ×1 |
|
|
|
PM2.5 stofsensor ×1 |
motor ×1 |
stoomsensor ×1 |
|
|
|
ultravioletsensor ×1 |
batterijhouder ×1 |
AA-batterijen (zelf mee te nemen) ×6 |
|
|
|
micro USB-kabel ×1 |
4-pins kabel ×3 |
3-pins kabel ×3 |
|
|
|
vernevelingsmodule ×1 |
ventilator ×1 |
4.3.9.3 Aansluitschema
⚠️ Let bij het aansluiten op de draadkleur.
ultraviolet sensor |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
G |
black |
G |
G |
V |
red |
V2 |
V |
S |
yellow |
0 |
P0 |
stoomsensor |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
G |
black |
G |
G |
V |
red |
V1 |
V |
S |
yellow |
1 |
P1 |
PM2.5 stofsensor |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
GND |
black |
G |
G |
VCC |
red |
V2 |
V |
LED |
blue |
9 |
P9 |
OUT |
green |
2 |
P2 |
vernevelingsmodule |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
G |
black |
G |
G |
V |
red |
V2 |
V |
S |
yellow |
16 |
P16 |
motor |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
G |
black |
G |
G |
V |
red |
V2 |
V |
IN+ |
blue |
13 |
P13 |
IN- |
green |
15 |
P15 |
OLED display |
draadkleur |
micro:bit shield pin |
micro:bit board pin |
|---|---|---|---|
GND |
black |
G |
G |
VCC |
red |
V2 |
V |
SDA |
blue |
20 |
P20 |
SCL |
green |
19 |
P19 |

4.3.9.4 Codeflow

4.3.9.5 Testcode
⚠️ Tip 1: Voordat je de code naar het Microbit-bord downloadt, importeer je het bibliotheekbestand “oled_ssd1306.py” volgens “Import Library on MU” .

⚠️ Tip 2: Als het bibliotheekbestand “XHT11.py” eerder al naar het micro:bit bord is geïmporteerd, moet het van het micro:bit bord worden verwijderd. Anders kan dit leiden tot onvoldoende geheugen op het Microbit-bord, waardoor het downloaden van de voorbeeldcode naar het Microbit-bord niet succesvol is.
Klik op de knop “Files”, klik vervolgens met de rechtermuisknop op het bibliotheekbestand “XHT11.py” in het linkervak, de optie “Delete (cannot be undone)” verschijnt, klik op de optie “Delete (cannot be undone)”. Op deze manier is het bibliotheekbestand “XHT11.py” verwijderd.

Volledige code:
'''
Theme: A multi-sensor OLED monitoring platform based on Micro:bit
Function: OLED displays the values of multiple sensors
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
# import related libraries
from microbit import *
from oled_ssd1306 import *
import math
import time
display.show(Image.HAPPY) # LED matrix displays a happy pattern
# initialize and clear oled
initialize()
clear_oled()
# Hardware connection: PM2.5 dust sensor
out_Pin = pin2
led_Pin = pin9
# Hardware connection: steam sensor
Steam_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0
# Initialize the ADC pin (the ultraviolet sensor is connected to pin0)
uv_sensor = pin0
# Time parameter
delayTime = 280
delayTime2 = 40
offTime = 9680
def map_value(value, in_min, in_max, out_min, out_max):
"""Linearly map the input values to the output range"""
if in_max - in_min == 0:
return out_min
return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
def get_rain_percentage():
"""Read the sensor and return the percentage of rainfall"""
raw_value = Steam_PIN.read_analog()
percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100)
return max(0, min(100, percentage))
def read_uv_index():
raw_value = uv_sensor.read_analog()
if raw_value > 1023:
raw_value = 1023
elif raw_value < 0:
raw_value = 0
uvi = raw_value * (15.0 / 1023)
return round(uvi, 1)
def microsecond_delay(us):
"""Precise microsecond delay"""
start = time.ticks_us()
while time.ticks_diff(time.ticks_us(), start) < us:
pass
while True:
# Measurement sequence
led_Pin.write_digital(0) # LED OFF
microsecond_delay(delayTime) # 280μs
dustVal = out_Pin.read_analog() # Read the PM2.5 dust sensor
microsecond_delay(delayTime2) # 40μs
led_Pin.write_digital(1) # LED ON
microsecond_delay(offTime) # 9680μs
Lightintensity = display.read_light_level()
Temperature = temperature()
soundLevel = microphone.sound_level()
rain_percent = get_rain_percentage()
uv = read_uv_index()
clear_oled()
if button_a.is_pressed(): # if button_a.is pressed
sleep(200)
pin13.write_digital(1) # the fan is rotating.
pin15.write_digital(0)
sleep(200)
else: # or
pin13.write_digital(0) # the fan does not rotate.
pin15.write_digital(0)
if button_b.is_pressed(): # if button_b.is pressed
pin16.write_digital(0) # the atomization module sprays water mist.
sleep(200)
pin16.write_digital(1)
sleep(3000)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(1000)
else: # or
pin16.write_digital(1) # the atomization module does not spray water mist.
add_text(0, 0, "Temper:")
add_text(7, 0, str(int(Temperature)) + "C") # Display the Temperature value on the OLED
add_text(0, 2, "UV:")
add_text(3, 2, str(int(uv))) # Display the UV value on the OLED
add_text(5, 2, " | Rain:")
add_text(13, 2, str(int(rain_percent)) + "%") # Display the percentage of rainfall on the OLED
add_text(0, 4, "Light:")
add_text(6, 4, str(Lightintensity)) # Display the light intensity on the OLED
add_text(9, 4, " | Sound:")
add_text(18, 4, str(soundLevel)) # Display the noise intensity on the OLED
# Calculation and display
if dustVal > 36.455:
# The exact same calculation formula
voltage = dustVal / 1024.0
pm25 = (voltage - 0.0356) * 120000 * 0.035
# OLED displays detailed PM2.5dust value information.
add_text(0, 6, "PM2.5dust:")
add_text(10, 6, str(round(pm25)) + "ug/m3")
else:
print("Low value:", dustVal)
sleep(500)

Korte uitleg:
① Importeer de libraries microbit, oled_ssd1306, math en time.
from microbit import *
from oled_ssd1306 import *
import math
import time
② De 5×5 LED-matrix toont
.
display.show(Image.HAPPY)
③ Initialiseer de OLED-pixels en wis de OLED.
initialize()
clear_oled()
④ Initialiseer de pinnen van de PM2.5 stofsensor.
out_Pin = pin2
led_Pin = pin9
⑤ Initialiseer de pin en variabelen van de stoomsensor.
Steam_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0
⑥ Initialiseer de pin van de zonne-ultravioletsensor.
uv_sensor = pin0
⑦ Stel de beginwaarden in van de tijdvariabelen.
delayTime = 280
delayTime2 = 40
offTime = 9680
⑧ Definieer een map-subfunctie (om elk getallenbereik naar een ander bereik te mappen).
def map_value(value, in_min, in_max, out_min, out_max):
"""Linearly map the input values to the output range"""
if in_max - in_min == 0:
return out_min
return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
⑨ Definieer een subfunctie om de waarde van de neerslaghoeveelheid te verkrijgen.
def get_rain_percentage():
"""Read the sensor and return the percentage of rainfall"""
raw_value = Steam_PIN.read_analog()
percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100)
return max(0, min(100, percentage))
⑩ Definieer een subfunctie om de waarde van de ultraviolette intensiteit te verkrijgen die door de zonne-ultravioletsensor is gedetecteerd.
def read_uv_index():
raw_value = uv_sensor.read_analog()
if raw_value > 1023:
raw_value = 1023
elif raw_value < 0:
raw_value = 0
uvi = raw_value * (15.0 / 1023)
return round(uvi, 1)
⑪ Definieer een subfunctie voor microseconde vertraging.
def microsecond_delay(us):
"""Precise microsecond delay"""
start = time.ticks_us()
while time.ticks_diff(time.ticks_us(), start) < us:
pass
⑫ Stel de besturing van de meettiming van de PM2.5 stofsensor in, welke voornamelijk wordt gebruikt om de stofconcentratie in de lucht te detecteren.
led_Pin.write_digital(0) # LED UIT
microsecond_delay(delayTime) # 280μs
dustVal = out_Pin.read_analog() # Lees de PM2.5 stofsensor
microsecond_delay(delayTime2) # 40μs
led_Pin.write_digital(1) # LED AAN
microsecond_delay(offTime) # 9680μs
⑬ Lees de waarden van lichtintensiteit, temperatuur, geluidsniveau, neerslagpercentage en ultraviolet.
Lightintensity = display.read_light_level()
Temperature = temperature()
soundLevel = microphone.sound_level()
rain_percent = get_rain_percentage()
uv = read_uv_index()
⑭ Voorwaardelijke instructie: if()…else…
Druk op knop A op het micro:bit bord, en de motor zal de ventilator laten draaien. Anders zal de ventilator niet draaien.
if button_a.is_pressed(): # if button_a.is pressed
sleep(200)
pin13.write_digital(1) # the fan is rotating.
pin15.write_digital(0)
sleep(200)
else: # or
pin13.write_digital(0) # the fan does not rotate.
pin15.write_digital(0)
⑮ Voorwaardelijke instructie: if()…else…
Druk op knop B op het micro:bit bord, en de vernevelingsmodule zal watermist spuiten. Anders werkt deze niet.
if button_b.is_pressed(): # if button_b.is pressed
pin16.write_digital(0) # the atomization module sprays water mist.
sleep(200)
pin16.write_digital(1)
sleep(3000)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(1000)
else: # or
pin16.write_digital(1) # the atomization module does not spray water mist.
⑯ Geef de waarden van ultraviolet, temperatuur, neerslagpercentage, lichtintensiteit en geluidsniveau weer op de OLED.
add_text(0, 0, "Temper:")
add_text(7, 0, str(int(Temperature)) + "C") # Display the Temperature value on the OLED
add_text(0, 2, "UV:")
add_text(3, 2, str(int(uv))) # Display the UV value on the OLED
add_text(5, 2, " | Rain:")
add_text(13, 2, str(int(rain_percent)) + "%") # Display the percentage of rainfall on the OLED
add_text(0, 4, "Light:")
add_text(6, 4, str(Lightintensity)) # Display the light intensity on the OLED
add_text(9, 4, " | Sound:")
add_text(18, 4, str(soundLevel)) # Display the noise intensity on the OLED
⑰ Wanneer de analoge waarde van PM2.5 stofdeeltjes groter is dan 36.455, kan de concentratiewaarde worden berekend en op de OLED worden weergegeven. Anders print de seriële monitor de bijbehorende stof-analoge waarden.
if dustVal > 36.455:
# The exact same calculation formula
voltage = dustVal / 1024.0
pm25 = (voltage - 0.0356) * 120000 * 0.035
# OLED displays detailed PM2.5dust value information.
add_text(0, 6, "PM2.5dust:")
add_text(10, 6, str(round(pm25)) + "ug/m3")
else:
print("Low value:", dustVal)
4.3.9.6 Testresultaat

Na het aansluiten en inschakelen via de micro USB-kabel, sluit ook de externe voeding aan (6 AA-batterijen) om voldoende stroom te garanderen, en klik op “Flash” om de code naar het micro:bit bord te downloaden.

Na het uploaden van de testcode, druk op de resetknop aan de achterkant van de micro:bit.

Het leest de waarden van de ingebouwde sensoren (inclusief lichtsensor, temperatuursensor, microfoon) en externe sensoren (zoals PM2.5 stofsensor, stoomsensor en zonne-ultravioletsensor) en kan vervolgens op een intuïtieve manier via het OLED-scherm met I2C-interface in real-time de lichtintensiteit, temperatuur, geluidsintensiteit, neerslagintensiteit, UV-intensiteit van zonlicht en PM2.5 stofconcentratie weergeven.
Blaas lucht (of maak een zeer hard geluid) in de microfoon op het Microbit-bord (⚠️ speciale herinnering: Blazen met de mond geeft een duidelijker effect), en de OLED-weergave zal de intensiteit van het blazen (of het geluid) tonen.
Wanneer knop A op het micro:bit bord wordt ingedrukt, draait de ventilator op de motormodule. Wanneer knop B op het bord wordt ingedrukt, spuit de vernevelingsmodule watermist.
⚠️ Speciale herinnering: Soms kan de externe voedingsspanning onvoldoende zijn. In dergelijke gevallen kan het nodig zijn om twee keer op de knop van het micro:bit bord te drukken voordat de ventilator begint te draaien of de vernevelingsmodule begint te sproeien.

⚠️ Opmerking: De bouwstenen in het experiment zijn niet inbegrepen in deze kit.
(Tip: Als er geen resultaat wordt waargenomen, druk dan op de resetknop van het micro:bit bord.)














