Skip to main content

Corrección para medición SGP41(raw) dependiente de humedad y temperatura

Descripción general (Cómo comencé con este proyecto)

Primero leí la documentación de Grove - Smart Air Quality Sensor (SGP41) y Grove - AHT20 I2C Industrial Grade Temperature&Humidity Sensor.

Según la Hoja de datos SGP41 (PDF) sección 3.2 (Medición de Señal Raw), la medición del SGP41 depende de la humedad y temperatura, por lo que necesitamos aplicar una corrección para obtener datos consistentes: leer la humedad relativa y temperatura del AHT20 (u otro sensor), calcular los ticks y pasarlos a la función sgp41_measure_raw_signals.

Prueba Teórica

La Tabla 11 (Descripción del comando de medición I2C) en la página 15 describe las fórmulas para calcular los ticks:

RHticks = RH% × 65535 / 100
Tticks = (T°C + 45) × 65535 / 175

Verifica usando los valores predeterminados de 25°C y 50% de humedad relativa:

50 × 65535 / 100 = 32767.5 = 0x8000 (hexadecimal, rounded up)
(25 + 45) × 65535 / 175 = 26214 = 0x6666 (hexadecimal)

Los resultados coinciden con las constantes utilizadas en el programa usado por Grove - Smart Air Quality Sensor (SGP41) y definidas en la Tabla 11 de la SGP41 Datasheet (PDF).

Lo mismo en c:

        int h_ticks = humi * 0xFFFF;
int t_ticks = (temp + 45) * 0xFFFF / 175;

Tenga en cuenta que 'humi' en el programa es un valor entre 0 y 1, por lo que se eliminaron la división por 100 y la multiplicación anterior.

Preparación del Hardware

Estoy usando Seeeduino Nano como placa de control y usando Grove - Smart Air Quality Sensor (SGP41) y Grove - AHT20 I2C Industrial Grade Temperature&Humidity Sensor para hacerlo posible.

Seeeduino NanoGrove - AHT20 Temperature&Humidity SensorGrove - Smart Air Quality Sensor (SGP41)Grove - Branch Cable

Preparación del Software

Arduino IDE

Hay múltiples librerías que son requeridas y se presentan en el siguiente paso.

Comenzando

note

Si esta es la primera vez que trabajas con Arduino, te recomendamos encarecidamente que veas Comenzando con Arduino antes de empezar.

1. Conectar con Arduino Nano

note

Por favor conecta el cable USB con cuidado, de lo contrario puedes dañar el puerto. Por favor usa el cable USB con 4 cables en el interior, el cable de 2 cables no puede transferir datos. Si no estás seguro sobre el cable que tienes, puedes hacer clic aquí para comprar

  • Paso 1. Conecta el Cable Ramificado Grove al puerto I2C del Seeeduino Nano.

  • Paso 2. Conecta el Cable Ramificado Grove al módulo sensor I2C Grove AHT20.

  • Paso 3. Conecta el Cable Ramificado Grove al módulo sensor I2C Grove SGP41.

  • Paso 4. Conecta el Seeeduino a una PC mediante un cable USB.

Seeeduino_SGP41_AHT20

2. Descargar las librerías requeridas y añadirlas a Arduino

3. Subir el Código y verificar el resultado

  • Paso 1. Sube la demostración. Si no sabes cómo subir el código, por favor revisa Cómo subir código.
// ARDUINO DEMO FOR GROVE-AHT20+SGP41
//
#include <Wire.h>
#include "AHT20.h"
#include <Arduino.h>
#include <SensirionI2CSgp41.h>

SensirionI2CSgp41 sgp41;

// time in seconds needed for NOx conditioning
uint16_t conditioning_s = 10;

AHT20 AHT;

void setup() {
Serial.begin(115200);
while (!Serial) {
delay(100);
}

Wire.begin();

uint16_t error;
char errorMessage[256];

sgp41.begin(Wire);

uint16_t serialNumber[3];
uint8_t serialNumberSize = 3;

error = sgp41.getSerialNumber(serialNumber, serialNumberSize);

if (error) {
Serial.print("Error trying to execute getSerialNumber(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("SerialNumber:");
Serial.print("0x");
for (size_t i = 0; i < serialNumberSize; i++) {
uint16_t value = serialNumber[i];
Serial.print(value < 4096 ? "0" : "");
Serial.print(value < 256 ? "0" : "");
Serial.print(value < 16 ? "0" : "");
Serial.print(value, HEX);
}
Serial.println();
}

uint16_t testResult;
error = sgp41.executeSelfTest(testResult);
if (error) {
Serial.print("Error trying to execute executeSelfTest(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else if (testResult != 0xD400) {
Serial.print("executeSelfTest failed with error: ");
Serial.println(testResult);
}
AHT.begin();
}

uint16_t read_sgp41(uint16_t rh, uint16_t t) {
uint16_t error;
char errorMessage[256];
uint16_t srawVoc = 0;
uint16_t srawNox = 0;

delay(1000);

if (conditioning_s > 0) {
// During NOx conditioning (10s) SRAW NOx will remain 0
error = sgp41.executeConditioning(rh, t, srawVoc);
conditioning_s--;
} else {
// Read Measurement
error = sgp41.measureRawSignals(rh, t, srawVoc, srawNox);
}

if (error) {
Serial.print("Error trying to execute measureRawSignals(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("RH ticks: ");
Serial.print(rh);
Serial.print("\t");
Serial.print("T ticks: ");
Serial.print(t);
Serial.print("\t");
Serial.print("SRAW_VOC: ");
Serial.print(srawVoc);
Serial.print("\t");
Serial.print("SRAW_NOx: ");
Serial.println(srawNox);
}
return error;
}

void loop()
{
float humi, temp;

int ret = AHT.getSensor(&humi, &temp);

if(ret) // GET DATA OK
{
Serial.print("humidity: ");
Serial.print(humi*100);
Serial.print("%\t temperature: ");
Serial.print(temp);
Serial.print("\t");
// T-ticks = (T/°C + 45) × 65535 / 175
// H-ticks = RH/% × 65535 / 100
int h_ticks = humi * 0xFFFF;
int t_ticks = (temp + 45) * 0xFFFF / 175;
read_sgp41(h_ticks, t_ticks);
}
else // GET DATA FAIL
{
Serial.println("GET DATA FROM AHT20 FAIL");
}

delay(100);
}

// END FILE
  • Paso 2. Abre el Monitor Serie del IDE de Arduino haciendo clic en Herramientas-> Monitor Serie.

Salida de la Consola Serie

Ten en cuenta que los primeros diez valores SRAW_NOx son cero debido al acondicionamiento.

Recursos

✨ Proyecto de Colaborador

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.

Loading Comments...