In de afgelopen jaren is de kwaliteit van de lucht die we inademen helaas een niet te onderschatten problematiek geworden. Dat geldt al heel lang voor het binnenmilieu, vooral in de winter, wanneer velen van ons opgesloten zitten in een slecht geventileerde kamer. Maar ook buiten, vooral in steden, waar de lucht steeds meer vervuild raakt door vervuilende uitstoot van motorvoertuigen, verwarmingsinstallaties (laten we niet vergeten dat aardgas geen zuiver methaan is, maar andere gassen en additieven bevat voor geur- en vlamkleuring...) van fabrieken en thermische centrales enzovoort. Bovendien is het schaarse groen niet goed voor de zuurstofvoorziening in de lucht, die daardoor een laag zuurstofgehalte heeft en de natuurlijke processen van het menselijk en dierlijk organisme niet bevordert.

In een gesloten omgeving wordt de luchtkwaliteit aangetast door stoffen als kooldioxide die we uitademen, maar ook door zwevende deeltjes en ziekteverwekkers die we uitstoten door te ademen of te hoesten; denk bijvoorbeeld aan de COVID 19-infectie, een probleem waar we al lang mee te maken hebben en waarvan een van de belangrijkste overdrachtsbronnen de binnenlucht is. De verspreiding van dit virus en van andere virussen in een afgesloten ruimte is in wezen een probleem van de luchtkwaliteit: hoe meer de lucht "vervuild" is, hoe groter de concentratie van stoffen (speekseldruppeltjes en organische vloeistoffen van slijmvliezen) die mogelijk besmet zijn met ziekteverwekkers en de ziekte kunnen verspreiden. De oplossing om besmetting tegen te gaan is natuurlijk het toepassen van luchtverversing om de concentratie van deze ziekteverwekkers te verminderen. Maar wanneer moeten we dit doen, aangezien we zowel in de zomer als in de winter de neiging hebben om onze ramen gesloten te houden om het energieverbruik van airconditioning en verwarming te verminderen?


Welnu, in dit artikel presenteren we een eenvoudig apparaat dat, door het aflezen van een sensor van CO2 en TVOC (d.w.z. de concentratie van zwevende organische deeltjes in de lucht, in Italië ook bekend onder de afkorting VOC - Volatile Organic Compounds), ons een idee geeft van de luchtkwaliteit in een kamer en ons via LED's laat weten wanneer het tijd is om ventilatie in te zetten, zodat we de luchtkwaliteit onder controle kunnen houden en energieverliezen kunnen minimaliseren.


De hardware van het project

Om dit apparaat te realiseren, hebben we besloten om een Heltec WiFi kit 32 module te gebruiken als besturingseenheid, een SGP30 sensor van Sensirion als kooldioxide- en TVOC-concentratiedetectorelement en twee gewone LED's (een rode en de andere groene) als indicatoren. Het conceptschema van het systeem wordt voorgesteld in Figuur 1.

Figuur 1: Concept van een luchtkwaliteitmeting- en meldsysteem.

De Heltec WiFi Kit 32 module

De Heltec WiFi kit 32 module, die uiteindelijk het hart van ons systeem vormt, is een klein elektronisch board dat een ESP32 microcontroller en een 0,96 inch OLED display omvat; je kunt het in Figuur 2 bekijken. De hardware-eigenschappen van de WiFi kit 32 module, waarmee we in dit project zullen werken, zijn:

  • 0,96-inch blauw OLED-scherm;
  • 32-bits Dual-Core Tensilica LX6 microcontroller;
  • Klokfrequentie tot 240 MHz;
  • 520 kB intern SRAM;
  • 32 MB flashgeheugen;
  • Ingebouwde 802.11 b/g/n Wi-Fi transceiver;
  • Ingebouwde dual-mode Bluetooth (klassiek en BLE);
  • Voeding: 3,3 V tot 7 V;
  • 28 GPIO's (sommige worden gebruikt om het OLED-scherm te besturen);
  • Ingebouwde lithium-polymeer batterijlader;
  • Werktemperatuur: -40 °C tot +90 °C.


