Sen­sor SCD4x: Tem­pe­ra­tur, Luft­feuch­tig­keit und CO2 messen

Selbst­test

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"

SensirionI2cScd4x sensor;

float TemperaturAbweichung;
uint32_t LuftdruckAnpassung;
uint16_t HoeheAnpassung;
uint16_t ASCaktiviert;
uint16_t ASCZiel;
uint16_t KalibrierungInitialPeriode;
uint16_t KalibrierungStandardPeriode;
uint16_t sensorStatus;

void setup() 
{
  Serial.begin(9600);

  // I2C
  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // R4 WiFi mit QWIIC-Anschluss
  // Wire1.begin();
  // sensor.begin(Wire1, SCD41_I2C_ADDR_62);
  
  delay(30);

  sensor.wakeUp();
  sensor.stopPeriodicMeasurement();
  sensor.reinit();

  sensor.getTemperatureOffset(TemperaturAbweichung);
  Serial.print(F("Temperatur Anpassung °C: "));
  Serial.println(TemperaturAbweichung);

  sensor.getAmbientPressure(LuftdruckAnpassung);
  Serial.print(F("Luftdruck Anpassung in Pa: "));
  Serial.println(LuftdruckAnpassung);

  sensor.getSensorAltitude(HoeheAnpassung);
  Serial.print(F("Anpassung Höhe in m: "));
  Serial.println(HoeheAnpassung);
  Serial.println();

  Serial.println(F("Automatische Selbstkalibrierung (ASC):"));
  sensor.getAutomaticSelfCalibrationEnabled(ASCaktiviert);
  if (ASCaktiviert) 
  {
    Serial.println(F("aktiviert"));
  } 
  else Serial.println(F("nicht aktiviert"));

  sensor.getAutomaticSelfCalibrationTarget(ASCZiel);
  Serial.print(F(" - Ziel für die automatische Kalibrierung in ppm: "));
  Serial.println(ASCZiel);

  sensor.getAutomaticSelfCalibrationInitialPeriod(KalibrierungInitialPeriode);
  Serial.print(F(" - Periode für die Initielisierung in Stunden: "));
  Serial.println(KalibrierungInitialPeriode);

  sensor.getAutomaticSelfCalibrationStandardPeriod(KalibrierungStandardPeriode);
  Serial.print(F(" - Standard-Periode in Stunden: "));
  Serial.println(KalibrierungStandardPeriode);
  Serial.println();

  Serial.print(F("Selbsttest durchführen ... "));
  sensor.performSelfTest(sensorStatus);

  if(sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while(1);
  }
}

void loop() 
{
  // bleibt leer
}

Peri­odi­sche Messung

LCD

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"
#include "LCDIC2.h"

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

uint16_t sensorStatus = 1;

SensirionI2cScd4x sensor;

void setup() 
{
  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);

  // auf Seriellen Monitor warten
  Serial.begin(9600);
  while (!Serial) 
  {
    delay(200);
  }

  // I2C
  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // auf Werkseinstellungen zurücksetzen
  // sensor.performFactoryReset();

  delay(30);

  // Sensor aufwecken
  sensor.wakeUp();

  // periodische Messung stoppen
  sensor.stopPeriodicMeasurement();

  // Vor­ein­stel­lun­gen aus dem EEPROM lesen
  sensor.reinit();
  
  sensor.performSelfTest(sensorStatus);

  if(sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while(1);
  }

  // Höhe des Standorts in m
  sensor.setSensorAltitude(80);

  // Temperaturschwankung berücksichtigen
  sensor.setTemperatureOffset(2.0);

  // Mittelwert des Luftdrucks hPa *100
  // nur sinnvoll, wenn ein präzises Messgerät verfügbar ist
  // sensor.setAmbientPressure(100400);;

  // Periodic: alle 5 Sekunden messen
  // auskommentieren bei SingleShot
  sensor.startPeriodicMeasurement();
}

void loop() 
{
  bool SensorBereit = false;
  uint16_t CO2 = 0;
  float Temperatur = 0.0;
  float Luftfeuchtigkeit = 0.0;

  sensor.getDataReadyStatus(SensorBereit);

  // wenn der Sensor bereit ist -> Messung durchführen
  if (SensorBereit) 
  {  
    // periodische Messung
    sensor.readMeasurement(CO2, Temperatur, Luftfeuchtigkeit);

    String AnzeigeTemperatur = String(Temperatur);
    String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

    AnzeigeTemperatur.replace(".", ",");
    AnzeigeLuftfeuchtigkeit.replace(".", ",");

    // Anzeige Serieller Monitor
    Serial.print("CO2 Konzentration: ");
    Serial.print(CO2);
    Serial.println(" ppm");
    Serial.print("Temperatur: ");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(AnzeigeLuftfeuchtigkeit);
    Serial.println("%");
    Serial.println("------------------------");

    // Anzeige LCD
    lcd.setCursor(0, 0);
    lcd.print("Temperatur: ");
    lcd.print(AnzeigeTemperatur);
    lcd.print("\337C ");

    lcd.setCursor(0, 1);
    lcd.print("Luftfeuchtigkeit: ");
    lcd.setCursor(0, 2);
    lcd.print(AnzeigeLuftfeuchtigkeit);
    lcd.print("% ");

    lcd.setCursor(0, 3);
    lcd.print("CO2: ");
    lcd.print(String(CO2));
    lcd.print(" ppm ");
  }
}

