ESP8266 - Sensor de CO2 SCD40

Este tutorial ensina você a usar o ESP8266 para medir o nível de CO2 de um ambiente com o sensor Sensirion SCD40. Em detalhes, vamos aprender:

Sugerimos:

ESP8266 NodeMCU SCD40 CO2 sensor

Hardware Necessário

1×ESP8266 NodeMCU ESP-12F
1×Alternatively, ESP8266 D1 Mini NodeMCU ESP-12F
1×Alternatively, ESP8266 NodeMCU ESP-12E (Uno-form)
1×Micro USB Cable
1×Alternatively, ESP8266 NodeMCU ESP-12F (SMD-form)
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×SCD40 CO2 Sensor Module
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP8266

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Sobre o Sensor de CO2 SCD40

Muitos sensores baratos de "qualidade do ar" apenas estimam o nível de CO2 (eles dão um valor "eCO2"). O SCD40 da Sensirion realmente mede o CO2. Ele usa sensoriamento NDIR fotoacústico: uma minúscula luz infravermelha pulsa dentro da câmara do sensor, as moléculas de CO2 absorvem parte dessa luz e criam um "som" de pressão muito pequeno, e um microfone embutido o mede. Mais CO2 significa um sinal mais forte. O módulo também tem dentro dele um sensor de temperatura e umidade, que ele usa para corrigir o valor de CO2.

SCD40
Tensão de alimentação 2.4V a 5.5V
Interface I2C, endereço 0x62
Faixa de saída de CO2 0 a 40,000 ppm
Precisão de CO2 ±(50 ppm + 5% da leitura), de 400 a 2,000 ppm
Taxa de leitura um novo valor a cada 5 segundos (modo de baixo consumo a cada 30 segundos)
Precisão de temperatura ±0.8°C (15°C a 35°C)
Precisão de umidade ±6 %RH (15°C a 35°C, 20 a 65 %RH)
Corrente média cerca de 15 mA a 3.3V

Pinagem do Sensor de CO2 SCD40

SCD40 CO2 sensor pinout

O módulo SCD40 tem quatro pinos:

  • Pino VCC: deve ser conectado ao 3.3V do ESP8266 (o módulo aceita de 2.4V a 5.5V)
  • Pino GND: deve ser conectado ao GND (0V)
  • Pino SCL: a linha de clock I2C, deve ser conectado ao pino SCL do ESP8266
  • Pino SDA: a linha de dados I2C, deve ser conectado ao pino SDA do ESP8266

A maioria dos módulos breakout SCD40 já tem resistores de pull-up em SCL e SDA, então nenhum resistor extra é necessário.

※ Nota:

A ordem dos pinos não é a mesma em todos os módulos. Algumas placas imprimem VIN em vez de VCC. Sempre olhe os rótulos do seu próprio módulo antes de ligar.

O Que Significa o Valor de CO2?

O CO2 é medido em ppm (partes por milhão). O ar fresco externo fica em torno de 400 ppm. Em um ambiente fechado, cada pessoa expira CO2, então o número sobe.

Nível de CO2 Qualidade do ar O que fazer
cerca de 400 ppm Ar externo nada
400 - 1000 ppm Bom ar interno nada
1000 - 2000 ppm Abafado abra uma janela
acima de 2000 ppm Ruim ventile agora, dor de cabeça e sonolência são possíveis

Calibração e Aquecimento

A autocalibração automática (ASC) vem ATIVADA por padrão. Ela assume que o sensor vê ar fresco, de nível externo (cerca de 400 ppm), pelo menos uma vez por semana, idealmente por uma hora ou mais. Então coloque o sensor onde o ar fresco chegue até ele 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. Isso é normal.

Diagrama de Ligação

O ESP8266 é uma placa de 3.3V, então alimente o SCD40 pelo pino 3V3. Conecte as linhas I2C aos pinos I2C padrão do NodeMCU: D2 (GPIO4) é o SDA e D1 (GPIO5) é o SCL.

