ESP32 - Sensor de CO2 SCD40

Este tutorial ensina você a usar o ESP32 para ler a concentração de CO2 do módulo sensor SCD40 e imprimi-la em ppm no Serial Monitor, junto com uma palavra simples sobre a qualidade do ar. No final do tutorial, também lemos a temperatura e a umidade que o mesmo módulo fornece de graça.

ESP32 Sensor de CO2 SCD40

Uma sala de aula ou um pequeno escritório com a porta fechada pode chegar a um nível alto de CO2 em menos de uma hora, e as pessoas se sentem cansadas sem saber por quê. Com um ESP32 e um SCD40, você pode ver esse número e saber quando é hora de abrir uma janela.

Sobre o Sensor de CO2 SCD40

O SCD40 da Sensirion mede o CO2 real, e não um valor "eCO2" estimado a partir de outros gases, como fazem o MQ135 ou o CCS811. Ele usa detecção NDIR fotoacústica: uma pequena luz infravermelha pulsa dentro da câmara do sensor, o CO2 absorve parte dessa luz e cria um "som" de pressão muito pequeno, e um microfone o mede. Mais CO2 significa um sinal mais forte.

SCD40
A tensão de alimentação 2.4V a 5.5V
A interface I2C, endereço 0x62
A faixa de saída de CO2 0 a 40,000 ppm
A precisão de CO2 ±(50 ppm + 5% da leitura), para 400 a 2,000 ppm
A taxa de leitura uma nova leitura a cada 5 segundos (a cada 30 segundos no modo de baixo consumo)
A precisão de temperatura ±0.8°C (15°C a 35°C)
A precisão de umidade ±6 %RH (15°C a 35°C, 20 a 65 %RH)
A corrente média cerca de 15mA a 3.3V

O sensor vem com a autocalibração automática (ASC) ligada por padrão. Ele espera ver ar fresco, com nível de ar livre (cerca de 400 ppm), pelo menos uma vez por semana, de preferência por uma hora ou mais. Então coloque seu projeto em um lugar onde ele possa receber um pouco de ar fresco de vez em quando, por exemplo perto de uma janela que você abre todo dia. Além disso, as primeiras leituras depois de ligar podem ser menos precisas enquanto o sensor esquenta.

Pinagem do SCD40

Pinagem do sensor de CO2 SCD40

O módulo SCD40 tem 4 pinos:

  • Pino VCC: conecte este pino ao VCC (3.3V ou 5V)
  • Pino GND: conecte este pino ao GND (0V)
  • Pino SDA: o pino de dados I2C, conecte este pino ao pino SDA do ESP32
  • Pino SCL: o pino de clock I2C, conecte este pino ao pino SCL do ESP32

A maioria dos módulos SCD40 já tem os resistores de pull-up do I2C na placa, então não precisamos adicionar nenhum.

O Que Significa o Número de CO2?

Nível de CO2 (ppm) Qualidade do ar
cerca de 400 Ar livre
400 a 1000 Bom ar em ambientes internos
1000 a 2000 Abafado, abra uma janela
acima de 2000 Ruim, dor de cabeça e sonolência são possíveis

Diagrama de Ligação entre o SCD40 e o ESP32

O SCD40 se comunica com o ESP32 por I2C. No ESP32 os pinos I2C padrão são GPIO21 (SDA) e GPIO22 (SCL), então usamos esses pinos e não precisamos definir nenhum pino no código. Alimente o módulo pelo pino 3.3V do ESP32. Isso mantém as linhas I2C em 3.3V, que é o nível seguro para os pinos do ESP32.

  • Como conectar o ESP32 e o sensor de CO2 SCD40 usando um protoboard
Diagrama de ligação do ESP32 com o sensor de CO2 SCD40

This image is created using Fritzing. Click to enlarge image

Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

