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
4949extern 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)
5259static const int bleScanTime = 31 ; // !< BLE scan time in seconds
5360static 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