The wiring diagram between ESP8266 NodeMCU and SCD40 CO2 sensor

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

Módulo SCD40 ESP8266 NodeMCU
VCC 3.3V
GND GND
SDA D2 (GPIO4)
SCL D1 (GPIO5)

Como Programar o Sensor de CO2 SCD40

  • O primeiro passo é incluir as bibliotecas:
#include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h>
  • Crie o objeto do sensor:
SensirionI2cScd4x scd4x;
  • Inicie o barramento I2C nos pinos padrão do ESP8266 e diga à biblioteca onde está o sensor:
Wire.begin(); // SDA = D2, SCL = D1 scd4x.begin(Wire, SCD40_I2C_ADDR_62);
  • Faça um início limpo e depois comece a medição periódica (uma leitura a cada 5 segundos):
scd4x.wakeUp(); scd4x.stopPeriodicMeasurement(); scd4x.reinit(); scd4x.startPeriodicMeasurement();
  • No loop(), verifique se uma nova leitura está pronta e depois leia-a:
bool dataReady = false; scd4x.getDataReadyStatus(dataReady); if (dataReady) { uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; scd4x.readMeasurement(co2, temperature, humidity); }

Toda função retorna um código de erro. Se ele não for 0, errorToString() o transforma em uma mensagem legível, como você verá no código completo.

Código ESP8266 para o SCD40 - Ler o CO2

Este código imprime apenas o valor de CO2 e uma palavra curta sobre a qualidade do ar: Good, Moderate ou Poor.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-scd40-co2-sensor */ /* * ESP8266 NodeMCU - read CO2 (ppm) from the Sensirion SCD40 sensor * * Wiring (default I2C pins of the NodeMCU): * SCD40 VCC -> 3.3V * SCD40 GND -> GND * SCD40 SDA -> D2 (GPIO4) * SCD40 SCL -> D1 (GPIO5) * * Library: "Sensirion I2C SCD4x" by Sensirion (+ dependency "Sensirion Core") */ #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; char errorMessage[64]; int16_t error; void setup() { Serial.begin(9600); delay(100); Wire.begin(); // ESP8266 default I2C: SDA = D2, SCL = D1 scd4x.begin(Wire, SCD40_I2C_ADDR_62); // Clean start: wake up the sensor, stop any old measurement, reload settings scd4x.wakeUp(); // may return an error if the sensor is already awake - ignore it scd4x.stopPeriodicMeasurement(); scd4x.reinit(); // Start periodic mode: one new reading every 5 seconds error = scd4x.startPeriodicMeasurement(); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start measurement: "); Serial.println(errorMessage); return; } Serial.println("SCD40 started. The first reading arrives in about 5 seconds..."); } void loop() { delay(1000); // check about once per second // Is a new reading ready? bool dataReady = false; error = scd4x.getDataReadyStatus(dataReady); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Data-ready check failed: "); Serial.println(errorMessage); return; } if (!dataReady) { return; // not yet, try again in the next loop } // Read the measurement (CO2, temperature and humidity come together) uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; error = scd4x.readMeasurement(co2, temperature, humidity); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read failed: "); Serial.println(errorMessage); return; } // Only CO2 is printed in this example Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm -> "); Serial.println(airQuality(co2)); } // Turn a CO2 value into a simple word const char* airQuality(uint16_t ppm) { if (ppm < 1000) return "Good"; if (ppm < 2000) return "Moderate - open a window"; return "Poor - ventilate now"; }

Passos Rápidos

Para começar com o ESP8266 na Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para o ESP8266 na Arduino IDE se esta é a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Clique no ícone Libraries na barra à esquerda da Arduino IDE.
  • Pesquise "SCD4x" e depois localize a biblioteca Sensirion I2C SCD4x da Sensirion.
  • Pressione o botão Install. Quando for solicitado que você instale a dependência Sensirion Core, clique em Install All.
  • Search for Sensirion I2C SCD4x created by Sensirion and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E 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