OLED

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"
#include "U8g2lib.h"

// 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);

// 2,08 Zoll SH122
// U8G2_SH1122_256X64_1_HW_I2C oled(U8G2_R0);

uint16_t sensorStatus = 1;

SensirionI2cScd4x sensor;

void setup() 
{
  oled.begin();

  // Schriftart OLED 2,08
  oled.setFont(u8g2_font_helvB14_tf);

  Serial.begin(9600);
  while (!Serial) 
  {
    delay(200);
  }

  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // auf Werkseinstellungen zurücksetzen
  // sensor.performFactoryReset();

  delay(30);

  // Sensor aufwecken
  sensor.wakeUp();

  // periodische Messung stoppen
  sensor.stopPeriodicMeasurement();

  // Vor­ein­stel­lun­gen aus dem EEPROM lesen
  sensor.reinit();
  
  sensor.performSelfTest(sensorStatus);

  if(sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while(1);
  }

  // Höhe des Standorts in m
  sensor.setSensorAltitude(80);

  // Temperaturschwankung berücksichtigen
  sensor.setTemperatureOffset(0.5);
  
  // Periodic: alle 5 Sekunden messen
  // auskommentieren bei SingleShot
  sensor.startPeriodicMeasurement();

  // LowPower: alle 30 Sekunden messen
  // sensor.startLowPowerPeriodicMeasurement();
}

void loop() 
{
  bool SensorBereit = false;
  uint16_t CO2 = 0;
  float Temperatur = 0.0;
  float Luftfeuchtigkeit = 0.0;

  sensor.getDataReadyStatus(SensorBereit);

  // wenn der Sensor bereit ist -> Messung durchführen
  if (SensorBereit) 
  {  
    // periodische Messung
    sensor.readMeasurement(CO2, Temperatur, Luftfeuchtigkeit);

    String AnzeigeTemperatur = String(Temperatur);
    String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

    AnzeigeTemperatur.replace(".", ",");
    AnzeigeLuftfeuchtigkeit.replace(".", ",");

    // Anzeige Serieller Monitor
    Serial.print("CO2 Konzentration: ");
    Serial.print(CO2);
    Serial.println(" ppm");
    Serial.print("Temperatur: ");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(AnzeigeLuftfeuchtigkeit);
    Serial.println("%");
    Serial.println("------------------------");

    oled.clearDisplay();
    do 
    {
      oled.setCursor(5, 14);
    
      // OLED 2,08
      // oled.print("Temperatur: ");
      oled.print(AnzeigeTemperatur);

      // Grad-Zeichen
      oled.print((char)176);
      oled.print("C");

      oled.setCursor(5, 34);
    
      // OLED 2,08
      // oled.print("Luftfeuchtigkeit: ");
      oled.print(AnzeigeLuftfeuchtigkeit);
      oled.print("%");

      oled.setCursor(5, 56);
    
      // OLED 2,08
      // oled.print("CO2: ");
      oled.print(String(CO2));
      oled.print(" ppm");
    } 
    while (oled.nextPage());
  }
}

TFT mit ESP32

Beach­te die ⇒SPI-Pins der Mikrocontroller.

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"
#include "Adafruit_ILI9341.h"
#include "U8g2_for_Adafruit_GFX.h"

// Objekt u8g2Schriften
U8G2_FOR_ADAFRUIT_GFX u8g2Schriften;

// Wemos D1 Mini
// #define TFT_CS        D8
// #define TFT_RST      D1
// #define TFT_DC       D2

// XIAO
// #define TFT_CS        D7
// #define TFT_RST      D1
// #define TFT_DC       D2

// ESP32-C3
// #define TFT_RST      2
// #define TFT_DC       3
// #define TFT_CS        7

// ESP32-C3 Super Mini
// #define TFT_RST      2
// #define TFT_DC       3
// #define TFT_CS        7

// Arduino Nano ESP 32
// #define TFT_CS       10
// #define TFT_RST       9
// #define TFT_DC        8

// ESP32-C6
// #define TFT_CS       18
// #define TFT_RST       3                                          
// #define TFT_DC         2

// ESP32-WROOM
// #define TFT_CS         5
// #define TFT_RST       4 
// #define TFT_DC        2