Como conectar o ESP32 e o sensor de CO2 SCD40
Módulo SCD40 ESP32
VCC → 3.3V
GND → GND
SDA → GPIO21
SCL → GPIO22

Como Programar o Sensor de CO2 SCD40

  • Inclua as bibliotecas:
#include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h>
  • Declare um objeto do sensor:
SensirionI2cScd4x scd4x;
  • Inicie o barramento I2C nos pinos padrão e informe à biblioteca o endereço do sensor:
Wire.begin(); scd4x.begin(Wire, SCD40_I2C_ADDR_62);
  • Faça um início limpo e depois inicie a medição periódica (uma leitura a cada 5 segundos):
scd4x.wakeUp(); scd4x.stopPeriodicMeasurement(); scd4x.reinit(); scd4x.startPeriodicMeasurement();
  • Pergunte se uma nova leitura está pronta e depois leia:
bool dataReady = false; scd4x.getDataReadyStatus(dataReady); if (dataReady) { scd4x.readMeasurement(co2, temperature, humidity); }

Toda função da biblioteca retorna um código de erro. Quando ele não é 0, a função errorToString() o transforma em um texto que você pode imprimir. O código completo abaixo faz isso.

Código ESP32 - CO2 do SCD40

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-scd40-co2-sensor */ // ESP32 reads the CO2 level (ppm) from the SCD40 sensor and prints it to the Serial Monitor // Wiring: SCD40 SDA -> GPIO21, SCD40 SCL -> GPIO22 (the default I2C pins of the ESP32) #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // create the SCD4x sensor object char errorMessage[64]; // buffer for error text int16_t error; // error code returned by the library (0 = no error) void setup() { Serial.begin(9600); delay(500); Wire.begin(); // use the default I2C pins: SDA = GPIO21, SCL = GPIO22 scd4x.begin(Wire, SCD40_I2C_ADDR_62); // clean start: wake the sensor, stop any running measurement, reload settings scd4x.wakeUp(); // may return an error if the sensor is already awake. It is OK to ignore it scd4x.stopPeriodicMeasurement(); scd4x.reinit(); // start a new measurement every 5 seconds error = scd4x.startPeriodicMeasurement(); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start measurement: "); Serial.println(errorMessage); return; } Serial.println("SCD40 started. Waiting for the first reading..."); } void loop() { delay(1000); // check the sensor once per second // is a new measurement ready? bool dataReady = false; error = scd4x.getDataReadyStatus(dataReady); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Data ready error: "); Serial.println(errorMessage); return; } if (!dataReady) { return; // not yet, try again next time } // read the measurement. The SCD40 always sends CO2, temperature and humidity together uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; error = scd4x.readMeasurement(co2, temperature, humidity); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read error: "); Serial.println(errorMessage); return; } // turn the ppm value into a simple air quality word String airQuality; if (co2 < 1000) { airQuality = "Good"; } else if (co2 < 2000) { airQuality = "Moderate - open a window"; } else { airQuality = "Poor"; } Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm -> "); Serial.println(airQuality); }

Passos Rápidos

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
  • Faça a ligação como na imagem acima.
  • Conecte a placa ESP32 ao seu PC por um cabo USB Type-C.
  • Abra o Arduino IDE no seu PC.
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
  • Clique no ícone Libraries na barra esquerda do Arduino IDE.
  • Digite "SCD4x" na caixa de pesquisa e procure a biblioteca Sensirion I2C SCD4x da Sensirion.
  • Instale a biblioteca clicando no botão Install.
  • Search for Sensirion I2C SCD4x created by Sensirion and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Library Manager