Nodemcu 1.0 (ESP-12E Module) on COM15
1
  • Copie o código acima e abra-o com a Arduino IDE.
  • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
  • Abra o Serial Monitor e espere cerca de 5 segundos pelo primeiro valor.
  • Respire suavemente em direção ao sensor, ou feche a porta de uma sala pequena, e observe o valor de CO2 subir.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
SCD40 started. The first reading arrives in about 5 seconds... CO2: 538 ppm -> Good CO2: 541 ppm -> Good CO2: 547 ppm -> Good CO2: 812 ppm -> Good CO2: 1164 ppm -> Moderate - open a window CO2: 1097 ppm -> Moderate - open a window CO2: 873 ppm -> Good CO2: 702 ppm -> Good
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

※ Nota:

Se você vir uma mensagem de erro em vez de números, verifique se o SDA vai para o D2 e o SCL vai para o D1. Trocar esses dois fios é o erro mais comum.

Lendo a Temperatura e a Umidade do SCD40

O SCD40 fornece três valores em cada leitura: CO2, temperatura e umidade. No código acima, readMeasurement() já preenche as variáveis de temperatura e umidade, só não as imprimimos. O código abaixo imprime os três valores. Observe que o sensor fica sobre uma placa quente, então sua temperatura pode ser um pouco mais alta do que a temperatura real do ambiente.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-scd40-co2-sensor */ /* * ESP8266 NodeMCU - read CO2, temperature and humidity from the SCD40 * * Wiring (default I2C pins of the NodeMCU): * SCD40 VCC -> 3.3V * SCD40 GND -> GND * SCD40 SDA -> D2 (GPIO4) * SCD40 SCL -> D1 (GPIO5) * * Library: "Sensirion I2C SCD4x" by Sensirion (+ dependency "Sensirion Core") */ #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; char errorMessage[64]; int16_t error; void setup() { Serial.begin(9600); delay(100); Wire.begin(); // SDA = D2, SCL = D1 scd4x.begin(Wire, SCD40_I2C_ADDR_62); scd4x.wakeUp(); // an error here is normal if the sensor is already awake scd4x.stopPeriodicMeasurement(); scd4x.reinit(); error = scd4x.startPeriodicMeasurement(); // new data every 5 seconds if (error) { 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 || !dataReady) { return; // no new data yet } uint16_t co2 = 0; float temperature = 0.0f; // in degrees Celsius float humidity = 0.0f; // in %RH error = scd4x.readMeasurement(co2, temperature, humidity); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read failed: "); 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("\xC2\xB0"); // degree symbol Serial.print("C | Humidity: "); Serial.print(humidity, 1); Serial.println(" %"); }

Faça o upload da mesma forma e abra o Serial Monitor:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
CO2: 623 ppm | Temperature: 26.4°C | Humidity: 47.2 % CO2: 629 ppm | Temperature: 26.4°C | Humidity: 47.0 % CO2: 634 ppm | Temperature: 26.5°C | Humidity: 46.9 % CO2: 641 ppm | Temperature: 26.5°C | Humidity: 46.8 %
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Vídeo

Conhecimento Adicional

Vamos comparar o SCD40 com o sensor de gás MQ2 usado no tutorial ESP8266 - Sensor de Gás.

SCD40 MQ2
O que mede CO2 real em ppm uma mistura de gases (GLP, fumaça, metano...)
Saída valor digital I2C tensão analógica + limiar digital
Unidade ppm sem unidade (valor bruto)
Dados extras temperatura e umidade nenhum
Aquecimento algumas leituras vários minutos (24 - 48 horas quando novo)
Melhor para ventilação de ambientes, salas de aula, escritórios alarmes de vazamento de gás e fumaça

É evidente que o SCD40 é a escolha certa quando você precisa de um número verdadeiro de CO2 para saber quando abrir uma janela, enquanto o MQ2 é melhor para detectar gás perigoso ou fumaça.

※ 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!