CO2 meter met Grove / Arduino
RadioLab ** February 14th, 2022 by wim.webgang **CO2 meter
Wie in de corona-tijd zelf aan de slag ging om een CO2 meter te maken is niet noodzakelijk goedkoper af dan wie een kant en klaar toestel koopt. Maar als je een basis van componenten hebt liggen, bv in je hackerspace, dan kan je met een Grove CO2-sensor snel iets in elkaar steken.
Hardware
Seed Studio Grove CO2 temperature humidity sensor, range (values 0-40.000 ppm), accuracy 400ppm to 10′000ppm.
Gebruikt NDIR* om CO2 concentratie te meten (nauwkeurigheid 30 ppm +3%), en bevat hoge precisie temperatuur en vochtigheidssensor
* Non-Dispersive Infrared
De module gebruikt intern een SCD30 niet-dispersieve infraroodsensor (van Sensirion) om de CO2 te meten uit binnengezogen lucht. Het is een eenvoudige spectroscoop: het licht wordt door de lucht geleid en de breking wordt gemeten. Hij meet in principe 400-10.000 PPM.
Er zit (ongevraagd) een temperatuur en vochtsensor bij ingebouwd, herkenbaar aan de T/H letters bij de opening. (Mogelijk omdat die die nodig zijn om de interpretatie van de meting te doen.)
Met een kabel sluit je het sensorbord aan op de I2C interface van de Arduino, eventueel via een base bord op één van de I2C aansluitingen.
Er zijn vier pinnen bij de grove kabels: de typische GND en VCC (ground zwart en +5/+3 volt rood), en twee I2C signalen: de data (SDA wit) en de clock (SCL geel).
Ik gebruikte de Arduino Sensor kit base board, voorzien van een Arduino. Daardoor heb ik ook onmiddellijk uitvoer beschikbaar als led, OLED scherm, beeper enz.
Arduino IDE
De Arduino IDE bestaat voor vele besturingssystemen, ook voor vele Linuxen. Om toegang te krijgen tot de seriele apparaten (usb) moet de gebruiker lid zijn van de group dialout en lock:
usermod -a -G dialout,lock webgang
(vroeger ook nog uucp maar dat zie ik nu niet meer).
Uitloggen en terug inloggen, en dan kan die gebruiker aan de slag met de juiste rechten. Zoniet probeer als root of met sudo
.
De IDE is een java programma, dus heeft nogal wat andere afhankelijkheden, en doet soms raar. Bv als je een bestand opent gaat dat telkens in een nieuw venster. En als je een bestand wil bewaren, krijg je niet je vertrouwde bestandbeheerder, je geeft een naam en drukt op “enter”, maar raakt de toets ernaast ook, zodat aan je bestandsnaam een “mu” teken komt te staan op het eind: Webgang-CO2-meter.inoµ
; de omgeving merkt fijntjes op dat dat teken niet toegelaten is met een venser met een “ok” knop, maar die krijg je niet weggeklikt (ook logisch, eigenlijk zou er “Cancel” moeten voorkomen). De IDE zit vast en je moet hem afsluiten.
SCD30
Het was even zoeken naar de sensor software, want die zit niet standaard in de Arduino omgeving;
https://github.com/Seeed-Studio/Seeed_SCD30
Code, Download de zip. Bewaar bestand. Het heet bv: Seeed_SCD30-master.zip
.
Zet het waar je het wil bewaren, bv /home/mijngebruiker/Arduino/downloadLibs
Ga in je Arduino omgeving, Sketch, Include Library, Add .ZIP library...
Daarna krijg ik onderaan (bijna onleesbaar door de donkere kleuren):
Library added to your libraries. Check 'include library' menu.
Nu zou je ze moeten terugvinden in de menu’s als example en library.
Sketch, Include Library, Grove_scd30_co2_sensor
File, Examples, Grove_scd30_co2-sensor
SCD30_Example laden, check, upload sketch.
Open de seriele monitor. Ik kreeg allerlei onleesbare brol te zien (vol omgekeerde vraagtekens en zo) maar als ik de “Show timestamp” aanvinkte, was die datum/tijd alvast leesbaar. Ik zag dat de snelheid van de seriële monitor verschillend was van die in de code, en zette hem ook op 115200 baud. Op slag was alles leesbaar.
Meten
De temperatuur werd als 29.25 °C gegeven, wat me nogal warm leek, in de kamer is het ten hoogste 20 °C. Maar misschien heeft de spot die op mijn tafel schijnt er iets mee te maken, of de interne warmte van het meettoestel. Nadat ik hem uitdoe zakt de temperatuur een graadje.
De vochtigheid werd als 29.82% weergegeven (heb ik niet direct referentie voor – hoewel: een vochtmeter zit in de Arduino Sensor Kit).
De concentratie werd boven 1000 ppm gegeven, bv
Carbon Dioxide Concentration is: 1091.55 ppm.
Dat leek me ook overdreven veel, ik zit hier alleen in mijn buro.
Ik zet ter controle even een aparte meter ernaast, en inderdaad, binnen een halve minuut gaat die in alarm.
Ik verlaat even de kamer en laat de deur openstaan, en zal daarna met ingehouden adem binnenspurten … De waarden zijn gezakt. Ze verschillen iets tussen de twee meters, maar de essentie klopt..
De sensor heeft de i2c bus nodig, en dus kan ik die niet* gebruiken om de gegevens op het scherm te zetten; ze zijn afleesbaar op de seriële console als pc aangesloten is.
Voor de i2c bus wordt aangesproken kan je bv wel de naam en het versienummer weergeven; dat blijft staan, maar vanaf de sensorwaarde wordt uitgelezen, komt er niets nieuws meer op het scherm.
Geen probleem, dit is radio, dus ik gebruik als uitvoer nu de led+luidsprekertje.
Adres
(*) of misschien wel; mogelijk heeft het iets te maken met de i2c id?
Ik ontdek op de achterkant van het CO2 sensorbord onder de naam een piepklein stukje tekst.
Met het vergrootglas bekeken of gefotografeerd en vergroot komt hetvolgende tevoorschijn:
I2C Addr: 0×61
In de documentatie van Grove OLED display (waarnaar ze verwijzen van bij Arduino), vind ik ook een waarde:
I2C Address 0x3C
, elders vind ik een bord dat zelfs een selectie aanbied voor ht I2C adres: 0×7A en 0×7B
Best is dus zelf te detecteren..?
BUG
Of is het gewoon een BUG? https://arduino.stackexchange.com/questions/80875/grove-base-kit-multiple-i2c-connection
In januari meldt iemand op stackexchange dat er na een fout is binnengeslopen in de gewijzigde i2c code van de Arduino_SensorKit Library
(vanaf versie 1.0.6; de vorige 1.0.5 werkte op een andere manier met i2c).
De fout zou zitten in de “instanciation of the Oled object”. Een toekomstige update zou het moeten oplossen, maar ondertussen …
Je kan het omzeilen; je moet er rechtstreeks even een andere maken:
#include "Arduino_SensorKit.h"
U8X8_SSD1306_128X64_NONAME_HW_I2C Oled2
En die dan initialiseren en gebruiken;
Oled2.begin();
Oled2.setFlipMode(true);
Oled2.setFont(u8x8_font_7x14B_1x2_r);
De reaktie daarop was positief:
t works! OLED just keeps blinking but it shows the output now! The blinking could be fixed by changing Oled2.clear() to Oled2.refreshDisplay()
Op onze configuratie werkt het zelfs zonder veranderen van de clear()…
Code
zie gitlab “sensorkit audiotest” … enz
1-LED-TO-Buzzer.txt
2-Button-TO-Buzzer.txt
3-PotMeter-TO-Buzzer.txt
5-LichtSensor-TO-Buzzer.txt
6-Micro-TO-Buzzer.txt
9-Accelero-TO-Buzzer.txt
9-Accelero-TO-Buzzer0.txt
README.md
WebgangCO2meter-004.txt Beep for measure, beep and led when exceeding 925ppm
Links
gitlab.com/webgang-arduino/sensorkit-audiotest.
https://www.seeedstudio.com/Grove-CO2-Temperature-Humidity-Sensor-SCD30-p-2911.html
https://wiki.seeedstudio.com/Grove-CO2_Temperature_Humidity_Sensor-SCD30/
https://wiki.seeedstudio.com/Sensor_gas/
https://www.hackster.io/SeeedStudio/air-quality-sensor-hub-seeeduino-xiao-expansion-board-b23399
https://www.hackster.io/kehosoftware/co2-monitoring-with-wioterminal-c4b4cd
https://github.com/Seeed-Studio/Seeed_SCD30
Een volledig uitgewerkt model: https://www.hackster.io/SeeedStudio/indoor-hand-held-co2-detector-for-covid-19-purpose-0c8185