Skip to content

Commit d3a5f11

Browse files
authored
Merge pull request #41 from matthias-bs/20251013-fix-scd4x-reading
Updated SCD4x driver
2 parents 2301624 + c89c84c commit d3a5f11

1 file changed

Lines changed: 38 additions & 24 deletions

File tree

src/LocalInterface.cpp

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
// 20241010 Extracted from Waveshare_7_5_T7_Sensors.ino
3636
// 20250308 Updated NimBLE-Arduino to v2.2.3
3737
// 20250725 Replaced BLE code by src/BleSensors/BleSensors.h/.cpp
38-
// 20250728 Fixed compilation with MITHERMOMETER_EN
38+
// 20251013 Updated SCD4x driver
3939
//
4040
// ToDo:
4141
// -
@@ -48,6 +48,13 @@ extern bool TouchTriggered();
4848

4949
extern local_sensors_t LocalSensors;
5050

51+
// Sensirion macro definitions
52+
// Make sure that we use the proper definition of NO_ERROR
53+
#ifdef NO_ERROR
54+
#undef NO_ERROR
55+
#endif
56+
#define NO_ERROR 0
57+
5158
#if defined(MITHERMOMETER_EN) || defined(THEENGSDECODER_EN)
5259
static const int bleScanTime = 31; //!< BLE scan time in seconds
5360
static const int bleScanMode = 1; //!< BLE scan mode: 0=passive, 1=active
@@ -74,41 +81,42 @@ void LocalInterface::GetLocalData(void)
7481
#ifdef SCD4X_EN
7582
SensirionI2cScd4x scd4x;
7683

77-
uint16_t error;
78-
char errorMessage[256];
84+
int16_t error;
85+
char errorMessage[64];
7986

8087
scd4x.begin(myWire, SCD41_I2C_ADDR_62);
88+
89+
// Ensure sensor is in clean state
90+
delay(30);
91+
error = scd4x.wakeUp();
92+
if (error != NO_ERROR) {
93+
errorToString(error, errorMessage, sizeof(errorMessage));
94+
log_e("Error trying to execute wakeUp(): %s", errorMessage);
95+
}
8196

8297
// stop potential previously started measurement
8398
error = scd4x.stopPeriodicMeasurement();
84-
if (error)
99+
if (error != NO_ERROR)
85100
{
86-
errorToString(error, errorMessage, 256);
101+
errorToString(error, errorMessage, sizeof(errorMessage));
87102
log_e("Error trying to execute stopPeriodicMeasurement(): %s", errorMessage);
88103
}
89104

90105
// Start Measurement
91106
error = scd4x.measureSingleShot();
92-
if (error)
107+
if (error != NO_ERROR)
93108
{
94-
errorToString(error, errorMessage, 256);
109+
errorToString(error, errorMessage, sizeof(errorMessage));
95110
log_e("Error trying to execute measureSingleShot(): %s", errorMessage);
96111
}
97112

98113
log_d("First measurement takes ~5 sec...");
99114
#endif
100115

101-
// BLE Temperature/Humidity Sensors
102-
#if defined(MITHERMOMETER_EN)
103-
float div = 100.0;
104-
#elif defined(THEENGSDECODER_EN)
105-
float div = 1.0;
106-
#endif
107-
108116
#ifdef MITHERMOMETER_EN
109117
// Setup BLE Temperature/Humidity Sensors
110118
ATC_MiThermometer miThermometer(knownBLEAddresses); //!< Mijia Bluetooth Low Energy Thermo-/Hygrometer
111-
miThermometer.begin(bleScanMode);
119+
miThermometer.begin();
112120

113121
// Set sensor data invalid
114122
miThermometer.resetData();
@@ -119,13 +127,19 @@ void LocalInterface::GetLocalData(void)
119127
if (miThermometer.data[0].valid)
120128
{
121129
LocalSensors.ble_thsensor[0].valid = true;
122-
LocalSensors.ble_thsensor[0].temperature = miThermometer.data[0].temperature / div;
123-
LocalSensors.ble_thsensor[0].humidity = miThermometer.data[0].humidity / div;
130+
LocalSensors.ble_thsensor[0].temperature = miThermometer.data[0].temperature / 100.0;
131+
LocalSensors.ble_thsensor[0].humidity = miThermometer.data[0].humidity / 100.0;
124132
LocalSensors.ble_thsensor[0].batt_level = miThermometer.data[0].batt_level;
125133
}
126134
miThermometer.clearScanResults();
127135
#endif
128136

137+
// BLE Temperature/Humidity Sensors
138+
#if defined(MITHERMOMETER_EN)
139+
float div = 100.0;
140+
#elif defined(THEENGSDECODER_EN)
141+
float div = 1.0;
142+
#endif
129143

130144
#ifdef THEENGSDECODER_EN
131145
bleSensors = BleSensors(KNOWN_BLE_ADDRESSES);
@@ -196,9 +210,9 @@ void LocalInterface::GetLocalData(void)
196210
if (LocalSensors.i2c_thpsensor[0].valid)
197211
{
198212
error = scd4x.setAmbientPressure((uint16_t)LocalSensors.i2c_thpsensor[0].pressure);
199-
if (error)
213+
if (error != NO_ERROR)
200214
{
201-
errorToString(error, errorMessage, 256);
215+
errorToString(error, errorMessage, sizeof(errorMessage));
202216
log_e("Error trying to execute setAmbientPressure(): %s", errorMessage);
203217
}
204218
}
@@ -208,9 +222,9 @@ void LocalInterface::GetLocalData(void)
208222
for (int i = 0; i < 50; i++)
209223
{
210224
error = scd4x.getDataReadyStatus(isDataReady);
211-
if (error)
225+
if (error != NO_ERROR)
212226
{
213-
errorToString(error, errorMessage, 256);
227+
errorToString(error, errorMessage, sizeof(errorMessage));
214228
log_e("Error trying to execute getDataReadyFlag(): %s", errorMessage);
215229
}
216230
if (error || isDataReady)
@@ -220,12 +234,12 @@ void LocalInterface::GetLocalData(void)
220234
delay(100);
221235
}
222236

223-
if (isDataReady && !error)
237+
if (isDataReady && (error == NO_ERROR))
224238
{
225239
error = scd4x.readMeasurement(LocalSensors.i2c_co2sensor.co2, LocalSensors.i2c_co2sensor.temperature, LocalSensors.i2c_co2sensor.humidity);
226-
if (error)
240+
if (error != NO_ERROR)
227241
{
228-
errorToString(error, errorMessage, 256);
242+
errorToString(error, errorMessage, sizeof(errorMessage));
229243
log_e("Error trying to execute readMeasurement(): %s", errorMessage);
230244
}
231245
else if (LocalSensors.i2c_co2sensor.co2 == 0)

0 commit comments

Comments
 (0)