Pular para o conteúdo principal

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 NanoGrove - AHT20 Temperature&Humidity SensorGrove - 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

nota

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

nota

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.

Seeeduino_SGP41_AHT20

2. Baixar as bibliotecas necessárias e adicioná-las ao Arduino

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.

Saída do Console Serial

Observe que os primeiros dez valores de SRAW_NOx são zero devido ao condicionamento.

Recursos

✨ Projeto de Colaborador

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.

Loading Comments...