Deze module blijkt perfect te zijn voor ons doel, omdat hij al een OLED display bevat dat we zullen gebruiken voor het weergeven van luchtkwaliteitmetingen en voor notificaties, en ook verschillende GPIO kanalen die we nodig hebben om onze indicatoren aan te sturen; in deze eerste versie zijn we van plan om slechts 2 LED's te gebruiken, maar het aantal beschikbare GPIO's (28 in totaal) zou ons gemakkelijk in staat stellen om andere elementen toe te voegen, zoals een zoemer, om geluidssignalen te produceren. Naast deze eigenschappen heeft de module 520 kbytes RAM aan boord en maar liefst 32 Mbytes Flash, eigenschappen die ons een comfortabele hoeveelheid geheugen voor onze besturingssoftware bieden.

Figuur 2: De Heltec WiFi Kit 32 module.

Verder bevat de module een standaard 802.11 WiFi-transceiver, die we kunnen gebruiken voor toekomstige uitbreidingen van dit apparaat (bijvoorbeeld om gegevens over CO2- en TVOC-concentraties direct op een webpagina te publiceren of om meldingen via Telegram te versturen), en een Bluetooth-radio, die we kunnen gebruiken om te communiceren met externe apparaten, zoals smartphones en pc's, die we uiteindelijk kunnen gebruiken om het apparaat zelf te configureren. Tot slot bevat het board ook een ingebouwde LiPo lader, waarmee we een 1-cell batterij kunnen aansluiten, wat erg handig is om het apparaat van stroom te voorzien, zelfs als er geen netspanning is. Figuur 3 toont de pinout van onze module.

Figuur 3: De pinout van Wi-Fi kit 32 module.

De SGP30 sensor

Om de concentratie kooldioxide en TVOC in de lucht te bepalen, besloten we een breakout board te gebruiken met een SGP30 sensor van Sensirion. Met deze piepkleine sensor kunnen we de concentratie kooldioxide bepalen (om ons te vertellen hoe vies de lucht in een afgesloten ruimte is) en TVOC (Total Volatile Organic Compounds), d.w.z. de concentratie in delen per miljard van zwevende deeltjes. Figuur 4 toont een afbeelding van de breakout board. De gedetailleerde hardwarekenmerken van de breakout board zijn als volgt:

  • Sensor: Sensirion SGP30 (TVOC en CO2);
  • TVOC-detectie ( Total Volatile Organic Compounds): 0 tot 60.000 ppb (parts per billion);
  • CO2-detectie: 400 tot 60.000 ppm (parts per million);
  • Samplefrequentie: 1 Hz;
  • Interface: I2C (adres 0x58);
  • Voeding: 3,3 V of 5 V.
 
Figuur 4: Het breakout board voor de SGP30 sensor.

Aansluiten van de hardware

Laten we nu eens kijken hoe we ons apparaat in de praktijk kunnen realiseren, te beginnen met de fysieke constructie en vervolgens de bedrading van de componenten. De verbinding tussen het sensorboard en de LED's is eenvoudig, zo eenvoudig dat het gedaan kan worden door middel van male-female verbindingsdraden zoals die voor Arduino, of door gebruik te maken van een breadboard, zoals je op deze pagina's ziet. De SGP30 sensor is een breakout board met een I²C businterface, dus er zijn in totaal vier aansluitingen nodig omdat we naast de klok- (SCL) en datalijnen (SDA) van de I²C bus ook de twee voedingslijnen (GND en de positieve 3,3 V) moeten aansluiten.

Figuur 5: Algemeen bedradingsschema van de meter.

