Correção para medição SGP41(raw) dependente de umidade e temperatura
Visão geral (Como comecei com este projeto)
Primeiro eu li a documentação do Grove - Smart Air Quality Sensor (SGP41) e do Grove - AHT20 I2C Industrial Grade Temperature&Humidity Sensor.
De acordo com a seção 3.2 (Raw Signal Measurement) do SGP41 Datasheet (PDF), a medição do SGP41 é dependente da umidade e da temperatura, então precisamos aplicar uma correção para obter dados consistentes: ler a umidade relativa e a temperatura do AHT20 (ou outro sensor), calcular os ticks e passá-los para a função sgp41_measure_raw_signals.
Teste teórico
A Tabela 11 (Descrição do comando de medição I2C) na página 15 descreve as fórmulas para calcular os ticks:
RHticks = RH% × 65535 / 100
Tticks = (T°C + 45) × 65535 / 175
Verifique usando os valores padrão de 25°C e 50% de umidade relativa:
50 × 65535 / 100 = 32767.5 = 0x8000 (hexadecimal, rounded up)
(25 + 45) × 65535 / 175 = 26214 = 0x6666 (hexadecimal)
Os resultados correspondem às constantes usadas no programa utilizado por Grove - Smart Air Quality Sensor (SGP41) e definidas na Tabela 11 do SGP41 Datasheet (PDF).
O mesmo em C:
int h_ticks = humi * 0xFFFF;
int t_ticks = (temp + 45) * 0xFFFF / 175;
Observe que 'humi' no programa é um valor entre 0 e 1, portanto a divisão por 100 e a multiplicação anterior foram removidas.
Preparação de hardware
Estou usando o Seeeduino Nano como placa de controle e usando Grove - Smart Air Quality Sensor (SGP41) e Grove - AHT20 I2C Industrial Grade Temperature&Humidity Sensor para realizar isso.
| Seeeduino Nano | Grove - AHT20 Temperature&Humidity Sensor | Grove - Smart Air Quality Sensor (SGP41) | Grove - Branch Cable |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Preparação de software
| Arduino IDE |
|---|
Há várias bibliotecas que são necessárias e serão apresentadas no próximo passo.
Primeiros passos
Se esta é a primeira vez que você trabalha com Arduino, recomendamos fortemente que veja Getting Started with Arduino antes de começar.
1. Conectar com o Arduino Nano
Por favor, conecte o cabo USB com cuidado, caso contrário você pode danificar a porta. Use um cabo USB com 4 fios internos, o cabo com 2 fios não consegue transferir dados. Se você não tem certeza sobre o cabo que possui, pode clicar aqui para comprar.
-
Passo 1. Conecte o Grove - Branch Cable à porta I2C do Seeeduino Nano.
-
Passo 2. Conecte o Grove - Branch Cable ao módulo de sensor Grove AHT20 I2C.
-
Passo 3. Conecte o Grove - Branch Cable ao módulo de sensor Grove SGP41 I2C.
-
Passo 4. Conecte o Seeeduino a um PC via cabo USB.

2. Baixar as bibliotecas necessárias e adicioná-las ao Arduino
-
Passo 1. Baixe as bibliotecas de dependência do GitHub.
-
arduino-core Library:
-
arduino-i2c-sgp41 Library:
-
Seeed_Arduino_AHT20 Library:
-
-
Passo 2. Consulte How to install library para instalar a biblioteca para o Arduino.
-
Passo 3. Depois de baixar e instalar as bibliotecas corretamente, você pode enviar o código abaixo, que é uma combinação dos softwares SGP41 e AHT20 com as fórmulas descritas na introdução adicionadas.
3. Faça o upload do código e verifique o resultado
- Passo 1. Faça o upload da demonstração. Se você não souber como enviar o código, consulte Como enviar 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
- Passo 2. Abra o Monitor Serial da Arduino IDE clicando em Tool-> Serial Monitor.

Observe que os primeiros dez valores de SRAW_NOx são zero devido ao condicionamento.
Recursos
✨ Projeto de Colaborador
- Este projeto é apoiado pelo Projeto de Colaborador da Seeed Studio.
- Agradecimentos aos esforços do Hans e o seu trabalho será exibido.
Suporte Técnico & Discussão de Produtos
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.



