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 Nano | Grove - AHT20 Temperature&Humidity Sensor | Grove - 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
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
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.
2. Descargar las librerías requeridas y añadirlas a Arduino
-
Paso 1. Descarga las librerías de dependencia desde Github.
-
Librería arduino-core:
-
Librería arduino-i2c-sgp41:
-
Librería Seeed_Arduino_AHT20:
-
-
Paso 2. Consulta Cómo instalar librería para instalar la librería para Arduino.
-
Paso 3. Después de descargar e instalar las librerías correctamente, puedes subir el código de abajo, que es una combinación del software SGP41 y el AHT20 con las fórmulas descritas en la introducción añadidas.
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.
Ten en cuenta que los primeros diez valores SRAW_NOx son cero debido al acondicionamiento.
Recursos
✨ Proyecto de Colaborador
- Este proyecto está respaldado por el Proyecto de Colaborador de Seeed Studio.
- Gracias a los esfuerzos de Hans y tu trabajo será exhibido.
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.