meta data for this page
lamaPLC project: Sension SCD CO² measurement module
The main distinction between these Sensirion sensors lies in their measurement technology, which affects their size and power use. The SCD30 employs conventional NDIR (Non-Dispersive Infrared) technology, whereas the SCD40/41 series utilises a more recent, compact Photoacoustic principle.
| Feature | SCD30 | SCD40 | SCD41 |
|---|---|---|---|
![]() | - | ![]() |
|
| Technology | NDIR (Dual-Channel) | Photoacoustic | Photoacoustic |
| Size | 35 x 23 x 7 mm | 10.1 x 10.1 x 6.5 mm | 10.1 x 10.1 x 6.5 mm |
| CO² Range | 0 – 40,000 ppm | 400 – 2,000 ppm | 400 – 5,000 ppm |
| Accuracy | ±(30 ppm + 3% MV) | ±(50 ppm + 5% MV) | ±(40 ppm + 5% MV) |
| Voltage | 3.3V – 5.5V | 2.4V – 5.5V | 2.4V – 5.5V |
| Power (avg) | ~19 mA | ~15 mA | ~0.5 mA (Low Power Mode) |
| Interface | I²C (Address 0x61), UART, PWM | I²C | I²C |
| Operating Temperature | 0°C to 50°C | ||
Key Differences
- Form Factor: The SCD40/41 is approximately ten times smaller than the SCD30, making it well-suited for compact wearables or integrated smart home devices.
- Precision vs Size: The SCD30 generally offers slightly better accuracy and stability over extended periods, thanks to its dual-channel NDIR design, which naturally compensates for sensor drift.
- Power Efficiency: For battery-powered devices, the SCD41 is the preferred choice, featuring a “Single Shot” mode that significantly reduces power consumption compared to the SCD30 or SCD40.
- Mounting: The SCD40/41 is an SMD (Surface-Mount Device) component suitable for reflow soldering and mass production. In contrast, the SCD30 is usually hand-soldered or connected via pins.
If you'd like to support the development of the site with the price of a coffee — or a few — please do so here.
Here's a handy tip: you can quickly save this page as a PDF by clicking “export to PDF” in the menu on the right side of the screen.
SCD30
The SCD30 is a high-precision, 3-in-1 sensor module from Sensirion that measures Carbon Dioxide (CO²), Temperature, and Relative Humidity. It is considered a “true” CO² sensor because it uses Non-Dispersive Infrared (NDIR) technology to directly measure CO² molecules, rather than approximating levels from other gases.
Key Features & Technology
- Dual-Channel Detection: It uses a dedicated reference channel to compensate for long-term drift, ensuring superior stability over its 15-year lifetime.
- Integrated Compensation: The module uses its built-in temperature and humidity data to internally calibrate and normalise the CO2 readings.
- Self-Calibration Options: Supports Automatic Self-Calibration (ASC), which resets the sensor's baseline when exposed to fresh air (~400 ppm) regularly, or Forced Recalibration (FRC) for manual setup.
- Adjustable Sampling: While the default interval is 2 seconds, it can be set to 1-1800 seconds to reduce power consumption in battery-powered projects.
SCD30 Pinout
| Pin | Name | Description | Logic Level |
|---|---|---|---|
| 1 | VDD | Supply Voltage (3.3V – 5.5V) | — |
| 2 | GND | Ground | — |
| 3 | TX / SCL | Modbus Transmit / I²C Clock | 3.0V (internal pull-up) |
| 4 | RX / SDA | Modbus Receive / I²C Data | 3.0V (internal pull-up) |
| 5 | RDY | Data Ready (High when new data is available) | 3.0V |
| 6 | PWM | Pulse Width Modulation output | 3.0V |
| 7 | SEL | Interface Select (Floating/GND = I²C; High = Modbus) | < 4.0V |
Key Wiring Notes
- Internal Pull-ups: The module has internal 45 kΩ resistors connected to a 3V supply for the I²C lines.
- Voltage Warning: The module can be powered with 5V, but the SCL/SDA logic pins operate at 3V. When using a 5V microcontroller like an Arduino Uno, a level shifter is strongly advised to prevent damage to the sensor.
- Interface Selection: For I²C (the standard mode), leave the SEL pin floating or connect it to Ground. To use Modbus, connect the SEL pin to VDD via a voltage divider, ensuring the voltage does not exceed 4V.
SCD30 Arduino example code
To use the SCD30 with an Arduino, the SparkFun SCD30 Arduino Library and the Adafruit SCD30 Library are the most common choices.
#include <Wire.h> #include "SparkFun_SCD30_Arduino_Library.h" // SCD30 airSensor; void setup() { Wire.begin(); Serial.begin(9600); if (airSensor.begin() == false) { Serial.println("Sensor not detected. Check wiring!"); while (1); } Serial.println("SCD30 detected!"); } void loop() { if (airSensor.dataAvailable()) { Serial.print("CO2(ppm): "); Serial.print(airSensor.getCO2()); Serial.print(" Temp(C): "); Serial.print(airSensor.getTemperature(), 1); Serial.print(" Humidity(%): "); Serial.println(airSensor.getHumidity(), 1); } delay(2000); // Sensor updates every 2 seconds by default }
SCD41
The SCD41, developed by Sensirion, is a compact, highly precise sensor for measuring CO₂, temperature, and humidity. As the second generation of their optical CO² sensors, it employs photoacoustic NDIR (Non-Dispersive Infrared) technology. This approach enables the sensor to be much smaller than conventional CO₂ sensors while maintaining high accuracy, making it perfect for indoor air quality (IAQ) monitoring.
Key Features
- 3-in-1 Sensing: Measures CO2 concentration, relative humidity, and temperature simultaneously.
- Miniature Form Factor: Its extremely small size (10.1 x 10.1 x 6.5 mm³) enables easy integration into compact devices.
- High Accuracy: Offers a precision of ±(40 ppm + 5% of reading) across the range 400 to 5,000 ppm.
- Low Power Modes: Includes a “single-shot” mode that reduces average current consumption to <0.4 mA for battery-operated applications.
- Standard Interface: Communicates via I2C, making it compatible with microcontrollers such as Arduino, ESP32, and Raspberry Pi.
Technical Specifications
| Parameter | Range / Value | Accuracy (Typical) |
|---|---|---|
| CO² Concentration | 400 – 5,000 ppm (up to 40,000 ppm output) | ±(40 ppm + 5%) |
| Relative Humidity | 0 – 100% RH | ±6% RH |
| Temperature | -10°C to 60°C | +-0.8 °C (at 15-35°C) |
| Supply Voltage | 2.4V – 5.5V | N/A |
| I²C Address | 0x62 | N/A |
SCD41 Pinout
Most breakout boards use a standard 4-pin or 5-pin arrangement for easy connection to microcontrollers like Arduino or ESP32.
| Pin Name | Type | Description |
|---|---|---|
| VIN / VCC | Power | Connect to (2.4V – 5.5V) (depending on your board's logic level). |
| GND | Ground | Common ground for power and logic. |
| SCL | I²C Clock | Serial clock line for I²C communication. Usually has a 10k pull-up. |
| SDA | I²C Data | Serial data line for I²C communication. Usually has a 10k pull-up. |
| 3Vo | Output | (Adafruit boards only) 3.3V output from the onboard regulator. |
SCD41 Arduino example
Search for “Sensirion I2C SCD4x” and install it. The example below initialises the sensor and outputs CO², Temperature, and Humidity readings every 5 seconds.
#include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; void setup() { Serial.begin(115200); while (!Serial); // Wait for serial monitor Wire.begin(); scd4x.begin(Wire); // Stop potentially running measurement uint16_t error = scd4x.stopPeriodicMeasurement(); if (error) { Serial.print("Error stopping measurement: "); Serial.println(error); } // Start periodic measurement (updates every 5 seconds) error = scd4x.startPeriodicMeasurement(); if (error) { Serial.print("Error starting measurement: "); Serial.println(error); } Serial.println("Waiting for first measurement... (5 sec)"); } void loop() { uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; bool dataReady = false; // Check if data is ready to be read uint16_t error = scd4x.getDataReadyStatus(dataReady); if (dataReady) { error = scd4x.readMeasurement(co2, temperature, humidity); if (!error) { Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm\t"); Serial.print("Temp: "); Serial.print(temperature); Serial.print(" °C\t"); Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %"); } } delay(1000); // Check status every second }
Key Functions to Note
- startPeriodicMeasurement(): Sets the sensor to measure every 5 seconds.
- getDataReadyStatus(): Use this to avoid reading “stale” data until the next 5-second interval.
- measureSingleShot(): Available only on the SCD41 (not the SCD40). It allows manual measurement to save power, making it ideal for battery-powered projects.
Communication topics on lamaPLC
This page has been accessed for: Today: 2, Until now: 301




