From 183882ee410752033f3963d237ee117e7b84177f Mon Sep 17 00:00:00 2001 From: coolneng Date: Thu, 27 Nov 2025 13:11:06 +0100 Subject: [PATCH] Implement SCD41 logic in a separate file --- include/sensor.h | 14 ++++++++++++++ src/sensor.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 include/sensor.h create mode 100644 src/sensor.cpp diff --git a/include/sensor.h b/include/sensor.h new file mode 100644 index 0000000..c6f8a13 --- /dev/null +++ b/include/sensor.h @@ -0,0 +1,14 @@ +#ifndef SENSOR_H_ +#define SENSOR_H_ + +#include + +void handle_error(int code, char *msg); + +void initialize_sensor(SensirionI2cScd4x &sensor, int error_code, + char *error_msg); + +void read_values(SensirionI2cScd4x &sensor, float *data, int error_code, + char *error_msg); + +#endif // SENSOR_H_ diff --git a/src/sensor.cpp b/src/sensor.cpp new file mode 100644 index 0000000..6f91030 --- /dev/null +++ b/src/sensor.cpp @@ -0,0 +1,49 @@ +#include "sensor.h" +#include + +// TODO Trigger a reset when an error occurs +void handle_error(int code, char *msg) { + if (code) { + errorToString(code, msg, sizeof msg); + exit(1); + } +} + +void initialize_sensor(SensirionI2cScd4x &sensor, int error_code, + char *error_msg) { + Wire.begin(); + sensor.begin(Wire, SCD41_I2C_ADDR_62); + Serial.println("Starting sensor initialization"); + + error_code = sensor.wakeUp(); + handle_error(error_code, error_msg); + error_code = sensor.stopPeriodicMeasurement(); + handle_error(error_code, error_msg); + error_code = sensor.reinit(); + handle_error(error_code, error_msg); + error_code = sensor.startPeriodicMeasurement(); + handle_error(error_code, error_msg); + + Serial.println("The sensor was initialized properly"); +}; + +void read_values(SensirionI2cScd4x &sensor, float *data, int error_code, + char *error_msg) { + bool data_available = false; + short unsigned int co2_concentration = 0.0; + + error_code = sensor.getDataReadyStatus(data_available); + handle_error(error_code, error_msg); + + while (!data_available) { + delay(100); + error_code = sensor.getDataReadyStatus(data_available); + handle_error(error_code, error_msg); + } + + Serial.println("Data fetched from the sensor"); + + error_code = sensor.readMeasurement(co2_concentration, data[1], data[2]); + data[0] = co2_concentration; + handle_error(error_code, error_msg); +}