M5Unit-INFRARED 0.3.0 git rev:2148adc
Loading...
Searching...
No Matches
unit_STHS34PF80.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_INFRARED_UNIT_STHS34PF80_HPP
11#define M5_UNIT_INFRARED_UNIT_STHS34PF80_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16#include <array>
17
18namespace m5 {
19namespace unit {
20
25namespace sths34pf80 {
26
32enum class LowPassFilter : uint8_t {
33 ODR9,
34 ODR20,
35 ODR50,
36 ODR100,
37 ODR200,
38 ODR400,
39 ODR800,
40};
41
46enum class AmbientTemperatureAverage : uint8_t {
47 Samples8,
48 Samples4,
49 Samples2,
50 Samples1,
51};
52
68
75enum class Gain : uint8_t {
76 Wide,
77 Default = 0x07,
78};
79
84enum class ODR : uint8_t {
85 PowerDown,
86 Rate0_25,
87 Rate0_5,
88 Rate1,
89 Rate2,
90 Rate4,
91 Rate8,
92 Rate15,
93 Rate30,
94};
95
100struct Data {
101 static constexpr uint8_t PRES_FLAG{0x04};
102 static constexpr uint8_t MOT_FLAG{0x02};
103 static constexpr uint8_t TAMB_SHOCK_FLAG{0x01};
104
117 std::array<uint8_t, 13> raw{};
118 uint16_t sensitivity{};
119
121 inline int16_t object() const
122 {
123 return static_cast<int16_t>((raw[1] << 8) | raw[0]);
124 }
126 inline float objectTemperature() const
127 {
128 return sensitivity ? object() / static_cast<float>(sensitivity) : std::numeric_limits<float>::quiet_NaN();
129 }
131 inline int16_t ambient() const
132 {
133 return static_cast<int16_t>((raw[3] << 8) | raw[2]);
134 }
136 inline float ambientTemperature() const
137 {
138 // It is possible without sensitivity, but the absence of sensitivity is an error
139 return sensitivity ? ambient() / 100.f /* Fixed value */ : std::numeric_limits<float>::quiet_NaN();
140 }
142 inline int16_t compensated_object() const
143 {
144 return static_cast<int16_t>((raw[5] << 8) | raw[4]);
145 }
147 inline float compensatedObjectTemperature() const
148 {
149 return sensitivity ? compensated_object() / static_cast<float>(sensitivity)
150 : std::numeric_limits<float>::quiet_NaN();
151 }
153 inline int16_t presence() const
154 {
155 return static_cast<int16_t>((raw[7] << 8) | raw[6]);
156 }
158 inline int16_t motion() const
159 {
160 return static_cast<int16_t>((raw[9] << 8) | raw[8]);
161 }
163 inline int16_t ambient_shock() const
164 {
165 return static_cast<int16_t>((raw[11] << 8) | raw[10]);
166 }
168 inline bool isPresence() const
169 {
170 return raw[12] & PRES_FLAG;
171 }
173 inline bool isMotion() const
174 {
175 return raw[12] & MOT_FLAG;
176 }
178 inline bool isAmbientShock() const
179 {
180 return raw[12] & TAMB_SHOCK_FLAG;
181 }
182};
183} // namespace sths34pf80
184
191class UnitSTHS34PF80 : public Component, public PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data> {
192 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSTHS34PF80, 0x5A);
193
194public:
198 static sths34pf80::ODR maximum_odr(const sths34pf80::ObjectTemperatureAverage avg_tmos);
199
204 struct config_t {
206 bool start_periodic{true};
208 sths34pf80::Gain mode{sths34pf80::Gain::Default};
210 sths34pf80::ODR odr{sths34pf80::ODR::Rate30};
212 bool comp_type{true};
214 bool abs{false};
216 sths34pf80::AmbientTemperatureAverage avg_t{sths34pf80::AmbientTemperatureAverage::Samples8};
218 sths34pf80::ObjectTemperatureAverage avg_tmos{sths34pf80::ObjectTemperatureAverage::Samples32};
219 };
220
223 explicit UnitSTHS34PF80(const uint8_t addr = DEFAULT_ADDRESS)
224 : Component(addr), _data{new m5::container::CircularBuffer<sths34pf80::Data>(1)}
225 {
226 auto ccfg = component_config();
227 ccfg.clock = 400 * 1000U;
228 component_config(ccfg);
229 }
232 {
233 }
234
237 virtual bool begin() override;
240 virtual void update(const bool force = false) override;
241
244
248 inline config_t config() const
249 {
250 return _cfg;
251 }
256 inline void config(const config_t& cfg)
257 {
258 _cfg = cfg;
259 }
261
264
268 uint16_t sensitivity() const
269 {
270 return _sensitivity;
271 }
273
277 inline int16_t object() const
278 {
279 return !empty() ? oldest().object() : 0;
280 }
282 inline float objectTemperature() const
283 {
284 return !empty() ? oldest().objectTemperature() : std::numeric_limits<float>::quiet_NaN();
285 }
287 inline int16_t ambient() const
288 {
289 return !empty() ? oldest().ambient() : 0;
290 }
292 inline float ambientTemperature() const
293 {
294 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
295 }
297 inline int16_t compensated_object() const
298 {
299 return !empty() ? oldest().compensated_object() : 0;
300 }
302 inline float compensatedObjectTemperature() const
303 {
304 return !empty() ? oldest().compensatedObjectTemperature() : std::numeric_limits<float>::quiet_NaN();
305 }
307 inline int16_t presence() const
308 {
309 return !empty() ? oldest().presence() : 0;
310 }
312 inline int16_t motion() const
313 {
314 return !empty() ? oldest().motion() : 0;
315 }
317 inline int16_t ambient_shock() const
318 {
319 return !empty() ? oldest().ambient_shock() : 0;
320 }
322 inline bool isPresence() const
323 {
324 return !empty() ? oldest().isPresence() : false;
325 }
327 inline bool isMotion() const
328 {
329 return !empty() ? oldest().isMotion() : false;
330 }
332 inline bool isAmbientShock() const
333 {
334 return !empty() ? oldest().isAmbientShock() : false;
335 }
337
340
360 const bool comp_type = true, const bool abs = false)
361 {
362 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::startPeriodicMeasurement(mode, odr,
363 comp_type, abs);
364 }
371 {
372 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::stopPeriodicMeasurement();
373 }
375
378
393
396
413
419 bool readGainMode(sths34pf80::Gain& mode);
426 bool writeGainMode(const sths34pf80::Gain mode);
427
433 bool readSensitivityRaw(int8_t& raw);
439 bool readSensitivity(uint16_t& value);
446 bool writeSensitivityRaw(const int8_t raw);
453 bool writeSensitivity(const uint16_t value);
454
462
466
473 bool resetAlgorithm();
474
496 const sths34pf80::LowPassFilter lpf_p, const sths34pf80::LowPassFilter lpf_a_t);
497
504 bool readPresenceThreshold(uint16_t& thres);
511 bool writePresenceThreshold(const uint16_t thres);
518 bool readMotionThreshold(uint16_t& thres);
525 bool writeMotionThreshold(const uint16_t thres);
532 bool readAmbientShockThreshold(uint16_t& thres);
539 bool writeAmbientShockThreshold(const uint16_t thres);
540
547 bool readPresenceHysteresis(uint8_t& hyst);
554 bool writePresenceHysteresis(const uint8_t hyst);
561 bool readMotionHysteresis(uint8_t& hyst);
568 bool writeMotionHysteresis(const uint8_t hyst);
575 bool readAmbientShockHysteresis(uint8_t& hyst);
582 bool writeAmbientShockHysteresis(const uint8_t hyst);
583
590 bool readAlgorithmConfig(uint8_t& v);
592
595 bool softReset();
596
597protected:
598 bool read_embedded_register(const uint8_t ereg, uint8_t* rbuf, const uint32_t len);
599 bool write_embedded_register(const uint8_t ereg, const uint8_t* buf, const uint32_t len);
600 inline bool read_embedded_register8(const uint8_t ereg, uint8_t& v)
601 {
602 return read_embedded_register(ereg, &v, 1);
603 }
604 inline bool write_embedded_register8(const uint8_t ereg, const uint8_t v)
605 {
606 return write_embedded_register(ereg, &v, 1);
607 }
608 bool read_embedded_register16LE(const uint8_t ereg, uint16_t& v)
609 {
610 uint8_t rbuf[2]{};
611 if (read_embedded_register(ereg, rbuf, 2)) {
612 v = rbuf[0] | (rbuf[1] << 8);
613 return true;
614 }
615 return false;
616 }
617 bool write_embedded_register16LE(const uint8_t ereg, const uint16_t v)
618 {
619 uint8_t buf[2]{};
620 buf[0] = v & 0xFF;
621 buf[1] = (v >> 8) & 0xFF;
622 return write_embedded_register(ereg, buf, 2);
623 }
624
625 bool start_periodic_measurement();
626 bool start_periodic_measurement(const sths34pf80::Gain mode, const sths34pf80::ODR odr, const bool comp_type,
627 const bool abs);
628 bool stop_periodic_measurement();
629
630 bool write_odr(const sths34pf80::ODR odr);
631 bool write_algorithm_config(const uint8_t v);
632
633 bool is_data_ready();
634 bool read_measurement(sths34pf80::Data& d, const bool full = true);
635
636 bool guard_in_periodic(const char* fname);
637
638 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSTHS34PF80, sths34pf80::Data);
639
640private:
641 std::unique_ptr<m5::container::CircularBuffer<sths34pf80::Data>> _data{};
642 uint16_t _sensitivity{};
643 config_t _cfg{};
644};
645
646namespace sths34pf80 {
648namespace command {
649constexpr uint8_t LPF1_REG{0x0C}; // R/W
650constexpr uint8_t LPF2_REG{0x0D}; // R/W
651constexpr uint8_t WHO_AM_I_REG{0x0F}; // R
652constexpr uint8_t AVG_TRIM_REG{0x10}; // R/W
653constexpr uint8_t CTRL0_REG{0x17}; // R/W
654constexpr uint8_t SENS_DATA_REG{0x1D}; // R/W
655constexpr uint8_t CTRL1_REG{0x20}; // R/W
656constexpr uint8_t CTRL2_REG{0x21}; // R/W
657constexpr uint8_t CTRL3_REG{0x22}; // R/W
658constexpr uint8_t STATUS_REG{0x23}; // R
659constexpr uint8_t FUNC_STATUS_REG{0x25}; // R
660
661constexpr uint8_t TOBJECT_L_REG{0x26}; // R
662constexpr uint8_t TOBJECT_H_REG{0x27}; // R
663constexpr uint8_t TAMBIENT_L_REG{0x28}; // R
664constexpr uint8_t TAMBIENT_H_REG{0x29}; // R
665constexpr uint8_t TOBJ_COMP_L_REG{0x38}; // R
666constexpr uint8_t TOBJ_COMP_H_REG{0x39}; // R
667constexpr uint8_t TPRESENCE_L_REG{0x3A}; // R
668constexpr uint8_t TPRESENCE_H_REG{0x3B}; // R
669constexpr uint8_t TMOTION_L_REG{0x3C}; // R
670constexpr uint8_t TMOTION_H_REG{0x3D}; // R
671constexpr uint8_t TAMB_SHOCK_L_REG{0x3E}; // R
672constexpr uint8_t TAMB_SHOCK_H_REG{0x3F}; // R
673
674// Embedded functions
675constexpr uint8_t FUNC_CFG_ADDR_REG{0x08};
676constexpr uint8_t FUNC_CFG_DATA_REG{0x09};
677constexpr uint8_t PAGE_RW_REG{0x11};
678
679constexpr uint8_t PRESENCE_THS_REG{0x20};
680constexpr uint8_t MOTION_THS_REG{0x22};
681constexpr uint8_t TAMB_SHOCK_THS_REG{0x24};
682constexpr uint8_t HYST_MOTION_REG{0x26};
683constexpr uint8_t HYST_PRESENCE_REG{0x27};
684constexpr uint8_t ALGO_CONFIG_REG{0x28};
685constexpr uint8_t HYST_TAMB_SHOCK_REG{0x29};
686constexpr uint8_t RESET_ALGO_REG{0x2A};
687
688} // namespace command
690} // namespace sths34pf80
691
692} // namespace unit
693} // namespace m5
694#endif
bool startPeriodicMeasurement(const sths34pf80::Gain mode, const sths34pf80::ODR odr, const bool comp_type=true, const bool abs=false)
Start periodic measurement.
Definition unit_STHS34PF80.hpp:359
bool writeMotionHysteresis(const uint8_t hyst)
Write the hysteresis for motion detection.
Definition unit_STHS34PF80.cpp:450
uint16_t sensitivity() const
Gets the inner sensitivity.
Definition unit_STHS34PF80.hpp:268
bool readPresenceHysteresis(uint8_t &hyst)
Read the hysteresis for presence detection.
Definition unit_STHS34PF80.cpp:423
static sths34pf80::ODR maximum_odr(const sths34pf80::ObjectTemperatureAverage avg_tmos)
Get the maximum ODR value that can be set.
Definition unit_STHS34PF80.cpp:68
bool readPresenceThreshold(uint16_t &thres)
Read the threshold for presence detection.
Definition unit_STHS34PF80.cpp:372
bool resetAlgorithm()
Reset the algorithm.
Definition unit_STHS34PF80.cpp:367
bool writePresenceHysteresis(const uint8_t hyst)
Write the hysteresis for presence detection.
Definition unit_STHS34PF80.cpp:428
bool writeSensitivityRaw(const int8_t raw)
Write the raw sensitivity.
Definition unit_STHS34PF80.cpp:321
float compensatedObjectTemperature() const
Oldest compensated object temperature.
Definition unit_STHS34PF80.hpp:302
int16_t ambient() const
Oldest TAMBIENT.
Definition unit_STHS34PF80.hpp:287
bool readAmbientShockThreshold(uint16_t &thres)
Read the threshold for ambient shock detection.
Definition unit_STHS34PF80.cpp:406
void config(const config_t &cfg)
Set the configuration.
Definition unit_STHS34PF80.hpp:256
bool isPresence() const
Oldest presence detection.
Definition unit_STHS34PF80.hpp:322
bool softReset()
Software reset.
Definition unit_STHS34PF80.cpp:356
int16_t presence() const
Oldest TPRESENCE.
Definition unit_STHS34PF80.hpp:307
bool writeAverageTrim(const sths34pf80::AmbientTemperatureAverage avg_t, const sths34pf80::ObjectTemperatureAverage avg_tmos)
Write the average trim.
Definition unit_STHS34PF80.cpp:266
bool readLowPassFilter(sths34pf80::LowPassFilter &lpf_p_m, sths34pf80::LowPassFilter &lpf_m, sths34pf80::LowPassFilter &lpf_p, sths34pf80::LowPassFilter &lpf_a_t)
Read the low pass filter.
Definition unit_STHS34PF80.cpp:213
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_STHS34PF80.hpp:370
bool readAmbientShockHysteresis(uint8_t &hyst)
Read the hysteresis for ambient shock detection.
Definition unit_STHS34PF80.cpp:467
int16_t object() const
Oldest TOBJECT.
Definition unit_STHS34PF80.hpp:277
bool readAlgorithmConfig(uint8_t &v)
Read the algorithm configuration.
Definition unit_STHS34PF80.cpp:489
float ambientTemperature() const
Oldest ambient temperature.
Definition unit_STHS34PF80.hpp:292
bool measureSingleshot(sths34pf80::Data &data, const sths34pf80::AmbientTemperatureAverage avg_t, const sths34pf80::ObjectTemperatureAverage avg_tmos)
Measurement single shot.
Definition unit_STHS34PF80.cpp:186
bool writeSensitivity(const uint16_t value)
Write the sensitivity.
Definition unit_STHS34PF80.cpp:334
bool writeLowPassFilter(const sths34pf80::LowPassFilter lpf_p_m, const sths34pf80::LowPassFilter lpf_m, const sths34pf80::LowPassFilter lpf_p, const sths34pf80::LowPassFilter lpf_a_t)
Write the low pass filter.
Definition unit_STHS34PF80.cpp:229
bool readAverageTrim(sths34pf80::AmbientTemperatureAverage &avg_t, sths34pf80::ObjectTemperatureAverage &avg_tmos)
Read the average trim.
Definition unit_STHS34PF80.cpp:251
UnitSTHS34PF80(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_STHS34PF80.hpp:223
virtual bool begin() override
Begin communication and apply config.
Definition unit_STHS34PF80.cpp:73
bool readObjectDataRate(sths34pf80::ODR &odr)
Read the ODR.
Definition unit_STHS34PF80.cpp:343
virtual void update(const bool force=false) override
Update periodic measurement data.
Definition unit_STHS34PF80.cpp:104
int16_t ambient_shock() const
Oldest TAMB_SHOCK.
Definition unit_STHS34PF80.hpp:317
bool isMotion() const
Oldest motion detection.
Definition unit_STHS34PF80.hpp:327
bool writeAmbientShockThreshold(const uint16_t thres)
Write the threshold for ambient shock detection.
Definition unit_STHS34PF80.cpp:411
int16_t motion() const
Oldest TMOTION.
Definition unit_STHS34PF80.hpp:312
bool writeGainMode(const sths34pf80::Gain mode)
Write the gain mode.
Definition unit_STHS34PF80.cpp:288
bool readSensitivity(uint16_t &value)
Read the sensitivity.
Definition unit_STHS34PF80.cpp:310
bool readMotionThreshold(uint16_t &thres)
Read the threshold for motion detection.
Definition unit_STHS34PF80.cpp:389
float objectTemperature() const
Oldest object temperature.
Definition unit_STHS34PF80.hpp:282
bool writeAmbientShockHysteresis(const uint8_t hyst)
Write the hysteresis for ambient shock detection.
Definition unit_STHS34PF80.cpp:472
bool isAmbientShock() const
Oldest ambient shock detection.
Definition unit_STHS34PF80.hpp:332
config_t config() const
Gets the configuration.
Definition unit_STHS34PF80.hpp:248
bool writePresenceThreshold(const uint16_t thres)
Write the threshold for presence detection.
Definition unit_STHS34PF80.cpp:377
virtual ~UnitSTHS34PF80()
Destructor.
Definition unit_STHS34PF80.hpp:231
bool readMotionHysteresis(uint8_t &hyst)
Read the hysteresis for motion detection.
Definition unit_STHS34PF80.cpp:445
bool readGainMode(sths34pf80::Gain &mode)
Read the gain mode.
Definition unit_STHS34PF80.cpp:277
bool writeMotionThreshold(const uint16_t thres)
Write the threshold for motion detection.
Definition unit_STHS34PF80.cpp:394
int16_t compensated_object() const
Oldest TOBJ_COMP.
Definition unit_STHS34PF80.hpp:297
bool readSensitivityRaw(int8_t &raw)
Read the raw sensitivity.
Definition unit_STHS34PF80.cpp:299
Top level namespace of M5Stack.
For STHS34PF80.
Unit-related namespace.
Settings for begin.
Definition unit_STHS34PF80.hpp:204
bool comp_type
Using compensated value if start on begin (Valid only if mode is default mode)
Definition unit_STHS34PF80.hpp:212
bool abs
Use absolute value for presence detection if start on begin.
Definition unit_STHS34PF80.hpp:214
sths34pf80::ODR odr
ODR if start on begin.
Definition unit_STHS34PF80.hpp:210
sths34pf80::ObjectTemperatureAverage avg_tmos
Object samples if start on begin.
Definition unit_STHS34PF80.hpp:218
bool start_periodic
Start periodic measurement on begin?
Definition unit_STHS34PF80.hpp:206
sths34pf80::AmbientTemperatureAverage avg_t
Ambient samples if start on begin.
Definition unit_STHS34PF80.hpp:216
sths34pf80::Gain mode
Gain mode if start on begin.
Definition unit_STHS34PF80.hpp:208
Measurement data group.
Definition unit_STHS34PF80.hpp:100
bool isAmbientShock() const
Ambient shock detection flag.
Definition unit_STHS34PF80.hpp:178
bool isMotion() const
Motion detection flag.
Definition unit_STHS34PF80.hpp:173
static constexpr uint8_t TAMB_SHOCK_FLAG
Ambient temperature shock flag (bit in raw[12])
Definition unit_STHS34PF80.hpp:103
static constexpr uint8_t MOT_FLAG
Motion detection flag (bit in raw[12])
Definition unit_STHS34PF80.hpp:102
int16_t motion() const
TMOTION raw value.
Definition unit_STHS34PF80.hpp:158
float ambientTemperature() const
Ambient temperature (degrees Celsius)
Definition unit_STHS34PF80.hpp:136
int16_t compensated_object() const
TOBJ_COMP raw value (Disabled if wide mode)
Definition unit_STHS34PF80.hpp:142
float objectTemperature() const
Object temperature (degrees Celsius)
Definition unit_STHS34PF80.hpp:126
float compensatedObjectTemperature() const
Compensated object temperature (degrees Celsius)
Definition unit_STHS34PF80.hpp:147
std::array< uint8_t, 13 > raw
Definition unit_STHS34PF80.hpp:117
int16_t object() const
TOBJECT raw value.
Definition unit_STHS34PF80.hpp:121
uint16_t sensitivity
Sensitivity value (NOT RAW)
Definition unit_STHS34PF80.hpp:118
static constexpr uint8_t PRES_FLAG
Presence detection flag (bit in raw[12])
Definition unit_STHS34PF80.hpp:101
int16_t ambient_shock() const
TAMB_SHOCK raw value.
Definition unit_STHS34PF80.hpp:163
int16_t presence() const
TPRESENCE raw value.
Definition unit_STHS34PF80.hpp:153
int16_t ambient() const
TAMBIENT raw value.
Definition unit_STHS34PF80.hpp:131
bool isPresence() const
Presence detection flag.
Definition unit_STHS34PF80.hpp:168
ObjectTemperatureAverage
The number of averaged samples for object temperature (AVG_TMOS)
Definition unit_STHS34PF80.hpp:58
@ Samples128
128 samples, 20 RMS noise (as default)
ODR
Output data rate configuration.
Definition unit_STHS34PF80.hpp:84
@ Rate0_25
Every 4000 ms.
@ PowerDown
Power-down mode.
@ Rate30
Every 33.33 ms.
@ Rate15
Every 66.67 ms.
@ Rate0_5
Every 2000 ms.
Gain
Gain mode.
Definition unit_STHS34PF80.hpp:75
@ Default
Default mode (High sensitivity)
AmbientTemperatureAverage
The number of averaged samples for ambient temperature (AVG_T)
Definition unit_STHS34PF80.hpp:46
LowPassFilter
Low-pass filter configuration (LPF_)
Definition unit_STHS34PF80.hpp:32