M5Unit-INFRARED 0.1.1 git rev:238d2a7
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 }
230 virtual ~UnitSTHS34PF80()
231 {
232 }
233
236 virtual bool begin() override;
239 virtual void update(const bool force = false) override;
240
243
245 {
246 return _cfg;
247 }
249 inline void config(const config_t& cfg)
250 {
251 _cfg = cfg;
252 }
254
258 uint16_t sensitivity() const
259 {
260 return _sensitivity;
261 }
263
267 inline int16_t object() const
268 {
269 return !empty() ? oldest().object() : 0;
270 }
272 inline float objectTemperature() const
273 {
274 return !empty() ? oldest().objectTemperature() : std::numeric_limits<float>::quiet_NaN();
275 }
277 inline int16_t ambient() const
278 {
279 return !empty() ? oldest().ambient() : 0;
280 }
282 inline float ambientTemperature() const
283 {
284 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
285 }
287 inline int16_t compensated_object() const
288 {
289 return !empty() ? oldest().compensated_object() : 0;
290 }
292 inline float compensatedObjectTemperature() const
293 {
294 return !empty() ? oldest().compensatedObjectTemperature() : std::numeric_limits<float>::quiet_NaN();
295 }
297 inline int16_t presence() const
298 {
299 return !empty() ? oldest().presence() : 0;
300 }
302 inline int16_t motion() const
303 {
304 return !empty() ? oldest().motion() : 0;
305 }
307 inline int16_t ambient_shock() const
308 {
309 return !empty() ? oldest().ambient_shock() : 0;
310 }
312 inline bool isPresence() const
313 {
314 return !empty() ? oldest().isPresence() : false;
315 }
317 inline bool isMotion() const
318 {
319 return !empty() ? oldest().isMotion() : false;
320 }
322 inline bool isAmbientShock() const
323 {
324 return !empty() ? oldest().isAmbientShock() : false;
325 }
327
330
350 const bool comp_type = true, const bool abs = false)
351 {
352 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::startPeriodicMeasurement(mode, odr,
353 comp_type, abs);
354 }
361 {
362 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::stopPeriodicMeasurement();
363 }
365
368
383
386
403
409 bool readGainMode(sths34pf80::Gain& mode);
416 bool writeGainMode(const sths34pf80::Gain mode);
417
423 bool readSensitivityRaw(int8_t& raw);
429 bool readSensitivity(uint16_t& value);
436 bool writeSensitivityRaw(const int8_t raw);
443 bool writeSensitivity(const uint16_t value);
444
452
456
463 bool resetAlgorithm();
464
486 const sths34pf80::LowPassFilter lpf_p, const sths34pf80::LowPassFilter lpf_a_t);
487
494 bool readPresenceThreshold(uint16_t& thres);
501 bool writePresenceThreshold(const uint16_t thres);
508 bool readMotionThreshold(uint16_t& thres);
515 bool writeMotionThreshold(const uint16_t thres);
522 bool readAmbientShockThreshold(uint16_t& thres);
529 bool writeAmbientShockThreshold(const uint16_t thres);
530
537 bool readPresenceHysteresis(uint8_t& hyst);
544 bool writePresenceHysteresis(const uint8_t hyst);
551 bool readMotionHysteresis(uint8_t& hyst);
558 bool writeMotionHysteresis(const uint8_t hyst);
565 bool readAmbientShockHysteresis(uint8_t& hyst);
572 bool writeAmbientShockHysteresis(const uint8_t hyst);
573
580 bool readAlgorithmConfig(uint8_t& v);
582
585 bool softReset();
586
587protected:
588 bool read_embedded_register(const uint8_t ereg, uint8_t* rbuf, const uint32_t len);
589 bool write_embedded_register(const uint8_t ereg, const uint8_t* buf, const uint32_t len);
590 inline bool read_embedded_register8(const uint8_t ereg, uint8_t& v)
591 {
592 return read_embedded_register(ereg, &v, 1);
593 }
594 inline bool write_embedded_register8(const uint8_t ereg, const uint8_t v)
595 {
596 return write_embedded_register(ereg, &v, 1);
597 }
598 bool read_embedded_register16LE(const uint8_t ereg, uint16_t& v)
599 {
600 uint8_t rbuf[2]{};
601 if (read_embedded_register(ereg, rbuf, 2)) {
602 v = rbuf[0] | (rbuf[1] << 8);
603 return true;
604 }
605 return false;
606 }
607 bool write_embedded_register16LE(const uint8_t ereg, const uint16_t v)
608 {
609 uint8_t buf[2]{};
610 buf[0] = v & 0xFF;
611 buf[1] = (v >> 8) & 0xFF;
612 return write_embedded_register(ereg, buf, 2);
613 }
614
615 bool start_periodic_measurement();
616 bool start_periodic_measurement(const sths34pf80::Gain mode, const sths34pf80::ODR odr, const bool comp_type,
617 const bool abs);
618 bool stop_periodic_measurement();
619
620 bool write_odr(const sths34pf80::ODR odr);
621 bool write_algorithm_config(const uint8_t v);
622
623 bool is_data_ready();
624 bool read_measurement(sths34pf80::Data& d, const bool full = true);
625
626 bool guard_in_periodic(const char* fname);
627
628 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSTHS34PF80, sths34pf80::Data);
629
630private:
631 std::unique_ptr<m5::container::CircularBuffer<sths34pf80::Data>> _data{};
632 uint16_t _sensitivity{};
633 config_t _cfg{};
634};
635
636namespace sths34pf80 {
638namespace command {
639constexpr uint8_t LPF1_REG{0x0C}; // R/W
640constexpr uint8_t LPF2_REG{0x0D}; // R/W
641constexpr uint8_t WHO_AM_I_REG{0x0F}; // R
642constexpr uint8_t AVG_TRIM_REG{0x10}; // R/W
643constexpr uint8_t CTRL0_REG{0x17}; // R/W
644constexpr uint8_t SENS_DATA_REG{0x1D}; // R/W
645constexpr uint8_t CTRL1_REG{0x20}; // R/W
646constexpr uint8_t CTRL2_REG{0x21}; // R/W
647constexpr uint8_t CTRL3_REG{0x22}; // R/W
648constexpr uint8_t STATUS_REG{0x23}; // R
649constexpr uint8_t FUNC_STATUS_REG{0x25}; // R
650
651constexpr uint8_t TOBJECT_L_REG{0x26}; // R
652constexpr uint8_t TOBJECT_H_REG{0x27}; // R
653constexpr uint8_t TAMBIENT_L_REG{0x28}; // R
654constexpr uint8_t TAMBIENT_H_REG{0x29}; // R
655constexpr uint8_t TOBJ_COMP_L_REG{0x38}; // R
656constexpr uint8_t TOBJ_COMP_H_REG{0x39}; // R
657constexpr uint8_t TPRESENCE_L_REG{0x3A}; // R
658constexpr uint8_t TPRESENCE_H_REG{0x3B}; // R
659constexpr uint8_t TMOTION_L_REG{0x3C}; // R
660constexpr uint8_t TMOTION_H_REG{0x3D}; // R
661constexpr uint8_t TAMB_SHOCK_L_REG{0x3E}; // R
662constexpr uint8_t TAMB_SHOCK_H_REG{0x3F}; // R
663
664// Embedded functions
665constexpr uint8_t FUNC_CFG_ADDR_REG{0x08};
666constexpr uint8_t FUNC_CFG_DATA_REG{0x09};
667constexpr uint8_t PAGE_RW_REG{0x11};
668
669constexpr uint8_t PRESENCE_THS_REG{0x20};
670constexpr uint8_t MOTION_THS_REG{0x22};
671constexpr uint8_t TAMB_SHOCK_THS_REG{0x24};
672constexpr uint8_t HYST_MOTION_REG{0x26};
673constexpr uint8_t HYST_PRESENCE_REG{0x27};
674constexpr uint8_t ALGO_CONFIG_REG{0x28};
675constexpr uint8_t HYST_TAMB_SHOCK_REG{0x29};
676constexpr uint8_t RESET_ALGO_REG{0x2A};
677
678} // namespace command
680} // namespace sths34pf80
681
682} // namespace unit
683} // namespace m5
684#endif
STHS34PF80 unit.
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:349
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:258
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:292
int16_t ambient() const
Oldest TAMBIENT.
Definition unit_STHS34PF80.hpp:277
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:249
bool isPresence() const
Oldest presence detection.
Definition unit_STHS34PF80.hpp:312
bool softReset()
Software reset.
Definition unit_STHS34PF80.cpp:356
int16_t presence() const
Oldest TPRESENCE.
Definition unit_STHS34PF80.hpp:297
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:360
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:267
bool readAlgorithmConfig(uint8_t &v)
Read the algorithm configuration.
Definition unit_STHS34PF80.cpp:489
float ambientTemperature() const
Oldest ambient temperature.
Definition unit_STHS34PF80.hpp:282
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:307
bool isMotion() const
Oldest motion detection.
Definition unit_STHS34PF80.hpp:317
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:302
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:272
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:322
bool writePresenceThreshold(const uint16_t thres)
Write the threshold for presence detection.
Definition unit_STHS34PF80.cpp:377
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
config_t config()
Gets the configuration.
Definition unit_STHS34PF80.hpp:244
int16_t compensated_object() const
Oldest TOBJ_COMP.
Definition unit_STHS34PF80.hpp:287
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
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
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