26
26
*/
27
27
/* *************************************************************************/
28
28
class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
29
- public:
29
+ public:
30
30
/* ******************************************************************************/
31
31
/* !
32
32
@brief Constructor for an MLX90632 sensor.
@@ -71,61 +71,68 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
71
71
/* !
72
72
@brief Configures the MLX90632 sensor and prints its information.
73
73
@param extendedInsteadOfMedicalRange
74
- If true, configures the sensor for extended temperature range/acc.
74
+ If true, configures the sensor for extended temperature
75
+ range/acc.
75
76
@returns True if configuration fetching and setting were successful.
76
77
*/
77
78
/* ******************************************************************************/
78
79
bool ConfigureAndPrintSensorInfo (bool extendedInsteadOfMedicalRange = false ) {
79
80
// Reset the device
80
81
if (!_mlx90632->reset ()) {
81
82
WS_PRINTER.println (F (" Device reset failed" ));
82
- while (1 ) { delay (10 ); }
83
+ while (1 ) {
84
+ delay (10 );
85
+ }
83
86
}
84
87
WS_PRINTER.println (F (" Device reset: SUCCESS" ));
85
-
88
+
86
89
uint64_t productID = _mlx90632->getProductID ();
87
90
WS_PRINTER.print (F (" Product ID: 0x" ));
88
91
WS_PRINTER.print ((uint32_t )(productID >> 32 ), HEX);
89
92
WS_PRINTER.println ((uint32_t )(productID & 0xFFFFFFFF ), HEX);
90
-
93
+
91
94
uint16_t productCode = _mlx90632->getProductCode ();
92
95
WS_PRINTER.print (F (" Product Code: 0x" ));
93
96
WS_PRINTER.println (productCode, HEX);
94
-
97
+
95
98
uint16_t eepromVersion = _mlx90632->getEEPROMVersion ();
96
99
WS_PRINTER.print (F (" EEPROM Version: 0x" ));
97
100
WS_PRINTER.println (eepromVersion, HEX);
98
-
101
+
99
102
// Decode product code bits
100
103
uint8_t fov = (productCode >> 8 ) & 0x3 ;
101
- uint8_t package = (productCode >> 5 ) & 0x7 ;
104
+ uint8_t package = (productCode >> 5 ) & 0x7 ;
102
105
uint8_t accuracy = productCode & 0x1F ;
103
-
106
+
104
107
WS_PRINTER.print (F (" FOV: " ));
105
108
WS_PRINTER.println (fov == 0 ? F (" 50°" ) : F (" Unknown" ));
106
-
109
+
107
110
WS_PRINTER.print (F (" Package: " ));
108
111
WS_PRINTER.println (package == 1 ? F (" SFN 3x3" ) : F (" Unknown" ));
109
-
112
+
110
113
WS_PRINTER.print (F (" Accuracy: " ));
111
114
if (accuracy == 1 ) {
112
115
WS_PRINTER.println (F (" Medical" ));
113
116
} else if (accuracy == 2 ) {
114
- WS_PRINTER.println (F (" Standard" ));
117
+ WS_PRINTER.println (F (" Standard" ));
115
118
} else {
116
119
WS_PRINTER.println (F (" Unknown" ));
117
120
}
118
121
119
122
// Set and get mode - choose one:
120
123
WS_PRINTER.println (F (" \n --- Mode Settings ---" ));
121
124
if (!_mlx90632->setMode (MLX90632_MODE_CONTINUOUS)) {
122
- // if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment for step mode testing
123
- // if (!_mlx90632->setMode(MLX90632_MODE_SLEEPING_STEP)) { // Uncomment for sleeping step mode testing
125
+ // if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment
126
+ // for step mode testing if
127
+ // (!_mlx90632->setMode(MLX90632_MODE_SLEEPING_STEP)) { // Uncomment for
128
+ // sleeping step mode testing
124
129
WS_PRINTER.println (F (" Failed to set mode" ));
125
- while (1 ) { delay (10 ); }
130
+ while (1 ) {
131
+ delay (10 );
132
+ }
126
133
}
127
-
128
- // TODO: use Step mode?
134
+
135
+ // TODO: use Step mode?
129
136
mlx90632_mode_t currentMode = _mlx90632->getMode ();
130
137
WS_PRINTER.print (F (" Current mode: " ));
131
138
switch (currentMode) {
@@ -149,15 +156,24 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
149
156
if (accuracy == 1 ) {
150
157
// Set and get measurement select (medical)
151
158
WS_PRINTER.println (F (" \n --- Measurement Select Settings ---" ));
152
- if (!extendedInsteadOfMedicalRange && !_mlx90632->setMeasurementSelect (MLX90632_MEAS_MEDICAL)) {
159
+ if (!extendedInsteadOfMedicalRange &&
160
+ !_mlx90632->setMeasurementSelect (MLX90632_MEAS_MEDICAL)) {
153
161
WS_PRINTER.println (F (" Failed to set measurement select to Medical" ));
154
- while (1 ) { delay (10 ); }
155
- } else if (extendedInsteadOfMedicalRange && !_mlx90632->setMeasurementSelect (MLX90632_MEAS_EXTENDED_RANGE)) {
156
- WS_PRINTER.println (F (" Failed to set measurement select to Extended Range" ));
157
- while (1 ) { delay (10 ); }
162
+ while (1 ) {
163
+ delay (10 );
164
+ }
165
+ } else if (extendedInsteadOfMedicalRange &&
166
+ !_mlx90632->setMeasurementSelect (
167
+ MLX90632_MEAS_EXTENDED_RANGE)) {
168
+ WS_PRINTER.println (
169
+ F (" Failed to set measurement select to Extended Range" ));
170
+ while (1 ) {
171
+ delay (10 );
172
+ }
158
173
}
159
174
160
- mlx90632_meas_select_t currentMeasSelect = _mlx90632->getMeasurementSelect ();
175
+ mlx90632_meas_select_t currentMeasSelect =
176
+ _mlx90632->getMeasurementSelect ();
161
177
WS_PRINTER.print (F (" Current measurement select: " ));
162
178
switch (currentMeasSelect) {
163
179
case MLX90632_MEAS_MEDICAL:
@@ -175,9 +191,11 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
175
191
WS_PRINTER.println (F (" \n --- Refresh Rate Settings ---" ));
176
192
if (!_mlx90632->setRefreshRate (MLX90632_REFRESH_2HZ)) {
177
193
WS_PRINTER.println (F (" Failed to set refresh rate to 2Hz" ));
178
- while (1 ) { delay (10 ); }
194
+ while (1 ) {
195
+ delay (10 );
196
+ }
179
197
}
180
-
198
+
181
199
mlx90632_refresh_rate_t currentRefreshRate = _mlx90632->getRefreshRate ();
182
200
WS_PRINTER.print (F (" Current refresh rate: " ));
183
201
switch (currentRefreshRate) {
@@ -208,12 +226,14 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
208
226
default :
209
227
WS_PRINTER.println (F (" Unknown" ));
210
228
}
211
-
229
+
212
230
// Clear new data flag before starting continuous measurements
213
231
WS_PRINTER.println (F (" \\ n--- Starting Continuous Measurements ---" ));
214
232
if (!_mlx90632->resetNewData ()) {
215
233
WS_PRINTER.println (F (" Failed to reset new data flag" ));
216
- while (1 ) { delay (10 ); }
234
+ while (1 ) {
235
+ delay (10 );
236
+ }
217
237
}
218
238
return true ;
219
239
}
@@ -235,19 +255,19 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
235
255
*/
236
256
/* ******************************************************************************/
237
257
bool ReadSensorData () {
238
- bool result= false ;
258
+ bool result = false ;
239
259
240
260
// Only check new data flag - much more efficient for continuous mode
241
261
if (_mlx90632->isNewData ()) {
242
262
WS_PRINTER.print (F (" New Data Available - Cycle Position: " ));
243
263
WS_PRINTER.println (_mlx90632->readCyclePosition ());
244
-
264
+
245
265
// Read ambient temperature
246
266
_deviceTemp = _mlx90632->getAmbientTemperature ();
247
267
WS_PRINTER.print (F (" Ambient Temperature: " ));
248
268
WS_PRINTER.print (_deviceTemp, 4 );
249
269
WS_PRINTER.println (F (" °C" ));
250
-
270
+
251
271
// Read object temperature
252
272
_objectTemp = _mlx90632->getObjectTemperature ();
253
273
WS_PRINTER.print (F (" Object Temperature: " ));
@@ -257,27 +277,27 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
257
277
WS_PRINTER.print (_objectTemp, 4 );
258
278
WS_PRINTER.println (F (" °C" ));
259
279
}
260
- result= true ;
280
+ result = true ;
261
281
// Reset new data flag after reading
262
282
if (!_mlx90632->resetNewData ()) {
263
283
WS_PRINTER.println (F (" Failed to reset new data flag" ));
264
284
}
265
-
266
- WS_PRINTER.println (); // Add blank line between readings
285
+
286
+ WS_PRINTER.println (); // Add blank line between readings
267
287
} else {
268
288
WS_PRINTER.println (F (" No new data available, skipping read" ));
269
-
270
289
}
271
-
290
+
272
291
// Check if we need to trigger a new measurement for step modes
273
292
mlx90632_mode_t currentMode = _mlx90632->getMode ();
274
- if (currentMode == MLX90632_MODE_STEP || currentMode == MLX90632_MODE_SLEEPING_STEP) {
293
+ if (currentMode == MLX90632_MODE_STEP ||
294
+ currentMode == MLX90632_MODE_SLEEPING_STEP) {
275
295
// Trigger single measurement (SOC bit) for step modes
276
296
if (!_mlx90632->startSingleMeasurement ()) {
277
297
WS_PRINTER.println (F (" Failed to start single measurement" ));
278
298
}
279
299
}
280
-
300
+
281
301
_lastRead = millis ();
282
302
return result;
283
303
}
@@ -293,16 +313,16 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
293
313
/* ******************************************************************************/
294
314
bool getEventAmbientTemp (sensors_event_t *tempEvent) {
295
315
if (ReadSensorData () && _deviceTemp != NAN) {
296
- // TODO: check max/min or error values in datasheet
297
- // if (_deviceTemp < -40 || _deviceTemp > 125) {
298
- // WS_PRINTER.println(F("Invalid ambient temperature"));
299
- // return false;
300
- // }
301
- // if the sensor was read recently, return the cached temperature
316
+ // TODO: check max/min or error values in datasheet
317
+ // if (_deviceTemp < -40 || _deviceTemp > 125) {
318
+ // WS_PRINTER.println(F("Invalid ambient temperature"));
319
+ // return false;
320
+ // }
321
+ // if the sensor was read recently, return the cached temperature
302
322
tempEvent->temperature = _deviceTemp;
303
323
return true ;
304
324
}
305
- return false ; // sensor not read recently, return false
325
+ return false ; // sensor not read recently, return false
306
326
}
307
327
308
328
/* ******************************************************************************/
@@ -320,14 +340,14 @@ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
320
340
tempEvent->temperature = _objectTemp;
321
341
return true ;
322
342
}
323
- return false ; // sensor not read recently, return false
343
+ return false ; // sensor not read recently, return false
324
344
}
325
345
326
- protected:
327
- double _deviceTemp; // /< Device temperature in Celsius
328
- double _objectTemp; // /< Object temperature in Celsius
329
- uint32_t _lastRead; // /< Last time the sensor was read in milliseconds
330
- Adafruit_MLX90632 *_mlx90632 = nullptr ; // /< MLX90632 object
346
+ protected:
347
+ double _deviceTemp; // /< Device temperature in Celsius
348
+ double _objectTemp; // /< Object temperature in Celsius
349
+ uint32_t _lastRead; // /< Last time the sensor was read in milliseconds
350
+ Adafruit_MLX90632 *_mlx90632 = nullptr ; // /< MLX90632 object
331
351
};
332
352
333
- #endif // WipperSnapper_I2C_Driver_MLX90632
353
+ #endif // WipperSnapper_I2C_Driver_MLX90632
0 commit comments