De twee LED's aan de andere kant worden aangestuurd via twee standaard GPIO's uit WiFi-module kit 32; deze LED's kunnen niet rechtstreeks worden aangestuurd vanaf de aansluitingen op de printplaat om overbelasting van de GPIO's te voorkomen, maar we moeten er passende stroombegrenzende weerstanden in serie mee schakelen, die we hebben berekend op 220 Ohm per stuk. Om het aansluiten te vergemakkelijken, zie je in Figuur 5 het aansluitschema dat je moet gebruiken als je de verschillende elementen met elkaar wilt verbinden via soldeerverbindingen of male-female aansluitdraden. Daarnaast toont Tabel 1 de verbindingen tussen de WiFi kit 32 module en de SGP30 breakout board. Tabel 2 toont de pinnen van de WiFi-kit 32-module die worden gebruikt voor de twee indicator-LED's.

Tabel 1: Aansluitingen tussen WiFi-kit 32 en SGP30 breakout.
Functie WiFi Kit 32 pin SGP30 Breakout pin
SDA 19 sda
SCL 18 scl
Ground GND GND
3.3 V 3V3 Vcc

 

Tabel 2: LED aansluitingen.
LED WiFi Kit 32 pin
Green 2
Red 17

 

Schrijven van de software

Na de details van de hardware van ons systeem te hebben bekeken, gaan we verder met de software. Voor de ontwikkeling van de besturingssoftware hebben we besloten MicroPython te gebruiken, en specifiek de port voor ESP32. MicroPython is een krachtig systeem voor softwareontwikkeling van toepassingen voor moderne, IoT-georiënteerde microcontrollers zoals de ESP32, en bovendien maakt de grote hoeveelheid bestaande bibliotheken voor het omgaan met sensoren, actuatoren en interfaces deze ontwikkelingsfase veel eenvoudiger.

Inschrijven
Schrijf u in voor tag alert e-mails over MicroPython!

MicroPython installatie

Om MicroPython op WiFi-kit 32 te gebruiken, moet je eerst de interpreter installeren, omdat WiFi-kit 32 die standaarduitrusting niet heeft. De versie die gebruikt is voor de ontwikkeling van deze applicatie is v1.19 (2022-06-18). Download de firmware en sla deze op in een map op je pc. Op dit punt moet je jezelf ook uitrusten met esptool, een tool die wordt gebruikt om het flashgeheugen van de ESP32 te beschrijven, gratis beschikbaar gesteld door Espressif (de fabrikant van de ESP32 en ESP8266). Op dit punt moet je het geheugen van het apparaat wissen en dan de MicroPython binary "flashen" (in het flashgeheugen laden).


Het geheugen wissen

Sluit eerst de WiFi kit 32 aan op je PC via een micro USB kabel. Het onderdeel moet worden gekoppeld aan een virtuele COM-poort (bijvoorbeeld COM3, maar het exacte COM-nummer hangt af van hoeveel poorten je al op je systeem hebt). Zet nu het board in programmeermodus door de PRG knop ingedrukt te houden en de RST knop in te drukken en los te laten. Nu hoef je alleen nog maar het esptool.py script te gebruiken om het geheugen te wissen. Je kunt het scriptpad in je systeempad zetten, of je kunt rechtstreeks vanuit die map werken en het geheugen wissen met het volgende commando (in een Windows-omgeving):


python esptool.py --port <port_numb> erase_flash


Vervang <port_numb> door de virtuele COM-poort die aan je apparaat is toegewezen (bijvoorbeeld COM3).


De MicroPython-interpreter flashen

Op dit punt kun je MicroPython flashen (in ESP32 moet de interpreter worden geflasht op adres 0x1000). Je kunt het volgende consolecommando gebruiken, opnieuw onder Windows:


python esptool.py --chip esp32 --port <port_numb> --baud 460800 write_flash -z 0x1000 esp32.bin


Vervang, zoals eerder, <port_numb> door de virtuele COM-poort die aan je apparaat is toegewezen en esp32.bin door de naam (en eventueel het pad, als dat niet hetzelfde is als waar je vandaan werkt) van de binary die je eerder hebt gedownload. Figuur 6 toont het resultaat van deze handeling.

