Arduino Nano - Sensor de CO2 SCD40

Este tutorial ensina você a usar o Arduino Nano para ler o nível de dióxido de carbono (CO2) de um ambiente com o sensor SCD40. Em detalhes, vamos aprender:

Arduino Nano SCD40 CO2 Sensor

Sugerimos:

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×SCD40 CO2 Sensor Module
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

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

Pinagem do Sensor de CO2 SCD40

O SCD40 da Sensirion mede o CO2 real com sensoriamento NDIR fotoacústico. Dentro de sua pequena câmara, uma luz infravermelha pisca ligando e desligando. O CO2 absorve parte dessa luz e cria um minúsculo "som" de pressão, que um microfone embutido capta: quanto mais CO2, mais forte o sinal. Como ele mede o próprio gás, seu valor é muito mais confiável do que a estimativa "eCO2" de sensores como o MQ135 ou o CCS811.

SCD40
Tensão de Operaçã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 valor a cada 5 segundos (a cada 30 segundos no modo de baixo consumo)
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
SCD40 CO2 sensor pinout

O módulo SCD40 tem quatro pinos:

  • Pino VCC: deve ser conectado ao VCC (5V ou 3.3V)
  • Pino GND: deve ser conectado ao GND (0V)
  • Pino SDA: linha de dados I2C, deve ser conectado ao pino SDA do Arduino Nano (A4)
  • Pino SCL: linha de clock I2C, deve ser conectado ao pino SCL do Arduino Nano (A5)

A maioria das placas breakout SCD40 já tem resistores de pull-up I2C, então nenhum resistor extra é necessário.

※ Nota:

A disposição dos pinos em um módulo pode variar de um fabricante para outro. Algumas placas indicam o VCC como VIN. É essencial sempre consultar os rótulos impressos no módulo ao usá-lo. Observe com atenção!

Como Ler o Valor de CO2

O CO2 é medido em ppm (partes por milhão). A tabela abaixo é um guia simples para o ar em ambientes internos:

Nível de CO2 Significado
Cerca de 400 ppm Ar fresco externo
400 a 1000 ppm Bom ar interno
1000 a 2000 ppm Ar abafado, abra uma janela
Acima de 2000 ppm Ar ruim, dor de cabeça ou sonolência são possíveis

O SCD40 tem Autocalibração Automática (ASC), que 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, ventile o ambiente de vez em quando. Além disso, as primeiras leituras após ligar podem ser menos precisas enquanto o sensor aquece.

Diagrama de Ligação

O módulo SCD40 conversa com o Arduino Nano por I2C, então ele usa os pinos A4 (SDA) e A5 (SCL) do Arduino Nano.

The wiring diagram between Arduino Nano and SCD40 CO2 sensor

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Módulo SCD40 Arduino Nano
VCC 5V
GND GND
SDA A4
SCL A5

Como Programar o Sensor de CO2 SCD40

  • O primeiro passo é incluir as bibliotecas:
#include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h>
  • Declare um objeto SCD4x:
SensirionI2cScd4x scd4x;
  • No setup(), inicie o barramento I2C e conecte o sensor no endereço 0x62:
Wire.begin(); scd4x.begin(Wire, SCD40_I2C_ADDR_62);
  • Faça um início limpo e depois comece a medição periódica:
scd4x.wakeUp(); scd4x.stopPeriodicMeasurement(); scd4x.reinit(); scd4x.startPeriodicMeasurement();
  • No loop(), verifique se um novo valor está pronto e depois leia-o:
bool dataReady = false; scd4x.getDataReadyStatus(dataReady); if (dataReady) { scd4x.readMeasurement(co2, temperature, humidity); }
  • Toda função retorna um código de erro. Quando ele não é 0, pode ser convertido em texto:
errorToString(error, errorMessage, sizeof errorMessage);

Código Arduino Nano para o Sensor de CO2 SCD40

