Ostatnio obserwuje się szczególne wzmożone zainteresowanie czujnikami CO2, ponieważ są one kluczowym składnikiem systemów monitorowania jakości powietrza w naszym otoczeniu. Zwiększone stężenie CO2 w naszym otoczeniu sprawia, że stajemy się senni i zmęczeni. Dlatego wietrzenie pomieszczeń pomaga nam obudzić się. Kiedy jednak otworzyć okno? Ten sprytny sensor pozwoli szybko sprawdzić, czy poziom dwutlenku węgla w powietrzu przekroczył ustalony poziom.
Oprócz monitorowania jakości powietrza, opisany sensor jest również przydatny w zapobieganiu rozprzestrzeniania się koronawirusa i innych chorób zakaźnych. Wirusy i bakterie są przenoszone głównie przez aerozole, dlatego ważne jest zapewnienie dobrej wentylacji w pomieszczeniach. Dwutlenek węgla jest wydychany razem z aerozolami, stężenie tych substancji jest ze sobą ściśle skorelowane, a czujnik CO2 może być zastosowany do wskazania, kiedy należy otworzyć okno, aby wpuścić świeże powietrze do pomieszczenia.
„W moim miejscu pracy używamy również czujników CO2 do monitorowania jakości powietrza, aby pomóc złagodzić rozprzestrzenianie się koronawirusa. Firma, w której pracuję, zaprojektowała nawet własny SHIELD z czujnikiem CO2 dla Arduino UNO i rozdano nieobsadzone płytki PCB za darmo wszystkim zainteresowanym zbudowaniem własnego czujnika. To zainspirowało mnie do zbudowania własnej wersji czujnika CO2 z zastosowaniem czujnika SCD30” – pisze o projekcie jego autor.
Sensor SCD30 jest stosunkowo dużym sensorem, w porównaniu z niektórymi innymi czujnikami gazów, ponieważ jest to tzw. niedyspersyjny czujnik pracujący w podczerwieni (NDIR). Mierzy on absorpcję określonych długości fal światła charakterystycznych dla cząsteczek gazu w otaczającym powietrzu. Ma to tę zaletę, że mierzy tylko poziom CO2 w przeciwieństwie do czujników chemicznych, które są również wrażliwe na inne gazy.
Celem tego projektu było użycie minimalnej ilości komponentów przy zachowaniu zaawansowanej funkcjonalności. Zaprezentowany czujnik CO2 oferuje następujące funkcje:
- proste wyświetlanie stężenia CO2 w powietrzu za pomocą wykresu słupkowego na diodach LED;
- odczyt i rejestrację danych o stężeniu dwutlenku węgla, wilgotności względnej i temperatury za pomocą aplikacji na smartfonie (aplikacja dostarczana jest przez producenta sensora CO2, firmę Sensirion).
Potrzebne elementy
Do zbudowania systemu potrzebne są następujące komponenty:
- czujnik CO2 z wbudowanym termometrem i czujnikiem wilgotności względnej typu SCD30;
- moduł z mikrokontrolerem ESP32 typu NodeMCU;
- 10-segmentowy wyświetlacz z diodami LED w kolorze niebieskim, zielonym, żółtym i czerwonym (np. KYX-B10BGYR – fotografia 1) lub dowolny inny bargraf LED-owy;
- 10 sztuk oporników SMD w obudowach 0805 o rezystancji dopasowanej do diod LED wyświetlacza (w przypadku pokazanego wyświetlacza są to rezystancje od 300 Ω do 1 kΩ, zależnie od koloru);
- płytka drukowana (fotografia 2), zaprojektowana przez autora projektu (pliki projektowe znajdują się w repozytorium na GitHubie);
- obudowa drukowana w technice 3D (pliki STL znajdują się w repozytorium na GitHubie);
- cztery śruby M2×20 mm do skręcenia obudowy.
Płytka drukowana
Pokazana na fotografii 2 płytka drukowana jest podstawą tego minimalistycznego systemu.
Z wyjątkiem rezystorów diod LED, wszystkie elementy są montowane przelotowo. Bargraf LED należy umieścić z przodu, tak aby oznaczenie modelu z boku było skierowane w dół. Z tyłu zamontowano z kolei moduł ESP32 i czujnik SCD30 (fotografia 3). W przypadku SCD30 zaleca się pozostawienie niewielkiej odległości między czujnikiem a płytką drukowaną, co można osiągnąć wkładając np. monetę między czujnik a płytkę, jako przekładkę na czas lutowania.
Pola lutownice rezystorów SMD są łatwe nawet dla ręcznego lutowania – zastosowano specjalnie powiększone pola. Pokazana na fotografiach wersja systemu to jeszcze prototyp – autor musiał użyć kilku dodatkowych przewodów z powodu błędu projektowego, ale zostało to poprawione w plikach PCB, znajdujących się w repozytorium na GitHubie. Po zmontowaniu systemu – wlutowaniu oporników, a następnie wyświetlacza, sensora i modułu z mikrokontrolerem, układ można zamknąć w obudowie.
Obudowa
Obudowa czujnika została zaprojektowana w programie Fusion 360. Jest bardzo prosta – to zwykły prostokąt z zaokrąglonymi rogami oraz wycięciami dla sensora (kratki po boku) oraz wyświetlacza LED i portu zasilania modułu NodeMCU. Autor wydrukował obudowę w 3D, używając zielonego tworzywa PETG.
Obudowa składa się z dwóch połówek, które są razem połączone za pomocą czterech śrub M2 o długości 20 mm. Po skręceniu obudowy w czterech miejscach urządzenie jest, w zasadzie, gotowe, wystarczy je tylko zaprogramować.
Oprogramowanie
Na listingu 1 został pokazany najistotniejszy fragment kod źródłowego programu. Jest to prosty szkic Arduino, który obsługuje sensor dwutlenku węgla, wyświetlacz oraz połączenie bezprzewodowe do komunikacji z oprogramowaniem kolekcjonującym pomiary z czujnika.
#include "esp_timer.h"
#include <Wire.h>
#include "SCD30.h"
#include "Sensirion_GadgetBle_Lib.h"
#define SDA_pin 21 // Pin SDA układu SCD30
#define SCL_pin 22 // Pin SCL układu SCD30
// Piny wyświetlacza LED
#define LED1 15
#define LED2 13
#define LED3 12
#define LED4 14
#define LED5 27
#define LED6 26
#define LED7 25
#define LED8 33
#define LED9 32
#define LED10 23
static int64_t lastMmntTime = 0;
static int startCheckingAfterUs = 1900000;
GadgetBle gadgetBle = GadgetBle(GadgetBle::DataType::T_RH_CO2);
void allLEDsOff() {
digitalWrite(LED1, LOW);
//...
digitalWrite(LED10, LOW);
}
void allLEDsOn() {
digitalWrite(LED1, HIGH);
//...
digitalWrite(LED10, HIGH);
}
void lightBarGraph(uint8_t N) {
switch(N) {
case 1:
digitalWrite(LED1, HIGH);
break;
case 2:
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
break;
//...
case 10: // Zapal wszystkie diody i mrugaj
allLEDsOn();
delay(200);
allLEDsOff();
delay(200);
allLEDsOn();
delay(200);
allLEDsOff();
delay(200);
allLEDsOn();
break;
}
}
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);
pinMode(LED9, OUTPUT);
pinMode(LED10, OUTPUT);
allLEDsOff();
Serial.begin(115200);
delay(100);
gadgetBle.begin(); // Inicjalizacja biblioteki GadgetBle
Serial.print("Sensirion GadgetBle Lib initialized with deviceId = ");
Serial.println(gadgetBle.getDeviceIdString());
Wire.begin(SDA_pin, SCL_pin); // Inicjalizacja drivera SCD30
scd30.initialize();
scd30.setAutoSelfCalibration(1);
scd30.setTemperatureOffset(3);
}
void loop() {
float result[3] = {0};
if (esp_timer_get_time() - lastMmntTime >= startCheckingAfterUs) {
if (scd30.isAvailable()) {
scd30.getCarbonDioxideConcentration(result);
gadgetBle.writeCO2(result[0]);
gadgetBle.writeTemperature(result[1]);
gadgetBle.writeHumidity(result[2]);
gadgetBle.commit();
lastMmntTime = esp_timer_get_time();
uint8_t N; // Wyświetlanie poziomi CO2
// poziom 400-1000ppm: zielone diody LED (1-5)
if(result[0]<1000) {
N = constrain(map(result[0],400,1000,1,5),1,5);
}
// poziom 1000-1600ppm: żółte diody LED (6-8)
else if(result[0]<1600) {
N = constrain(map(result[0],1000,1600,6,8),6,8);
}
// poziom powyżej 1600ppm: czerwone diody LED (9-10)
else {
N = constrain(map(result[0],1600,5000,9,10),9,10);
}
allLEDsOff();
lightBarGraph(N);
Serial.print("CO2[ppm]:");
Serial.print(result[0]);
Serial.print("\t");
Serial.print("Temperature[℃]:");
Serial.print(result[1]);
Serial.print("\t");
Serial.print("Humidity[%]:");
Serial.println(result[2]);
Serial.print("LED bargraph value: "); Serial.println(N);
}
}
gadgetBle.handleEvents();
delay(3);
}
System korzysta z dwóch zewnętrznych bibliotek, które nie znajdują się w standardowym ekosystemie Arduino – biblioteka Sensirion BLE, obsługująca komunikację poprzez Bluetooth Low Energy z aplikacją, którą można pobrać z repozytorium Sensiriona, oraz biblioteka Seeed Studio do obsługi sensora SCD30, która jest dostępna w repozytorium Seeed Studio. Oba repozytoria znajdują się na GitHubie (linki na końcu artykułu).
Sensor SCD30 podłączony jest do mikrokontrolera poprzez interfejs I2C, do pinów 21 (SDA) oraz 22 (SCL). Program działa w pętli sterowanej czasowo. Po upływie określonego czasu sprawdza on, czy jest dostępny nowy pomiar SCD30. Jeśli tak, pobiera go i ustawia odpowiednie stany na diodach LED.
Nikodem Czechowski, EP
Źródła
https://bit.ly/3nTTOfK
https://bit.ly/3nSB4gp
https://bit.ly/3AvQpH8
https://bit.ly/3CwZVuu