Figuur 6: Uitvoer van de Windows console na het flashen van MicroPython.

Besturingssoftware

Op dit punt kunnen we verder gaan met het instellen van de besturingssoftware voor ons board. Zoals we al zeiden, willen we de gegevens voor CO2 en TVOC waarden verzamelen die worden geleverd door de SGP30 sensor, deze gegevens weergeven op het OLED scherm, de persoonlijke drempelwaarden voor CO2 grenswaarden (met bijbehorende hysteresis) uit het bestandssysteem lezen. Twee indicator-LED's (rood en groen) aansturen om aan te geven of het CO2-niveau boven de maximaal toegestane drempelwaarde is. Om deze software te installeren, hebben we eerst geschikte stuurprogramma's nodig om het OLED-display en de SGP30 sensor te kunnen aansturen. Gelukkig zijn beide stuurprogramma's beschikbaar, ontwikkeld door Adafruit. Je kunt ze downloaden via de volgende links:

 
Figuur 7: Software-architectuur.

Het architectuurdiagram van de software die we willen gaan gebruiken staat in Figuur 7. Het complete project resulteert dus in deze drie bestanden:

  • air_quality.py (hoofdbestand van de toepassing);
  • ssd1306.py (OLED-display stuurprogramma);
  • adafruit_sgp30.py (SGP30 sensor stuurprogramma).
Figuur 8: Poort configuratie van MicroPython voor ESP32 in Thonny.

Als ontwikkel-IDE voor deze toepassing gebruiken we Thonny, een van de meest gebruikte IDE's voor Python, waarmee zowel standaard Python als MicroPython toepassingen ontwikkeld kunnen worden. Thonny kan hier gratis worden gedownload. De interface met MicroPython is heel eenvoudig: nadat je de WiFi-kit 32-kaart hebt aangesloten op de USB-poort van de pc, open je Thonny en klik je op de rechteronderrand: in het vervolgkeuzemenu dat wordt geopend nadat je hebt geklikt, selecteer je uit de verschillende beschikbare interpreters ESP32, zoals weergegeven in Figuur 8. Als de interpreter niet aanwezig is, selecteer dan Configure Interpreter... en geef handmatig de te gebruiken interpreter en COM-poort op, zoals weergegeven in Figuur 9.

Figuur 9: Handmatig instellen van de interpreter en COM-poort in Thonny.


We gaan nu over naar de details van de toepassingssoftware, die volledig is opgenomen in het bestand air_quality.py, dat is onderverdeeld in twee verschillende fasen:

  • System setup
  • Main loop
 
// -------------------------------------------------
// - SYSTEM INIT
// -------------------------------------------------
// LEDs
led_green = Pin(2, Pin.OUT)
led_red = Pin(17, Pin.OUT)
led_green.on()
led_red.off()

// Initialize I2C buses
s_i2c = I2C(scl=Pin(18), sda=Pin(19), freq=100000)
d_i2c = SoftI2C(scl=Pin(15), sda=Pin(4), freq=100000)


// OLED enable pin
oled_sts = Pin(16, Pin.OUT)
oled_sts.on()


// OLED initialization
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, d_i2c)


// Air quality sensor init
sgp30 = adafruit_sgp30.Adafruit_SGP30(s_i2c)


// Initialize SGP-30 internal drift compensation algorithm.
sgp30.iaq_init()


// Wait 15 seconds for the SGP30 to properly initialize
user_message(‘Sensor Init...’)
time.sleep(SENS_INIT_DELAY_S)


// User threshold for LEDs indication
get_user_threshold()


// Sensor Calibration
get_sensor_baseline()


// Store the time at which last baseline has been saved
baseline_time = time.time()


