10#ifndef M5_UNIT_INFRARED_UNIT_STHS34PF80_HPP
11#define M5_UNIT_INFRARED_UNIT_STHS34PF80_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
84enum class ODR : uint8_t {
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};
117 std::array<uint8_t, 13>
raw{};
123 return static_cast<int16_t
>((
raw[1] << 8) |
raw[0]);
133 return static_cast<int16_t
>((
raw[3] << 8) |
raw[2]);
144 return static_cast<int16_t
>((
raw[5] << 8) |
raw[4]);
150 : std::numeric_limits<float>::quiet_NaN();
155 return static_cast<int16_t
>((
raw[7] << 8) |
raw[6]);
160 return static_cast<int16_t
>((
raw[9] << 8) |
raw[8]);
165 return static_cast<int16_t
>((
raw[11] << 8) |
raw[10]);
170 return raw[12] & PRES_FLAG;
175 return raw[12] & MOT_FLAG;
180 return raw[12] & TAMB_SHOCK_FLAG;
191class UnitSTHS34PF80 :
public Component,
public PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data> {
198 static sths34pf80::ODR
maximum_odr(
const sths34pf80::ObjectTemperatureAverage avg_tmos);
224 : Component(addr), _data{new
m5::container::CircularBuffer<
sths34pf80::Data>(1)}
226 auto ccfg = component_config();
227 ccfg.clock = 400 * 1000U;
228 component_config(ccfg);
236 virtual bool begin()
override;
239 virtual void update(
const bool force =
false)
override;
269 return !empty() ? oldest().object() : 0;
274 return !empty() ? oldest().objectTemperature() : std::numeric_limits<float>::quiet_NaN();
279 return !empty() ? oldest().ambient() : 0;
284 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
289 return !empty() ? oldest().compensated_object() : 0;
294 return !empty() ? oldest().compensatedObjectTemperature() : std::numeric_limits<float>::quiet_NaN();
299 return !empty() ? oldest().presence() : 0;
304 return !empty() ? oldest().motion() : 0;
309 return !empty() ? oldest().ambient_shock() : 0;
314 return !empty() ? oldest().isPresence() :
false;
319 return !empty() ? oldest().isMotion() :
false;
324 return !empty() ? oldest().isAmbientShock() :
false;
350 const bool comp_type =
true,
const bool abs =
false)
352 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::startPeriodicMeasurement(mode, odr,
362 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::stopPeriodicMeasurement();
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)
592 return read_embedded_register(ereg, &v, 1);
594 inline bool write_embedded_register8(
const uint8_t ereg,
const uint8_t v)
596 return write_embedded_register(ereg, &v, 1);
598 bool read_embedded_register16LE(
const uint8_t ereg, uint16_t& v)
601 if (read_embedded_register(ereg, rbuf, 2)) {
602 v = rbuf[0] | (rbuf[1] << 8);
607 bool write_embedded_register16LE(
const uint8_t ereg,
const uint16_t v)
611 buf[1] = (v >> 8) & 0xFF;
612 return write_embedded_register(ereg, buf, 2);
615 bool start_periodic_measurement();
616 bool start_periodic_measurement(
const sths34pf80::Gain mode,
const sths34pf80::ODR odr,
const bool comp_type,
618 bool stop_periodic_measurement();
620 bool write_odr(
const sths34pf80::ODR odr);
621 bool write_algorithm_config(
const uint8_t v);
623 bool is_data_ready();
624 bool read_measurement(sths34pf80::Data& d,
const bool full =
true);
626 bool guard_in_periodic(
const char* fname);
628 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(
UnitSTHS34PF80, sths34pf80::Data);
631 std::unique_ptr<m5::container::CircularBuffer<sths34pf80::Data>> _data{};
632 uint16_t _sensitivity{};
639constexpr uint8_t LPF1_REG{0x0C};
640constexpr uint8_t LPF2_REG{0x0D};
641constexpr uint8_t WHO_AM_I_REG{0x0F};
642constexpr uint8_t AVG_TRIM_REG{0x10};
643constexpr uint8_t CTRL0_REG{0x17};
644constexpr uint8_t SENS_DATA_REG{0x1D};
645constexpr uint8_t CTRL1_REG{0x20};
646constexpr uint8_t CTRL2_REG{0x21};
647constexpr uint8_t CTRL3_REG{0x22};
648constexpr uint8_t STATUS_REG{0x23};
649constexpr uint8_t FUNC_STATUS_REG{0x25};
651constexpr uint8_t TOBJECT_L_REG{0x26};
652constexpr uint8_t TOBJECT_H_REG{0x27};
653constexpr uint8_t TAMBIENT_L_REG{0x28};
654constexpr uint8_t TAMBIENT_H_REG{0x29};
655constexpr uint8_t TOBJ_COMP_L_REG{0x38};
656constexpr uint8_t TOBJ_COMP_H_REG{0x39};
657constexpr uint8_t TPRESENCE_L_REG{0x3A};
658constexpr uint8_t TPRESENCE_H_REG{0x3B};
659constexpr uint8_t TMOTION_L_REG{0x3C};
660constexpr uint8_t TMOTION_H_REG{0x3D};
661constexpr uint8_t TAMB_SHOCK_L_REG{0x3E};
662constexpr uint8_t TAMB_SHOCK_H_REG{0x3F};
665constexpr uint8_t FUNC_CFG_ADDR_REG{0x08};
666constexpr uint8_t FUNC_CFG_DATA_REG{0x09};
667constexpr uint8_t PAGE_RW_REG{0x11};
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};
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.
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
@ Samples32
32 samples, 25 RMS noise
@ Samples256
256 samples, 15 RMS noise
@ Samples1024
1024 samples, 11 RMS noise
@ Samples128
128 samples, 20 RMS noise (as default)
@ Samples2048
2048 samples, 10 RMS noise
@ Samples512
512 samples, 12 RMS noise
ODR
Output data rate configuration.
Definition unit_STHS34PF80.hpp:84
@ PowerDown
Power-down mode.
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
@ Samples8
8 samples (as default)
LowPassFilter
Low-pass filter configuration (LPF_)
Definition unit_STHS34PF80.hpp:32