Aquest sensor està destinat a mesurar la concentració de compostos orgànics volàtils (COV). El sensor, de fet, mesura les concentracions en brut de compostos orgànics volàtils i la d'hidrògen i, a partir d'elles, calcula la concentració total de COV (TCOV) i la concentració equivalent de CO2 (e-CO2). Així, doncs, la concentració de CO2 que ens proporciona no és acurada.
[AF]El sensor es connecta amb quatre fils: els d'alimentació (positiu, VIN, i negatiu, GND) que connectarem a l'alimentació de 3,3 V (VCC) i dos de comunicació i2c (SCL i SDA) que connectarem a les potes corresponents del microcontrolador.
El següent programa ens permet obtenir les lectures en brut del sensor i les lectures calculades de TCOV i e-CO2.
#include <Wire.h> #include "Adafruit_SGP30.h"
int compta = 0; uint16_t TCOV_base, eCO2_base; Adafruit_SGP30 sensor;
void setup() {
Serial.begin(9600);
if (! sensor.begin()){ // Mira si troba el sensor
Serial.println("Sensor no trobat!");
while (1);
}
}
void loop() {
if (sensor.IAQmeasure() && sensor.IAQmeasureRaw()) {
Serial.println("Lectures en brut:");
Serial.print("Hidrogen: ");
Serial.println(sensor.rawH2);
Serial.print("Etanol: ");
Serial.println(sensor.rawEthanol);
Serial.println();
Serial.println("Lectures calculades:");
Serial.print("TCOV: ");
Serial.print(sensor.TVOC);
Serial.println(" parts per mil milions");
Serial.print("e-CO2: ");
Serial.print(sensor.eCO2);
Serial.println(" parts per milio");
Serial.println("-------------------------------");
}else{
Serial.println("Ha fallat la lectura!");
return;
}
delay(1000);
compta++;
if (compta >= 30) {
compta = 0;
if (! sensor.getIAQBaseline(&eCO2_base, &TCOV_base)) {
Serial.println("Ha fallat la lectura de valors base");
return;
}
Serial.println("Valors base: ");
Serial.print("e-CO2: 0x");
Serial.println(eCO2_base, HEX);
Serial.print("TCOV: 0x");
Serial.println(TCOV_base, HEX);
Serial.println("-------------------------------");
}
}
És una mica complicat el funcionament detallat del sensor. Aquí en farem un resum i podeu consultar informació més detallada a la pàgina d'Adafruit. Per un costat, el sensor funciona a partir d'una placa d'òxid d'estany calenta. Això implica que les primeres lectures seran dels valors mínims dels rangs (400 parts per milió de CO2 equivalent i 0 parts per mil milions en el cas del TCOV). Passat el primer minut ja hauríem de tenir lectures diferents. Podem veure com canvien les lectures acostant algun element que desprengui compostos orgànics volàtils com el pinzell del corrector líquid o un cotó mullat amb esperit de vi (alcohol etílic) o líquid per treure l'esmalt d'ungles (basat en acetona). És important tenir present que és un sensor de gas i, per tant, no s'ha de mullar el sensor.
D'altra banda, el sensor necessita tenir uns valors de línia base com a referència. El programa contempla l'actualització dels valors de la línia base cada trenta lectures del sensor. La funció getIAQBaseline s'encarrega de determinar els valors base a partir de les millors lectures prèvies. Per obtenir unes bones lectures cal deixar que el sensor mesuri en l'aire exterior durant uns deu minuts. En una aplicació acabada seria convenient guardar els valors de línia base (per exemple a la memòria EEPROM) i tornar-los a carregar quan es posa en marxa el microcontrolador. Per fer-ho, podríem fer servir aquesta instrucció:
sensor.setIAQBaseline(eCO2_base, TCOV_base);
Per fer proves, però, és suficient mantenir el programa com està.
Si tenim un sensor de temperatura i humitat podem millorar les mesures del sensor indicant-li la humitat absoluta. Això ho farem en el proper programa, on calcularem la humitat absoluta a partir de la relativa i la temperatura. El programa fa servir la següent equació, que correspon a un mètode simplificat. Atès que l'equació dóna el resultat en grams i la funció requereix el valor en mil·ligrams caldrà multiplicar el resultat per mil. Les lletres f que apareixen en la funció que calcula la humitat relativa serveixen per indicar que volem que el valor introduït es guardi com a float. De manera similar, hi ha un static_cast<uint32_t> que força la conversió al tipus de variable uint32_t.

#include <Wire.h> #include "Adafruit_SGP30.h" #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22
int compta = 0; uint16_t TCOV_base, eCO2_base; Adafruit_SGP30 sensor; DHT dht(DHTPIN, DHTTYPE);
uint32_t getHA(float temp, float hum) {
const float HA = 216.7f * ((hum / 100.0f) * 6.112f * exp((17.62f * temp) / (243.12f + temp)) / (273.15f + temp));
const uint32_t HAmg = static_cast<uint32_t>(1000.0f * HA); // Convertim a mg/m3
return HAmg;
}
void setup() {
Serial.begin(9600);
dht.begin();
if (! sensor.begin()){ // Mira si troba el sensor
Serial.println("Sensor no trobat!");
while (1);
}
}
void loop() {
float humit = dht.readHumidity();
float temper = dht.readTemperature();
if (!(isnan(humit) || isnan(temper))) {
sensor.setHumidity(getHA(temper, humit));
}
if (sensor.IAQmeasure() && sensor.IAQmeasureRaw()) {
Serial.println("Lectures en brut:");
Serial.print("Hidrogen: ");
Serial.println(sensor.rawH2);
Serial.print("Etanol: ");
Serial.println(sensor.rawEthanol);
Serial.println();
Serial.println("Lectures calculades:");
Serial.print("TCOV: ");
Serial.print(sensor.TVOC);
Serial.println(" parts per mil milions");
Serial.print("e-CO2: ");
Serial.print(sensor.eCO2);
Serial.println(" parts per milio");
Serial.println("-------------------------------");
}else{
Serial.println("Ha fallat la lectura!");
return;
}
delay(1000);
compta++;
if (compta >= 30) {
compta = 0;
if (! sensor.getIAQBaseline(&eCO2_base, &TCOV_base)) {
Serial.println("Ha fallat la lectura de valors base");
return;
}
Serial.println("Valors base: ");
Serial.print("e-CO2: 0x");
Serial.println(eCO2_base, HEX);
Serial.print("TCOV: 0x");
Serial.println(TCOV_base, HEX);
Serial.println("-------------------------------");
}
}
En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.