// ESP32-S3
// #define TFT_CS        10
// #define TFT_RST        5
// #define TFT_DC         4

// ESP32-S3
// #define TFT_CS        10
// #define TFT_RST        5
// #define TFT_DC         4

// Farben
#define SCHWARZ     0x0000
#define WEISS       0xFFFF
#define BLAU        0x001F
#define ROT         0xF800
#define GRUEN       0x07E0
#define CYAN        0x07FF
#define MAGENTA     0xF81F
#define GELB        0xFFE0
#define BRAUN       0x9A60
#define GRAU        0x7BEF
#define GRUENGELB   0xB7E0
#define DUNKELCYAN  0x03EF
#define ORANGE      0xFDA0
#define PINK        0xFE19
#define BORDEAUX    0xA000
#define HELLBLAU    0x867D
#define VIOLETT     0x915C
#define SILBER      0xC618
#define GOLD        0xFEA0

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

uint16_t sensorStatus = 1;

SensirionI2cScd4x sensor;

void setup() 
{
  Serial.begin(9600);
  while (!Serial) 
  {
    delay(200);
  }

  // Schriften von u8g2 tft zuordnen
  u8g2Schriften.begin(tft); 

  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(SCHWARZ);

  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // auf Werkseinstellungen zurücksetzen
  // sensor.performFactoryReset();

  delay(30);

  // Sensor aufwecken
  sensor.wakeUp();

  // periodische Messung stoppen
  sensor.stopPeriodicMeasurement();

  // Vor­ein­stel­lun­gen aus dem EEPROM lesen
  sensor.reinit();
  
  sensor.performSelfTest(sensorStatus);

  if(sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while(1);
  }

  // Höhe des Standorts in m
  sensor.setSensorAltitude(80);

  // Temperaturschwankung berücksichtigen
  sensor.setTemperatureOffset(0.5);
  
  // Periodic: alle 5 Sekunden messen
  // auskommentieren bei SingleShot
  // sensor.startPeriodicMeasurement();

  // LowPower: alle 30 Sekunden messen
  sensor.startLowPowerPeriodicMeasurement();
}

void loop() 
{
  bool SensorBereit = false;
  uint16_t CO2 = 0;
  float Temperatur = 0.0;
  float Luftfeuchtigkeit = 0.0;

  sensor.getDataReadyStatus(SensorBereit);

  // wenn der Sensor bereit ist -> Messung durchführen
  if (SensorBereit) 
  {  
    // periodische Messung
    sensor.readMeasurement(CO2, Temperatur, Luftfeuchtigkeit);

    String AnzeigeTemperatur = String(Temperatur);
    String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

    AnzeigeTemperatur.replace(".", ",");
    AnzeigeLuftfeuchtigkeit.replace(".", ",");

    // Anzeige Serieller Monitor
    Serial.print("CO2 Konzentration: ");
    Serial.print(CO2);
    Serial.println(" ppm");
    Serial.print("Temperatur: ");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(AnzeigeLuftfeuchtigkeit);
    Serial.println("%");
    Serial.println("------------------------");

    tft.fillScreen(SCHWARZ);
    u8g2Schriften.setForegroundColor(BLAU);   
    u8g2Schriften.setBackgroundColor(SCHWARZ);
    u8g2Schriften.setCursor(1, 60);
    u8g2Schriften.setFont(u8g2_font_inb53_mf);
    u8g2Schriften.print(String(CO2) + " ppm");

    u8g2Schriften.setCursor(1, 140);
    u8g2Schriften.setForegroundColor(ROT);   
    u8g2Schriften.setBackgroundColor(SCHWARZ);
    u8g2Schriften.print(AnzeigeTemperatur + "°C");
    
    u8g2Schriften.setCursor(1, 220);
    u8g2Schriften.setForegroundColor(GRUEN);   
    u8g2Schriften.setBackgroundColor(SCHWARZ);
    u8g2Schriften.print(AnzeigeLuftfeuchtigkeit + "%");
  }   
}

Sin­g­le­Shot SCD41

LCD

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"
#include "LCDIC2.h"

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

uint16_t sensorStatus = 1;

SensirionI2cScd4x sensor;

void setup() 
{
  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);

  Serial.begin(9600);

  // warten auf Seriellen Monitor
  while (!Serial) 
  {
    delay(200);
  }

  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // auf Werkseinstellungen zurücksetzen
  // sensor.performFactoryReset();

  // Höhe des Standorts in m
  sensor.setSensorAltitude(80);

  delay(30);

  // Sensor aufwecken
  sensor.wakeUp();

  // periodische Messung stoppen
  sensor.stopPeriodicMeasurement();

  // Vor­ein­stel­lun­gen aus dem EEPROM lesen
  sensor.reinit();

  sensor.performSelfTest(sensorStatus);
  if (sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while (1);
  }

  // Temperaturschwankung berücksichtigen
  sensor.setTemperatureOffset(2.0);
}