O código abaixo imprime o valor de CO2 em ppm, seguido de uma palavra simples (Good, Moderate ou Poor) com base na tabela guia acima.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-scd40-co2-sensor */ // Arduino Nano + SCD40: read the CO2 level (ppm) // I2C wiring on Arduino Nano: SDA -> A4, SCL -> A5 #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // create the SCD40 object char errorMessage[64]; // buffer for error text int16_t error; void setup() { Serial.begin(9600); Wire.begin(); // Arduino Nano default I2C pins: A4 (SDA), A5 (SCL) scd4x.begin(Wire, SCD40_I2C_ADDR_62); // Clean start: wake up, 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 measurement: a new value every 5 seconds error = scd4x.startPeriodicMeasurement(); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start measurement: "); Serial.println(errorMessage); } Serial.println("SCD40 started. Waiting for the first CO2 value..."); } void loop() { bool dataReady = false; uint16_t co2 = 0; float temperature = 0.0f; // not used in this sketch float humidity = 0.0f; // not used in this sketch delay(1000); // Check if a new measurement is ready error = scd4x.getDataReadyStatus(dataReady); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Data ready error: "); Serial.println(errorMessage); return; } if (!dataReady) { return; // not ready yet, try again in 1 second } // Read the measurement (CO2, temperature, humidity come together) error = scd4x.readMeasurement(co2, temperature, humidity); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read error: "); Serial.println(errorMessage); return; } Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm -> "); Serial.println(airQuality(co2)); } // Turn the ppm 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"; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano, veja como configurar o ambiente para o Arduino Nano na Arduino IDE.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa Arduino Nano ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador e selecione a placa Arduino Nano e sua porta COM.
  • Clique no ícone Libraries na barra à esquerda da Arduino IDE.
  • Pesquise "SCD4x" e encontre a biblioteca Sensirion I2C SCD4x da Sensirion.
  • Clique no botão Install para instalar a biblioteca.
  • Search for Sensirion I2C SCD4x created by Sensirion and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
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
Arduino Nano on COM15
1
  • Será solicitado que você instale a dependência. Clique no botão Install All para instalar a biblioteca Sensirion Core.
  • Copie o código acima e cole-o na Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor e defina o baud rate como 9600.
  • Respire suavemente em direção ao sensor, a uma curta distância, e observe o valor subir; depois deixe-o se estabilizar.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
SCD40 started. Waiting for the first CO2 value... CO2: 538 ppm -> Good CO2: 541 ppm -> Good CO2: 547 ppm -> Good CO2: 812 ppm -> Good CO2: 1367 ppm -> Moderate - open a window CO2: 1184 ppm -> Moderate - open a window CO2: 903 ppm -> Good CO2: 692 ppm -> Good
Ln 11, Col 1
Arduino Nano on COM15
2

Uma nova linha aparece a cada 5 segundos, aproximadamente, porque é com essa frequência que o SCD40 faz uma nova medição.

Lendo a Temperatura e a Umidade do SCD40

O SCD40 também tem seu próprio sensor de temperatura e umidade. O sensor o usa internamente para corrigir o valor de CO2, mas você também pode lê-lo. Na verdade, readMeasurement() já retorna os três valores de uma só vez, então o código só precisa imprimi-los.

Código Arduino Nano para o SCD40 - CO2, Temperatura e Umidade

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-scd40-co2-sensor */ // Arduino Nano + SCD40: read CO2, temperature and humidity // I2C wiring on Arduino Nano: SDA -> A4, SCL -> A5 #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // create the SCD40 object char errorMessage[64]; int16_t error; void setup() { Serial.begin(9600); Wire.begin(); // A4 = SDA, A5 = SCL scd4x.begin(Wire, SCD40_I2C_ADDR_62); scd4x.wakeUp(); // ignore the result scd4x.stopPeriodicMeasurement(); scd4x.reinit(); error = scd4x.startPeriodicMeasurement(); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start measurement: "); Serial.println(errorMessage); } Serial.println("SCD40 started (CO2 + temperature + humidity)"); } void loop() { bool dataReady = false; uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; delay(1000); error = scd4x.getDataReadyStatus(dataReady); if (error || !dataReady) { return; // no new data yet } error = scd4x.readMeasurement(co2, temperature, humidity); if (error) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read error: "); Serial.println(errorMessage); return; } 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

  • Mantenha a mesma ligação.
  • Copie o código acima e abra-o na Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
SCD40 started (CO2 + temperature + humidity) CO2: 619 ppm | Temperature: 25.3°C | Humidity: 46.8% CO2: 624 ppm | Temperature: 25.4°C | Humidity: 46.5% CO2: 631 ppm | Temperature: 25.4°C | Humidity: 46.9% CO2: 628 ppm | Temperature: 25.5°C | Humidity: 47.2%
Ln 11, Col 1
Arduino Nano on COM15
2

※ Nota:

O valor de temperatura serve principalmente para ajudar na medição de CO2, então pode diferir um pouco de um termômetro de ambiente. Para uma leitura dedicada de temperatura e umidade, um sensor como o DHT22 é uma escolha melhor.

Conhecimento Adicional

Vamos comparar o SCD40 e o sensor de gás MQ2.

SCD40 MQ2
O que mede CO2 real em ppm nível geral de GLP, fumaça, álcool, metano etc.
Método de detecção NDIR fotoacústico elemento de óxido metálico aquecido
Saída digital (I2C) tensão analógica e limiar digital
Dados extras temperatura e umidade nenhum
Aquecimento algumas leituras 5-10 minutos (24-48 horas se ficou guardado por muito tempo)

É evidente que o SCD40 é a escolha certa para qualidade do ar interno e ventilação, enquanto o MQ2 é feito para alarmes de vazamento de gás e fumaça.

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!