M5Unit-INFRARED 0.1.0 git rev:aed3018
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
73enum class Gain : uint8_t {
74 Wide,
75 Default = 0x07,
76};
77
82enum class ODR : uint8_t {
83 PowerDown,
84 Rate0_25,
85 Rate0_5,
86 Rate1,
87 Rate2,
88 Rate4,
89 Rate8,
90 Rate15,
91 Rate30,
92};
93
98struct Data {
99 static constexpr uint8_t PRES_FLAG{0x04};
100 static constexpr uint8_t MOT_FLAG{0x02};
101 static constexpr uint8_t TAMB_SHOCK_FLAG{0x01};
102
115 std::array<uint8_t, 13> raw{};
116 uint16_t sensitivity{};
117
118 inline int16_t object() const
119 {
120 return static_cast<int16_t>((raw[1] << 8) | raw[0]);
121 }
122 inline float objectTemperature() const
123 {
124 return sensitivity ? object() / (float)sensitivity : std::numeric_limits<float>::quiet_NaN();
125 }
126 inline int16_t ambient() const
127 {
128 return static_cast<int16_t>((raw[3] << 8) | raw[2]);
129 }
130 inline float ambientTemperature() const
131 {
132 // It is possible withoutsensitivity, but the absence of sensitivity is an error
133 return sensitivity ? ambient() / 100.f /* Fixed value */ : std::numeric_limits<float>::quiet_NaN();
134 }
135 inline int16_t compensated_object() const
136 {
137 return static_cast<int16_t>((raw[5] << 8) | raw[4]);
138 }
139 inline float compensatedObjectTemperature() const
140 {
141 return sensitivity ? compensated_object() / (float)sensitivity : std::numeric_limits<float>::quiet_NaN();
142 }
143 inline int16_t presence() const
144 {
145 return static_cast<int16_t>((raw[7] << 8) | raw[6]);
146 }
147 inline int16_t motion() const
148 {
149 return static_cast<int16_t>((raw[9] << 8) | raw[8]);
150 }
151 inline int16_t ambient_shock() const
152 {
153 return static_cast<int16_t>((raw[11] << 8) | raw[10]);
154 }
155 inline bool isPresence() const
156 {
157 return raw[12] & PRES_FLAG;
158 }
159 inline bool isMotion() const
160 {
161 return raw[12] & MOT_FLAG;
162 }
163 inline bool isAmbientShock() const
164 {
165 return raw[12] & TAMB_SHOCK_FLAG;
166 }
167};
168} // namespace sths34pf80
169
174class UnitSTHS34PF80 : public Component, public PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data> {
175 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSTHS34PF80, 0x5A);
176
177public:
179 static sths34pf80::ODR maximum_odr(const sths34pf80::ObjectTemperatureAverage avg_tmos);
180
185 struct config_t {
187 bool start_periodic{true};
189 sths34pf80::Gain mode{sths34pf80::Gain::Default};
191 sths34pf80::ODR odr{sths34pf80::ODR::Rate30};
193 bool comp_type{true};
195 bool abs{false};
197 sths34pf80::AmbientTemperatureAverage avg_t{sths34pf80::AmbientTemperatureAverage::Samples8};
199 sths34pf80::ObjectTemperatureAverage avg_tmos{sths34pf80::ObjectTemperatureAverage::Samples32};
200 };
201
202 explicit UnitSTHS34PF80(const uint8_t addr = DEFAULT_ADDRESS)
203 : Component(addr), _data{new m5::container::CircularBuffer<sths34pf80::Data>(1)}
204 {
205 auto ccfg = component_config();
206 ccfg.clock = 400 * 1000U;
207 component_config(ccfg);
208 }
209 virtual ~UnitSTHS34PF80()
210 {
211 }
212
213 virtual bool begin() override;
214 virtual void update(const bool force = false) override;
215
218
220 {
221 return _cfg;
222 }
224 inline void config(const config_t& cfg)
225 {
226 _cfg = cfg;
227 }
229
233 uint16_t sensitivity() const
234 {
235 return _sensitivity;
236 }
238
242 inline int16_t object() const
243 {
244 return !empty() ? oldest().object() : 0;
245 }
247 inline float objectTemperature() const
248 {
249 return !empty() ? oldest().objectTemperature() : std::numeric_limits<float>::quiet_NaN();
250 }
252 inline int16_t ambient() const
253 {
254 return !empty() ? oldest().ambient() : 0;
255 }
257 inline float ambientTemperature() const
258 {
259 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
260 }
262 inline int16_t compensated_object() const
263 {
264 return !empty() ? oldest().compensated_object() : 0;
265 }
267 inline float compensatedObjectTemperature() const
268 {
269 return !empty() ? oldest().compensatedObjectTemperature() : std::numeric_limits<float>::quiet_NaN();
270 }
272 inline int16_t presence() const
273 {
274 return !empty() ? oldest().presence() : 0;
275 }
277 inline int16_t motion() const
278 {
279 return !empty() ? oldest().motion() : 0;
280 }
282 inline int16_t ambient_shock() const
283 {
284 return !empty() ? oldest().ambient_shock() : 0;
285 }
287 inline bool isPresence() const
288 {
289 return !empty() ? oldest().isPresence() : false;
290 }
292 inline bool isMotion() const
293 {
294 return !empty() ? oldest().isMotion() : false;
295 }
297 inline bool isAmbientShock() const
298 {
299 return !empty() ? oldest().isAmbientShock() : false;
300 }
302
305
325 const bool comp_type = true, const bool abs = false)
326 {
327 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::startPeriodicMeasurement(mode, odr,
328 comp_type, abs);
329 }
336 {
337 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::stopPeriodicMeasurement();
338 }
340
343
358
361
378
384 bool readGainMode(sths34pf80::Gain& mode);
391 bool writeGainMode(const sths34pf80::Gain mode);
392
398 bool readSensitivityRaw(int8_t& raw);
404 bool readSensitivity(uint16_t& value);
411 bool writeSensitivityRaw(const int8_t raw);
418 bool writeSensitivity(const uint16_t value);
419
427
431
438 bool resetAlgorithm();
439
462
469 bool readPresenceThreshold(uint16_t& thres);
476 bool writePresenceThreshold(const uint16_t thres);
483 bool readMotionThreshold(uint16_t& thres);
490 bool writeMotionThreshold(const uint16_t thres);
497 bool readAmbientShockThreshold(uint16_t& thres);
504 bool writeAmbientShockThreshold(const uint16_t thres);
505
512 bool readPresenceHysteresis(uint8_t& hyst);
519 bool writePresenceHysteresis(const uint8_t hyst);
526 bool readMotionHysteresis(uint8_t& hyst);
533 bool writeMotionHysteresis(const uint8_t hyst);
540 bool readAmbientShockHysteresis(uint8_t& hyst);
547 bool writeAmbientShockHysteresis(const uint8_t hyst);
548
555 bool readAlgorithmConfig(uint8_t& v);
557
559 bool softReset();
560
561protected:
562 bool read_embedded_register(const uint8_t ereg, uint8_t* rbuf, const uint32_t len);
563 bool write_embedded_register(const uint8_t ereg, const uint8_t* buf, const uint32_t len);
564 inline bool read_embedded_register8(const uint8_t ereg, uint8_t& v)
565 {
566 return read_embedded_register(ereg, &v, 1);
567 }
568 inline bool write_embedded_register8(const uint8_t ereg, const uint8_t v)
569 {
570 return write_embedded_register(ereg, &v, 1);
571 }
572 bool read_embedded_register16LE(const uint8_t ereg, uint16_t& v)
573 {
574 uint8_t rbuf[2]{};
575 if (read_embedded_register(ereg, rbuf, 2)) {
576 v = rbuf[0] | (rbuf[1] << 8);
577 return true;
578 }
579 return false;
580 }
581 bool write_embedded_register16LE(const uint8_t ereg, const uint16_t v)
582 {
583 uint8_t buf[2]{};
584 buf[0] = v & 0xFF;
585 buf[1] = (v >> 8) & 0xFF;
586 return write_embedded_register(ereg, buf, 2);
587 }
588
589 bool start_periodic_measurement();
590 bool start_periodic_measurement(const sths34pf80::Gain mode, const sths34pf80::ODR odr, const bool comp_type,
591 const bool abs);
592 bool stop_periodic_measurement();
593
594 bool write_odr(const sths34pf80::ODR odr);
595 bool write_algorithm_config(const uint8_t v);
596
597 bool is_data_ready();
598 bool read_measurement(sths34pf80::Data& d, const bool full = true);
599
600 bool guard_in_periodic(const char* fname);
601
602 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSTHS34PF80, sths34pf80::Data);
603
604private:
605 std::unique_ptr<m5::container::CircularBuffer<sths34pf80::Data>> _data{};
606 uint16_t _sensitivity{};
607 config_t _cfg{};
608};
609
610namespace sths34pf80 {
612namespace command {
613constexpr uint8_t LPF1_REG{0x0C}; // R/W
614constexpr uint8_t LPF2_REG{0x0D}; // R/W
615constexpr uint8_t WHO_AM_I_REG{0x0F}; // R
616constexpr uint8_t AVG_TRIM_REG{0x10}; // R/W
617constexpr uint8_t CTRL0_REG{0x17}; // R/W
618constexpr uint8_t SENS_DATA_REG{0x1D}; // R/W
619constexpr uint8_t CTRL1_REG{0x20}; // R/W
620constexpr uint8_t CTRL2_REG{0x21}; // R/W
621constexpr uint8_t CTRL3_REG{0x22}; // R/W
622constexpr uint8_t STATUS_REG{0x23}; // R
623constexpr uint8_t FUNC_STATUS_REG{0x25}; // R
624
625constexpr uint8_t TOBJECT_L_REG{0x26}; // R
626constexpr uint8_t TOBJECT_H_REG{0x27}; // R
627constexpr uint8_t TAMBIENT_L_REG{0x28}; // R
628constexpr uint8_t TAMBIENT_H_REG{0x29}; // R
629constexpr uint8_t TOBJ_COMP_L_REG{0x38}; // R
630constexpr uint8_t TOBJ_COMP_H_REG{0x39}; // R
631constexpr uint8_t TPRESENCE_L_REG{0x3A}; // R
632constexpr uint8_t TPRESENCE_H_REG{0x3B}; // R
633constexpr uint8_t TMOTION_L_REG{0x3C}; // R
634constexpr uint8_t TMOTION_H_REG{0x3D}; // R
635constexpr uint8_t TAMB_SHOCK_L_REG{0x3E}; // R
636constexpr uint8_t TAMB_SHOCK_H_REG{0x3F}; // R
637
638// Embedded functions
639constexpr uint8_t FUNC_CFG_ADDR_REG{0x08};
640constexpr uint8_t FUNC_CFG_DATA_REG{0x09};
641constexpr uint8_t PAGE_RW_REG{0x11};
642
643constexpr uint8_t PRESENCE_THS_REG{0x20};
644constexpr uint8_t MOTION_THS_REG{0x22};
645constexpr uint8_t TAMB_SHOCK_THS_REG{0x24};
646constexpr uint8_t HYST_MOTION_REG{0x26};
647constexpr uint8_t HYST_PRESENCE_REG{0x27};
648constexpr uint8_t ALGO_CONFIG_REG{0x28};
649constexpr uint8_t HYST_TAMB_SHOCK_REG{0x29};
650constexpr uint8_t RESET_ALGO_REG{0x2A};
651
652} // namespace command
654} // namespace sths34pf80
655
656} // namespace unit
657} // namespace m5
658#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:324
bool writeMotionHysteresis(const uint8_t hyst)
Write the hysteresis for motion detection.
Definition unit_STHS34PF80.cpp:445
uint16_t sensitivity() const
Gets the inner sensitivity.
Definition unit_STHS34PF80.hpp:233
bool readPresenceHysteresis(uint8_t &hyst)
Read the hysteresis for presence detection.
Definition unit_STHS34PF80.cpp:418
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:367
bool resetAlgorithm()
Reset the algorithm.
Definition unit_STHS34PF80.cpp:362
bool writePresenceHysteresis(const uint8_t hyst)
Write the hysteresis for presence detection.
Definition unit_STHS34PF80.cpp:423
bool writeSensitivityRaw(const int8_t raw)
Write the raw sensitivity.
Definition unit_STHS34PF80.cpp:316
float compensatedObjectTemperature() const
Oldest compensated object temperature.
Definition unit_STHS34PF80.hpp:267
int16_t ambient() const
Oldest TAMBIENT.
Definition unit_STHS34PF80.hpp:252
bool readAmbientShockThreshold(uint16_t &thres)
Read the threshold for ambient shock detection.
Definition unit_STHS34PF80.cpp:401
void config(const config_t &cfg)
Set the configration.
Definition unit_STHS34PF80.hpp:224
bool isPresence() const
Oldest presence detefction.
Definition unit_STHS34PF80.hpp:287
bool softReset()
Software reset.
Definition unit_STHS34PF80.cpp:351
int16_t presence() const
Oldest TPRESENCE.
Definition unit_STHS34PF80.hpp:272
bool writeLowPassFilter(const sths34pf80::LowPassFilter lpf_p_m, const sths34pf80::LowPassFilter lpf_m, const sths34pf80::LowPassFilter lpf_p, const sths34pf80::LowPassFilter lpf_a)
Write the low pass filter.
Definition unit_STHS34PF80.cpp:229
bool writeAverageTrim(const sths34pf80::AmbientTemperatureAverage avg_t, const sths34pf80::ObjectTemperatureAverage avg_tmos)
Write the avarage 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:335
bool readAmbientShockHysteresis(uint8_t &hyst)
Read the hysteresis for ambient shock detection.
Definition unit_STHS34PF80.cpp:462
int16_t object() const
Oldest TOBJECT.
Definition unit_STHS34PF80.hpp:242
bool readAlgorithmConfig(uint8_t &v)
Read the algorithm configuration.
Definition unit_STHS34PF80.cpp:484
float ambientTemperature() const
Oldest ambient temperature.
Definition unit_STHS34PF80.hpp:257
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:329
bool readAverageTrim(sths34pf80::AmbientTemperatureAverage &avg_t, sths34pf80::ObjectTemperatureAverage &avg_tmos)
Read the avarage trim.
Definition unit_STHS34PF80.cpp:251
bool readObjectDataRate(sths34pf80::ODR &odr)
Read the ODR.
Definition unit_STHS34PF80.cpp:338
int16_t ambient_shock() const
Oldest TAMB_SHOCK.
Definition unit_STHS34PF80.hpp:282
bool isMotion() const
Oldest motion detefction.
Definition unit_STHS34PF80.hpp:292
bool writeAmbientShockThreshold(const uint16_t thres)
Write the threshold for ambient shock detection.
Definition unit_STHS34PF80.cpp:406
int16_t motion() const
Oldest TMOTION.
Definition unit_STHS34PF80.hpp:277
bool writeGainMode(const sths34pf80::Gain mode)
Write the gain mode.
Definition unit_STHS34PF80.cpp:288
bool readSensitivity(uint16_t &value)
Read the raw sensitivity.
Definition unit_STHS34PF80.cpp:305
bool readMotionThreshold(uint16_t &thres)
Read the threshold for motion detection.
Definition unit_STHS34PF80.cpp:384
float objectTemperature() const
Oldest object temperature.
Definition unit_STHS34PF80.hpp:247
bool writeAmbientShockHysteresis(const uint8_t hyst)
Write the hysteresis for ambient shock detection.
Definition unit_STHS34PF80.cpp:467
bool isAmbientShock() const
Oldest ambient shock detefction.
Definition unit_STHS34PF80.hpp:297
bool writePresenceThreshold(const uint16_t thres)
Write the threshold for presence detection.
Definition unit_STHS34PF80.cpp:372
bool readMotionHysteresis(uint8_t &hyst)
Read the hysteresis for motion detection.
Definition unit_STHS34PF80.cpp:440
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:389
config_t config()
Gets the configration.
Definition unit_STHS34PF80.hpp:219
int16_t compensated_object() const
Oldest TOBJ_COMP.
Definition unit_STHS34PF80.hpp:262
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:185
bool comp_type
Using compensated value if start on begin (Valid only if mode is default mode)
Definition unit_STHS34PF80.hpp:193
bool abs
Using absolute value for detect presence if start on begin.
Definition unit_STHS34PF80.hpp:195
sths34pf80::ODR odr
ODR if start on begin.
Definition unit_STHS34PF80.hpp:191
sths34pf80::ObjectTemperatureAverage avg_tmos
Object samples if start on begin.
Definition unit_STHS34PF80.hpp:199
bool start_periodic
Start periodic measurement on begin?
Definition unit_STHS34PF80.hpp:187
sths34pf80::AmbientTemperatureAverage avg_t
Amibient samples if start on begin.
Definition unit_STHS34PF80.hpp:197
sths34pf80::Gain mode
Gain mode if start on begin.
Definition unit_STHS34PF80.hpp:189
Measurement data group.
Definition unit_STHS34PF80.hpp:98
std::array< uint8_t, 13 > raw
Definition unit_STHS34PF80.hpp:115
uint16_t sensitivity
Sensitivity value (NOT RAW)
Definition unit_STHS34PF80.hpp:116
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:82
@ 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:73
@ 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