M5Unit-ENV 1.4.0 git rev:c1b5980
Loading...
Searching...
No Matches
unit_SHT40.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_ENV_UNIT_SHT40_HPP
11#define M5_UNIT_ENV_UNIT_SHT40_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16
17namespace m5 {
18namespace unit {
19
24namespace sht40 {
25
30enum class Precision : uint8_t {
31 High,
32 Medium,
33 Low
34};
35
43enum class Heater : uint8_t {
44 Long,
45 Short,
46 None
47};
48
54enum class HeaterPower : uint8_t {
55 High = 0,
56 Medium = 1,
57 Low = 2,
58};
59
64enum class HeaterDuration : uint8_t {
65 Long = 0,
66 Short = 1,
67};
68
73struct Data {
74 std::array<uint8_t, 6> raw{};
75 bool heater{};
76
78 inline float temperature() const
79 {
80 return celsius();
81 }
82 float celsius() const;
83 float fahrenheit() const;
84 float humidity() const;
85};
86
87} // namespace sht40
88
93class UnitSHT40 : public Component, public PeriodicMeasurementAdapter<UnitSHT40, sht40::Data> {
94 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSHT40, 0x44);
95
96public:
101 struct config_t {
103 bool start_periodic{true};
105 sht40::Precision precision{sht40::Precision::High};
107 sht40::Heater heater{sht40::Heater::None};
109 float heater_duty{0.05f};
111 bool use_heater{false};
113 sht40::HeaterPower heater_power{sht40::HeaterPower::High};
115 sht40::HeaterDuration heater_duration{sht40::HeaterDuration::Short};
116 };
117
118 explicit UnitSHT40(const uint8_t addr = DEFAULT_ADDRESS)
119 : Component(addr), _data{new m5::container::CircularBuffer<sht40::Data>(1)}
120 {
121 auto ccfg = component_config();
122 ccfg.clock = 400 * 1000U;
123 component_config(ccfg);
124 }
125 virtual ~UnitSHT40()
126 {
127 }
128
129 virtual bool begin() override;
130 virtual void update(const bool force = false) override;
131
134
135 inline config_t config() const
136 {
137 return _cfg;
138 }
140 inline void config(const config_t& cfg)
141 {
142 _cfg = cfg;
143 }
145
149 inline float temperature() const
150 {
151 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
152 }
154 inline float celsius() const
155 {
156 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
157 }
159 inline float fahrenheit() const
160 {
161 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
162 }
164 inline float humidity() const
165 {
166 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
167 }
169
172
184 inline bool startPeriodicMeasurement(const sht40::Precision precision, const sht40::Heater heater,
185 const float duty = 0.05f)
186 {
187 return PeriodicMeasurementAdapter<UnitSHT40, sht40::Data>::startPeriodicMeasurement(precision, heater, duty);
188 }
199 const float duty = 0.05f)
200 {
201 return PeriodicMeasurementAdapter<UnitSHT40, sht40::Data>::startPeriodicMeasurement(
202 static_cast<sht40::Precision>(power), static_cast<sht40::Heater>(duration), duty);
203 }
210 {
211 return startPeriodicMeasurement(_precision, _heater, _duty);
212 }
218 {
219 return PeriodicMeasurementAdapter<UnitSHT40, sht40::Data>::stopPeriodicMeasurement();
220 }
222
225
239 bool measureSingleshot(sht40::Data& d, const sht40::Precision precision = sht40::Precision::High,
240 const sht40::Heater heater = sht40::Heater::None);
252 bool measureSingleshot(sht40::Data& d, const sht40::HeaterPower power, const sht40::HeaterDuration duration);
253
255
258
262 bool softReset();
271 bool generalReset();
273
276
283 bool readSerialNumber(uint32_t& serialNumber);
291 bool readSerialNumber(char* serialNumber);
293
294protected:
295 bool start_periodic_measurement(const sht40::Precision precision, const sht40::Heater heater, const float duty);
296 bool stop_periodic_measurement();
297 bool read_measurement(sht40::Data& d);
298 void reset_status();
299 bool soft_reset();
300
301 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSHT40, sht40::Data);
302
303protected:
304 std::unique_ptr<m5::container::CircularBuffer<sht40::Data>> _data{};
305 uint8_t _cmd{}, _measureCmd{};
306 types::elapsed_time_t _latest_heater{}, _interval_heater{};
307 uint32_t _duration_measure{}, _duration_heater{};
308
309private:
310 config_t _cfg{};
311 sht40::Precision _precision{sht40::Precision::High};
312 sht40::Heater _heater{sht40::Heater::None};
313 float _duty{0.05f};
314};
315
317namespace sht40 {
318namespace command {
319constexpr uint8_t MEASURE_HIGH_HEATER_1S{0x39};
320constexpr uint8_t MEASURE_HIGH_HEATER_100MS{0x32};
321constexpr uint8_t MEASURE_HIGH{0xFD};
322
323constexpr uint8_t MEASURE_MEDIUM_HEATER_1S{0x2F};
324constexpr uint8_t MEASURE_MEDIUM_HEATER_100MS{0x24};
325constexpr uint8_t MEASURE_MEDIUM{0xF6};
326
327constexpr uint8_t MEASURE_LOW_HEATER_1S{0x1E};
328constexpr uint8_t MEASURE_LOW_HEATER_100MS{0x15};
329constexpr uint8_t MEASURE_LOW{0xE0};
330
331constexpr uint8_t GET_SERIAL_NUMBER{0x89};
332constexpr uint8_t SOFT_RESET{0x94};
333} // namespace command
334} // namespace sht40
336} // namespace unit
337} // namespace m5
338#endif
Temperature and humidity, sensor unit.
Definition unit_SHT40.hpp:93
bool softReset()
Soft reset.
Definition unit_SHT40.cpp:240
bool readSerialNumber(uint32_t &serialNumber)
Read the serial number value.
Definition unit_SHT40.cpp:273
float humidity() const
Oldest measured humidity (RH)
Definition unit_SHT40.hpp:164
config_t config() const
Gets the configuration.
Definition unit_SHT40.hpp:135
bool generalReset()
General reset.
Definition unit_SHT40.cpp:261
void config(const config_t &cfg)
Set the configuration.
Definition unit_SHT40.hpp:140
bool startPeriodicMeasurement(const sht40::HeaterPower power, const sht40::HeaterDuration duration, const float duty=0.05f)
Start periodic measurement with heater.
Definition unit_SHT40.hpp:198
bool measureSingleshot(sht40::Data &d, const sht40::Precision precision=sht40::Precision::High, const sht40::Heater heater=sht40::Heater::None)
Measurement single shot.
Definition unit_SHT40.cpp:202
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_SHT40.hpp:159
bool startPeriodicMeasurement(const sht40::Precision precision, const sht40::Heater heater, const float duty=0.05f)
Start periodic measurement.
Definition unit_SHT40.hpp:184
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_SHT40.hpp:217
bool startPeriodicMeasurement()
Start periodic measurement using previous settings.
Definition unit_SHT40.hpp:209
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_SHT40.hpp:154
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_SHT40.hpp:149
Top level namespace of M5Stack.
For SHT40.
Unit-related namespace.
Settings for begin.
Definition unit_SHT40.hpp:101
float heater_duty
Heater duty cycle if start on begin [~ 0.05f].
Definition unit_SHT40.hpp:109
sht40::Precision precision
Precision level if start on begin.
Definition unit_SHT40.hpp:105
bool start_periodic
Start periodic measurement on begin?
Definition unit_SHT40.hpp:103
bool use_heater
Enable heater in periodic mode (takes precedence over heater field)
Definition unit_SHT40.hpp:111
sht40::HeaterDuration heater_duration
Heater duration if start on begin (used when use_heater is true)
Definition unit_SHT40.hpp:115
sht40::Heater heater
Definition unit_SHT40.hpp:107
sht40::HeaterPower heater_power
Heater power if start on begin (used when use_heater is true)
Definition unit_SHT40.hpp:113
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Measurement data group.
Definition unit_SHT40.hpp:73
float celsius() const
temperature (Celsius)
Definition unit_SHT40.cpp:61
std::array< uint8_t, 6 > raw
RAW data.
Definition unit_SHT40.hpp:74
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_SHT40.cpp:66
bool heater
Measured data after heater is activated if true.
Definition unit_SHT40.hpp:75
float humidity() const
humidity (RH)
Definition unit_SHT40.cpp:72
float temperature() const
temperature (Celsius)
Definition unit_SHT40.hpp:78
HeaterDuration
Heater activation duration.
Definition unit_SHT40.hpp:64
HeaterPower
Heater power level.
Definition unit_SHT40.hpp:54
Precision
precision level
Definition unit_SHT40.hpp:30
Heater
Heater behavior.
Definition unit_SHT40.hpp:43
@ Short
Activate heater for 0.1s.
@ Long
Activate heater for 1s.