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>
82enum class ODR : uint8_t {
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};
115 std::array<uint8_t, 13>
raw{};
118 inline int16_t object()
const
120 return static_cast<int16_t
>((
raw[1] << 8) |
raw[0]);
122 inline float objectTemperature()
const
126 inline int16_t ambient()
const
128 return static_cast<int16_t
>((
raw[3] << 8) |
raw[2]);
130 inline float ambientTemperature()
const
133 return sensitivity ? ambient() / 100.f : std::numeric_limits<float>::quiet_NaN();
135 inline int16_t compensated_object()
const
137 return static_cast<int16_t
>((
raw[5] << 8) |
raw[4]);
139 inline float compensatedObjectTemperature()
const
143 inline int16_t presence()
const
145 return static_cast<int16_t
>((
raw[7] << 8) |
raw[6]);
147 inline int16_t motion()
const
149 return static_cast<int16_t
>((
raw[9] << 8) |
raw[8]);
151 inline int16_t ambient_shock()
const
153 return static_cast<int16_t
>((
raw[11] << 8) |
raw[10]);
155 inline bool isPresence()
const
157 return raw[12] & PRES_FLAG;
159 inline bool isMotion()
const
161 return raw[12] & MOT_FLAG;
163 inline bool isAmbientShock()
const
165 return raw[12] & TAMB_SHOCK_FLAG;
174class UnitSTHS34PF80 :
public Component,
public PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data> {
175 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSTHS34PF80, 0x5A);
179 static sths34pf80::ODR
maximum_odr(
const sths34pf80::ObjectTemperatureAverage avg_tmos);
203 : Component(addr), _data{new
m5::container::CircularBuffer<
sths34pf80::Data>(1)}
205 auto ccfg = component_config();
206 ccfg.clock = 400 * 1000U;
207 component_config(ccfg);
209 virtual ~UnitSTHS34PF80()
213 virtual bool begin()
override;
214 virtual void update(
const bool force =
false)
override;
244 return !empty() ? oldest().object() : 0;
249 return !empty() ? oldest().objectTemperature() : std::numeric_limits<float>::quiet_NaN();
254 return !empty() ? oldest().ambient() : 0;
259 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
264 return !empty() ? oldest().compensated_object() : 0;
269 return !empty() ? oldest().compensatedObjectTemperature() : std::numeric_limits<float>::quiet_NaN();
274 return !empty() ? oldest().presence() : 0;
279 return !empty() ? oldest().motion() : 0;
284 return !empty() ? oldest().ambient_shock() : 0;
289 return !empty() ? oldest().isPresence() :
false;
294 return !empty() ? oldest().isMotion() :
false;
299 return !empty() ? oldest().isAmbientShock() :
false;
325 const bool comp_type =
true,
const bool abs =
false)
327 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::startPeriodicMeasurement(mode, odr,
337 return PeriodicMeasurementAdapter<UnitSTHS34PF80, sths34pf80::Data>::stopPeriodicMeasurement();
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)
566 return read_embedded_register(ereg, &v, 1);
568 inline bool write_embedded_register8(
const uint8_t ereg,
const uint8_t v)
570 return write_embedded_register(ereg, &v, 1);
572 bool read_embedded_register16LE(
const uint8_t ereg, uint16_t& v)
575 if (read_embedded_register(ereg, rbuf, 2)) {
576 v = rbuf[0] | (rbuf[1] << 8);
581 bool write_embedded_register16LE(
const uint8_t ereg,
const uint16_t v)
585 buf[1] = (v >> 8) & 0xFF;
586 return write_embedded_register(ereg, buf, 2);
589 bool start_periodic_measurement();
590 bool start_periodic_measurement(
const sths34pf80::Gain mode,
const sths34pf80::ODR odr,
const bool comp_type,
592 bool stop_periodic_measurement();
594 bool write_odr(
const sths34pf80::ODR odr);
595 bool write_algorithm_config(
const uint8_t v);
597 bool is_data_ready();
598 bool read_measurement(sths34pf80::Data& d,
const bool full =
true);
600 bool guard_in_periodic(
const char* fname);
602 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSTHS34PF80, sths34pf80::Data);
605 std::unique_ptr<m5::container::CircularBuffer<sths34pf80::Data>> _data{};
606 uint16_t _sensitivity{};
613constexpr uint8_t LPF1_REG{0x0C};
614constexpr uint8_t LPF2_REG{0x0D};
615constexpr uint8_t WHO_AM_I_REG{0x0F};
616constexpr uint8_t AVG_TRIM_REG{0x10};
617constexpr uint8_t CTRL0_REG{0x17};
618constexpr uint8_t SENS_DATA_REG{0x1D};
619constexpr uint8_t CTRL1_REG{0x20};
620constexpr uint8_t CTRL2_REG{0x21};
621constexpr uint8_t CTRL3_REG{0x22};
622constexpr uint8_t STATUS_REG{0x23};
623constexpr uint8_t FUNC_STATUS_REG{0x25};
625constexpr uint8_t TOBJECT_L_REG{0x26};
626constexpr uint8_t TOBJECT_H_REG{0x27};
627constexpr uint8_t TAMBIENT_L_REG{0x28};
628constexpr uint8_t TAMBIENT_H_REG{0x29};
629constexpr uint8_t TOBJ_COMP_L_REG{0x38};
630constexpr uint8_t TOBJ_COMP_H_REG{0x39};
631constexpr uint8_t TPRESENCE_L_REG{0x3A};
632constexpr uint8_t TPRESENCE_H_REG{0x3B};
633constexpr uint8_t TMOTION_L_REG{0x3C};
634constexpr uint8_t TMOTION_H_REG{0x3D};
635constexpr uint8_t TAMB_SHOCK_L_REG{0x3E};
636constexpr uint8_t TAMB_SHOCK_H_REG{0x3F};
639constexpr uint8_t FUNC_CFG_ADDR_REG{0x08};
640constexpr uint8_t FUNC_CFG_DATA_REG{0x09};
641constexpr uint8_t PAGE_RW_REG{0x11};
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};
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.
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
@ 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:82
@ PowerDown
Power-down mode.
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
@ Samples8
8 samples (as default)
LowPassFilter
Low-pass filter configuration (LPF_)
Definition unit_STHS34PF80.hpp:32