De eerste fase vormt, zoals de naam al doet vermoeden, de initialisatiefase van het systeem, terwijl de tweede de main loop is waarin de metingen, het weergeven van de waarden op het OLED-scherm en de statusmelding via de LED's plaatsvinden. De eerste fase, waarvan de code in Listing 1 staat, is verantwoordelijk voor het initialiseren van alle randapparatuur in het systeem, zoals de LED's, de twee I²C bussen (de ene wordt gebruikt voor de verbinding met het OLED display, de andere voor het beheer van de SGP30 sensor) en voor het ophalen uit het bestandssysteem van de waarden van de basislijn van de SGP30 sensor en de door de gebruiker ingestelde CO2 drempel. Deze bestanden zijn tekstbestanden die de software verwacht te vinden in het bestandssysteem. Sensor basislijnwaarden zijn kalibratiewaarden die de meetnauwkeurigheid verbeteren en worden automatisch aangemaakt door de software als ze niet aanwezig zijn. Bestanden met de alarmdrempel voor de CO2 waarde moeten daarentegen door de gebruiker worden aangemaakt en als ze niet aanwezig zijn, worden standaardwaarden geladen. De volgende twee bestanden moeten worden aangemaakt om deze drempelwaarde in te stellen:

  • co2eq_th.txt = bevat de alarmwaarde van de CO2 meting, in ppm (parts per million);
  • hist_th.txt = bevat de hysteresis van de vorige drempelwaarde, ook hier in ppm.
 
Figuur 10: Toegang tot het geheugen van het apparaat vanuit Thonny.

Het maken van deze bestanden is eenvoudig: selecteer in Thonny, met het board aangesloten via USB, het bestandspictogram of File > New. Herhaal dit twee keer om twee bestanden te maken en schrijf de waarden erin (bijvoorbeeld 450 in het co2eq_th.txt bestand en 10 in het hist_th.txt bestand, zodat je een drempelwaarde hebt van 450 ppm CO2 en een hysteresis van 10 ppm). Klik nu op het diskettepictogram (of selecteer File > Save) en selecteer in het pop-upvenster dat verschijnt Micropython Device, zoals getoond in Figuur 10. Hiermee krijg je toegang tot het bestandssysteem van het apparaat en kun je de bestanden opslaan die je eerder hebt gemaakt. Hiermee kun je de CO2 drempelwaarde van de zaak instellen. Zodra de initialisatiefase is voltooid, schakelt de software over naar de main loop, weergegeven in Listing 2.

// ------------------------------------------------
// - MAIN LOOP
// ------------------------------------------------
while True:
    // Get CO2 and TVOC data
    co2eq, tvoc = sgp30.iaq_measure()
    
    // Print values on Display
    oled_data(co2eq, tvoc)
    
    // Manage LEDs
    if (co2eq > co2eq_th):
        led_green.off()
        led_red.on()
    elif (co2eq < (co2eq_th - hysteresis)):
        led_green.on()
        led_red.off()        
    
    // Update sensor baseline
    update_sensor_baseline()

   
// Wait for the new sampling time
    time.sleep(SAMPLING_TIME_S)


Hier worden achtereenvolgens de volgende bewerkingen uitgevoerd. Via een iaq_measure() functie van de adafruit_sgp30 bibliotheek (sgp30_iaq_measure()) worden de CO2 en TVOC waarden verkregen en opgeslagen in respectievelijk de twee variabelen co2eq en tvoc. Op dit punt, in de volgende regel, worden de waarden op de OLED-display weergegeven via de functie oled_data(). Vervolgens wordt via een serie if...elif statements de LED signalering afgehandeld. Als de waarde die is opgeslagen in de co2eq variabele groter is dan de drempelwaarde co2eq_th, die door de gebruiker is ingesteld, dan worden de rode LED's ingeschakeld en de groene LED's uitgeschakeld; anders, als de waarde kleiner is dan de drempelwaarde minus de hysteresis (co2eq_th - hysteresis), dan wordt de rode LED uitgeschakeld en de groene LED ingeschakeld. Nadat deze fase is voltooid, wordt de functie update_sensor_baseline() aangeroepen om de basislijn van de sensor bij te werken.

 