void loop() 
{
  bool SensorBereit = false;
  uint16_t CO2 = 0;
  float Temperatur = 0.0;
  float Luftfeuchtigkeit = 0.0;

  sensor.measureSingleShot();
  sensor.measureAndReadSingleShot(CO2, Temperatur, Luftfeuchtigkeit);

  String AnzeigeTemperatur = String(Temperatur);
  String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

  AnzeigeTemperatur.replace(".", ",");
  AnzeigeLuftfeuchtigkeit.replace(".", ",");

  // Anzeige Serieller Monitor
  Serial.print("CO2 Konzentration: ");
  Serial.print(CO2);
  Serial.println(" ppm");
  Serial.print("Temperatur: ");
  Serial.print(AnzeigeTemperatur);
  Serial.println("°C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(AnzeigeLuftfeuchtigkeit);
  Serial.println("%");
  Serial.println("------------------------");

  // Anzeige LCD
  lcd.setCursor(0, 0);
  lcd.print("Temperatur: ");
  lcd.print(AnzeigeTemperatur);
  lcd.print("\337C ");

  lcd.setCursor(0, 1);
  lcd.print("Luftfeuchtigkeit: ");
  lcd.setCursor(0, 2);
  lcd.print(AnzeigeLuftfeuchtigkeit);
  lcd.print("% ");

  lcd.setCursor(0, 3);
  lcd.print("CO2: ");
  lcd.print(String(CO2));
  lcd.print(" ppm ");
}

OLED

#include "Arduino.h"
#include "SensirionI2cScd4x.h"
#include "Wire.h"
#include "U8g2lib.h"

// 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);

// 2,08 Zoll SH122
// U8G2_SH1122_256X64_1_HW_I2C oled(U8G2_R0);

uint16_t sensorStatus = 1;

SensirionI2cScd4x sensor;

void setup() 
{
  oled.begin();

  // Schriftart OLED 2,08
  oled.setFont(u8g2_font_helvB14_tf);

  Serial.begin(9600);
  while (!Serial) 
  {
    delay(200);
  }

  Wire.begin();
  sensor.begin(Wire, SCD41_I2C_ADDR_62);

  // auf Werkseinstellungen zurücksetzen
  // sensor.performFactoryReset();

  delay(30);

  // Sensor aufwecken
  sensor.wakeUp();

  // periodische Messung stoppen
  sensor.stopPeriodicMeasurement();

  // Vor­ein­stel­lun­gen aus dem EEPROM lesen
  sensor.reinit();

  sensor.performSelfTest(sensorStatus);

  if (sensorStatus == 0) Serial.println("Der Sensor funktioniert einwandfrei!");
  else 
  {
    Serial.println("Fehler beim Test des Sensors!");
    while (1);
  }

  // Höhe des Standorts in m
  sensor.setSensorAltitude(80);

  // Temperaturschwankung berücksichtigen
  sensor.setTemperatureOffset(0.5);
}

void loop() 
{
  bool SensorBereit = false;
  uint16_t CO2 = 0;
  float Temperatur = 0.0;
  float Luftfeuchtigkeit = 0.0;

  sensor.measureSingleShot();
  sensor.measureAndReadSingleShot(CO2, Temperatur, Luftfeuchtigkeit);

  String AnzeigeTemperatur = String(Temperatur);
  String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

  AnzeigeTemperatur.replace(".", ",");
  AnzeigeLuftfeuchtigkeit.replace(".", ",");

  // Anzeige Serieller Monitor
  Serial.print("CO2 Konzentration: ");
  Serial.print(CO2);
  Serial.println(" ppm");
  Serial.print("Temperatur: ");
  Serial.print(AnzeigeTemperatur);
  Serial.println("°C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(AnzeigeLuftfeuchtigkeit);
  Serial.println("%");
  Serial.println("------------------------");

  oled.clearDisplay();
  do 
  {
    oled.setCursor(5, 14);
    
    // OLED 2,08
    // oled.print("Temperatur: ");
    oled.print(AnzeigeTemperatur);

    // Grad-Zeichen
    oled.print((char)176);
    oled.print("C");

    oled.setCursor(5, 34);
    
    // OLED 2,08
    // oled.print("Luftfeuchtigkeit: ");
    oled.print(AnzeigeLuftfeuchtigkeit);
    oled.print("%");

    oled.setCursor(5, 56);
    
    // OLED 2,08
    // oled.print("CO2: ");
    oled.print(String(CO2));
    oled.print(" ppm");
  } 
  while (oled.nextPage());
}

Letzte Aktualisierung: Okt. 13, 2025 @ 18:33