Type:
All
Topic:
All
Sensirion I2C SCD4x by Sensirion
Enables you to use the SCD4X sensor family via I2C. More info
1.1.0
INSTALL
Newbiely.ino
···
1 void setup() {
Output
Serial Monitor
Ln 1, Col 1
ESP32 Dev Module on COM15
1
  • Uma janela aparece pedindo que você instale as dependências da biblioteca (Sensirion Core).
  • Instale todas as dependências da biblioteca clicando no botão Install All.
  • Copie o código acima e abra com o Arduino IDE.
  • Compile e faça o upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE.
  • Abra o Serial Monitor. O primeiro valor chega após cerca de 5 segundos.
  • Respire suavemente na direção do sensor por alguns segundos e veja o valor de CO2 subir e depois cair de novo.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
SCD40 started. Waiting for the first reading... CO2: 538 ppm -> Good CO2: 541 ppm -> Good CO2: 547 ppm -> Good CO2: 1186 ppm -> Moderate - open a window CO2: 1642 ppm -> Moderate - open a window CO2: 1203 ppm -> Moderate - open a window CO2: 874 ppm -> Good CO2: 652 ppm -> Good
Ln 11, Col 1
ESP32 Dev Module on COM15
2

O valor só é atualizado uma vez a cada 5 segundos, então a reação à sua respiração não é instantânea. Isso é normal para o SCD40.

※ Nota:

Se você vir uma mensagem de erro em vez de um valor de CO2, verifique primeiro os fios SDA e SCL (é fácil trocá-los). Depois, confirme que o módulo recebe alimentação do pino 3.3V e que o fio GND está conectado.

Lendo Temperatura e Umidade do SCD40

O SCD40 tem um pequeno sensor de temperatura e umidade dentro dele. Ele usa esses valores para corrigir sua própria leitura de CO2, e também os envia ao ESP32 em toda medição. Na verdade, a função readMeasurement() no código acima já preenche as variáveis de temperatura e umidade. Nós só não as imprimimos. O código abaixo imprime os três valores em uma linha.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-scd40-co2-sensor */ // ESP32 reads CO2, temperature and humidity from the SCD40 sensor // Wiring: SCD40 SDA -> GPIO21, SCD40 SCL -> GPIO22 (the default I2C pins of the ESP32) #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // create the SCD4x sensor object char errorMessage[64]; // buffer for error text int16_t error; // error code returned by the library (0 = no error) void setup() { Serial.begin(9600); delay(500); Wire.begin(); // default I2C pins: SDA = GPIO21, SCL = GPIO22 scd4x.begin(Wire, SCD40_I2C_ADDR_62); // clean start scd4x.wakeUp(); // the result is ignored on purpose (sensor may already be awake) scd4x.stopPeriodicMeasurement(); scd4x.reinit(); error = scd4x.startPeriodicMeasurement(); // one new reading every 5 seconds if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start measurement: "); Serial.println(errorMessage); } } void loop() { delay(1000); bool dataReady = false; error = scd4x.getDataReadyStatus(dataReady); if (error != 0 || !dataReady) { return; // no new data yet } uint16_t co2 = 0; float temperature = 0.0f; // in °C float humidity = 0.0f; // in %RH error = scd4x.readMeasurement(co2, temperature, humidity); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read error: "); Serial.println(errorMessage); return; } // print all three values on one line Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm | Temperature: "); Serial.print(temperature, 1); Serial.print("°C | Humidity: "); Serial.print(humidity, 1); Serial.println("%"); }

Passos Rápidos

  • Copie o código acima e abra com o Arduino IDE.
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP32.
  • Veja o resultado no Serial Monitor:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
CO2: 612 ppm | Temperature: 24.3°C | Humidity: 47.8% CO2: 615 ppm | Temperature: 24.3°C | Humidity: 47.6% CO2: 621 ppm | Temperature: 24.4°C | Humidity: 47.9% CO2: 619 ppm | Temperature: 24.4°C | Humidity: 48.1%
Ln 11, Col 1
ESP32 Dev Module on COM15
2

O SCD40 esquenta um pouco enquanto trabalha, então a temperatura pode aparecer um pouco mais alta que a da sala. Para uma temperatura ambiente precisa, um sensor separado, como o DHT22, é uma escolha melhor.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!