Om een optimale werking van de sensor te garanderen, werkt de software de basislijn de eerste keer bij na 12 uur in bedrijf en daarna elk uur, zoals aangegeven in het datasheet van de fabrikant van de SGP30. Op dit punt pauzeert de loop 60 seconden voordat opnieuw een data-acquisitiecyclus wordt uitgevoerd. Het complete softwareproject van deze toepassing, compleet met beschrijving en alle benodigde MicroPython bibliotheken, kan worden gedownload van de betreffende GitHub repository.

 

Om de software te testen, moet je de twee bestanden met de stuurprogramma's opslaan in het geheugen van de WiFi kit 32 card, volgens dezelfde procedure als geïllustreerd voor het opslaan van de gebruikersbestanden, waarbij je erop moet letten dat je dezelfde bestandsnamen aanhoudt en de extensie .py niet vergeet. Het hoofdbestand kan direct vanuit Thonny worden uitgevoerd of worden opgeslagen in het geheugen van het apparaat door het te hernoemen naar main.py. Dit is noodzakelijk als je het apparaat in standalone modus wilt gebruiken, d.w.z. niet aangesloten op de PC (het main.py bestand is het bestand dat automatisch wordt doorzocht door de MicroPython interpreter bij het opstarten). Een afbeelding van het apparaat bedraad op een breadboard terwijl het gegevens over de luchtkwaliteit verzamelt en de LED's activeert is weergegeven in Figuur 11.

Figuur 11: Het prototype, aangesloten op een breadboard om te testen.

Configuratie

De software heeft ook een aantal configuratieopties die door de gebruiker kunnen worden aangepast, allemaal te vinden in het bestand air_quality.py. Het is met name mogelijk om


a. de standaardwaarden van de CO2-alarmdrempel en de hysteresis te wijzigen door de twee parameters co2eq_th en hysteresis te wijzigen, die standaard zijn ingesteld op 450 en 10, zoals weergegeven in Listing 3 (voor het wijzigen van de standaardwaarden hoeven de waarden van deze twee parameters niet te worden opgeslagen in het bestandssysteem);

b. de initiële wachttijd voor sensorstabilisatie en de bemonsteringstijd (SENS_INIT_DELAY_S and SAMPLING_TIME_S) wijzigen, die standaard zijn ingesteld op 15 en 60 seconden, zoals ook weergegeven in Listing 3 (we raden echter aan deze instellingen niet te wijzigen).

-------------------------------
// - USER TH DEFAULT VALUES
-------------------------------
co2eq_th = 450
hysteresis = 10
-------------------------------
// - TIMING CONST
// -------------------------------
SAMPLING_TIME_S = 60
SENS_INIT_DELAY_S = 15


Samenvatting…

In dit artikel hebben we in detail de implementatie van een apparaat voor het observeren van de luchtkwaliteit beschreven. Door het uitlezen van een luchtkwaliteitssensor (SGP30) kan het CO2- en TVOC-concentraties op een display weergeven. Bovendien kan het door het uitlezen van een gebruikersbestand met de tolerantiedrempel voor de CO2-concentratie een visueel signaal geven via een LED om een luchtverversing in de ruimte in werking te stellen. Gezien de vele aanvullende randapparaten in het gebruikte platform is het mogelijk om dit apparaat uit te breiden met IoT-functionaliteit, zoals een webpagina waarmee gegevens op afstand kunnen worden geraadpleegd en waarschuwingen via e-mail of telegram kunnen worden verstuurd.


Componentenlijst

Modules

  • 1 × Heltec WiFi Kit 32
  • 1 × Sensirion SGP30

LED

  • 1 × Rood, 5 mm, hoge helderheid
  • 1 × Groen, 5 mm, hoge helderheid

Weerstanden

  • 2 × 220 Ω, 0.25 W, 5%

Opmerkingen van de redactie: Dit project verscheen oorspronkelijk in Elettronica IN
 




Vertaling: Hans Adams