### 4.3.9 Micro:bit Multi-sensor OLED Monitoring Platform #### 4.3.9.1 Overzicht ![Img](./media/top1.png) 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](./media/bottom1.png) #### 4.3.9.2 Benodigde componenten | ![Img](./media/microbitV2.png)| ![Img](./media/ExpansionBoard.png) |![Img](./media/OLED.png)| | :--: | :--: | :--: | | micro:bit V2-bord ×1 | micro:bit shield ×1 | OLED-display ×1 | |![Img](./media/PM2.5-1.png) |![Img](./media/motor.png)|![Img](./media/steam1.png)| | PM2.5 stofsensor ×1 | motor ×1 | stoomsensor ×1 | |![Img](./media/UV-sensor1.png)|![Img](./media/batterycase.png)| ![Img](./media/AAbattery.png)| | ultravioletsensor ×1 | batterijhouder ×1 | AA-batterijen (**zelf mee te nemen**) ×6 | |![Img](./media/usb.png) |![Img](./media/4pin.png)|![Img](./media/3pin.png)| | micro USB-kabel ×1 | 4-pins kabel ×3 | 3-pins kabel ×3 | |![Img](./media/Atomization1.png) | ![Img](./media/fan.png) | | | 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](./media/couj11.png) #### 4.3.9.4 Codeflow ![Img](./media/flow-chart-011.png) #### 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](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ![Img](./media/WPSA1.png) ⚠️ **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](./media/WPSA3.png) **Volledige code:** ```Python ''' 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](./media/line1.png) **Korte uitleg:** ① Importeer de libraries microbit, oled_ssd1306, math en time. ```Python from microbit import * from oled_ssd1306 import * import math import time ``` ② De 5×5 LED-matrix toont ![Img](./media/ab3.png). ```Python display.show(Image.HAPPY) ``` ③ Initialiseer de OLED-pixels en wis de OLED. ```Python initialize() clear_oled() ``` ④ Initialiseer de pinnen van de PM2.5 stofsensor. ```Python out_Pin = pin2 led_Pin = pin9 ``` ⑤ Initialiseer de pin en variabelen van de stoomsensor. ```Python Steam_PIN = pin1 WET_VALUE = 1023 DRY_VALUE = 0 ``` ⑥ Initialiseer de pin van de zonne-ultravioletsensor. ```Python uv_sensor = pin0 ``` ⑦ Stel de beginwaarden in van de tijdvariabelen. ```Python delayTime = 280 delayTime2 = 40 offTime = 9680 ``` ⑧ Definieer een map-subfunctie (om elk getallenbereik naar een ander bereik te mappen). ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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. ```Python 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](./media/4top.png) 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](./media/A133.png) Na het uploaden van de testcode, druk op de resetknop aan de achterkant van de micro:bit. ![Img](./media/A455.png) 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](./media/dongtu-9.gif) ⚠️ **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](./media/4bottom.png)