4.3.9 Micro:bit Multi-sensor OLED Monitoring Platform

4.3.9.1 Overzicht

Img

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.

Img

4.3.9.2 Benodigde componenten

Img

Img

Img

micro:bit V2-bord ×1

micro:bit shield ×1

OLED-display ×1

Img

Img

Img

PM2.5 stofsensor ×1

motor ×1

stoomsensor ×1

Img

Img

Img

ultravioletsensor ×1

batterijhouder ×1

AA-batterijen (zelf mee te nemen) ×6

Img

Img

Img

micro USB-kabel ×1

4-pins kabel ×3

3-pins kabel ×3

Img

Img

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

Img

4.3.9.4 Codeflow

Img

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” .

Img

⚠️ 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.

Img

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)

Img

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 Img.

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

Img

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.

Img

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

Img

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.

Img

⚠️ 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.)

Img