M5Unit-ENV 1.4.0 git rev:c1b5980
Loading...
Searching...
No Matches
unit_SHT30.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_SHT30_HPP
11#define M5_UNIT_ENV_UNIT_SHT30_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 sht30 {
29enum class Repeatability : uint8_t {
30 High,
31 Medium,
32 Low
33};
34
39enum class MPS : uint8_t {
40 Half,
41 One,
42 Two,
43 Four,
44 Ten,
45};
46
54struct Status {
56 inline bool alertPending() const
57 {
58 return value & (1U << 15);
59 }
61 inline bool heater() const
62 {
63 return value & (1U << 13);
64 }
66 inline bool trackingAlertRH() const
67 {
68 return value & (1U << 11);
69 }
71 inline bool trackingAlert() const
72 {
73 return value & (1U << 10);
74 }
76 inline bool reset() const
77 {
78 return value & (1U << 4);
79 }
81 inline bool command() const
82 {
83 return value & (1U << 1);
84 }
86 inline bool checksum() const
87 {
88 return value & (1U << 0);
89 }
90 uint16_t value{};
91};
92
97struct Data {
98 std::array<uint8_t, 6> raw{};
100 inline float temperature() const
101 {
102 return celsius();
103 }
104 float celsius() const;
105 float fahrenheit() const;
106 float humidity() const;
107};
108
109} // namespace sht30
110
115class UnitSHT30 : public Component, public PeriodicMeasurementAdapter<UnitSHT30, sht30::Data> {
116 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSHT30, 0x44);
117
118public:
123 struct config_t {
125 bool start_periodic{true};
127 sht30::MPS mps{sht30::MPS::One};
129 sht30::Repeatability repeatability{sht30::Repeatability::High};
131 bool start_heater{false};
132 };
133
134 explicit UnitSHT30(const uint8_t addr = DEFAULT_ADDRESS)
135 : Component(addr), _data{new m5::container::CircularBuffer<sht30::Data>(1)}
136 {
137 auto ccfg = component_config();
138 ccfg.clock = 400 * 1000U;
139 component_config(ccfg);
140 }
141 virtual ~UnitSHT30()
142 {
143 }
144
145 virtual bool begin() override;
146 virtual void update(const bool force = false) override;
147
150
151 inline config_t config() const
152 {
153 return _cfg;
154 }
156 inline void config(const config_t& cfg)
157 {
158 _cfg = cfg;
159 }
161
165 inline float temperature() const
166 {
167 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
168 }
170 inline float celsius() const
171 {
172 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
173 }
175 inline float fahrenheit() const
176 {
177 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
178 }
180 inline float humidity() const
181 {
182 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
183 }
185
188
195 {
196 return PeriodicMeasurementAdapter<UnitSHT30, sht30::Data>::startPeriodicMeasurement(mps, rep);
197 }
204 {
205 return PeriodicMeasurementAdapter<UnitSHT30, sht30::Data>::startPeriodicMeasurement();
206 }
212 {
213 return PeriodicMeasurementAdapter<UnitSHT30, sht30::Data>::stopPeriodicMeasurement();
214 }
216
219
231 bool measureSingleshot(sht30::Data& d, const sht30::Repeatability rep = sht30::Repeatability::High,
232 const bool stretch = false);
234
242
245
252 bool softReset();
261 bool generalReset();
263
266
270 bool startHeater();
275 bool stopHeater();
277
280
285 bool readStatus(sht30::Status& s);
291 bool clearStatus();
293
296
303 bool readSerialNumber(uint32_t& serialNumber);
311 bool readSerialNumber(char* serialNumber);
313
314protected:
315 bool start_periodic_measurement(const sht30::MPS mps, const sht30::Repeatability rep);
316 inline bool start_periodic_measurement()
317 {
318 return start_periodic_measurement(_mps, _rep);
319 }
320 bool stop_periodic_measurement();
321 bool read_measurement(sht30::Data& d);
322
323 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSHT30, sht30::Data);
324
325protected:
326 std::unique_ptr<m5::container::CircularBuffer<sht30::Data>> _data{};
327 config_t _cfg{};
328 sht30::MPS _mps{};
329 sht30::Repeatability _rep{};
330};
331
333namespace sht30 {
334namespace command {
335// Measurement Commands for Single Shot Data Acquisition Mode
336constexpr uint16_t SINGLE_SHOT_ENABLE_STRETCH_HIGH{0x2C06};
337constexpr uint16_t SINGLE_SHOT_ENABLE_STRETCH_MEDIUM{0x2C0D};
338constexpr uint16_t SINGLE_SHOT_ENABLE_STRETCH_LOW{0x2C10};
339constexpr uint16_t SINGLE_SHOT_DISABLE_STRETCH_HIGH{0x2400};
340constexpr uint16_t SINGLE_SHOT_DISABLE_STRETCH_MEDIUM{0x240B};
341constexpr uint16_t SINGLE_SHOT_DISABLE_STRETCH_LOW{0x2416};
342// Measurement Commands for Periodic Data Acquisition Mode
343constexpr uint16_t START_PERIODIC_MPS_HALF_HIGH{0x2032};
344constexpr uint16_t START_PERIODIC_MPS_HALF_MEDIUM{0x2024};
345constexpr uint16_t START_PERIODIC_MPS_HALF_LOW{0x202f};
346
347constexpr uint16_t START_PERIODIC_MPS_1_HIGH{0x2130};
348constexpr uint16_t START_PERIODIC_MPS_1_MEDIUM{0x2126};
349constexpr uint16_t START_PERIODIC_MPS_1_LOW{0x212D};
350
351constexpr uint16_t START_PERIODIC_MPS_2_HIGH{0x2236};
352constexpr uint16_t START_PERIODIC_MPS_2_MEDIUM{0x2220};
353constexpr uint16_t START_PERIODIC_MPS_2_LOW{0x222B};
354
355constexpr uint16_t START_PERIODIC_MPS_4_HIGH{0x2334};
356constexpr uint16_t START_PERIODIC_MPS_4_MEDIUM{0x2322};
357constexpr uint16_t START_PERIODIC_MPS_4_LOW{0x2329};
358
359constexpr uint16_t START_PERIODIC_MPS_10_HIGH{0x2737};
360constexpr uint16_t START_PERIODIC_MPS_10_MEDIUM{0x2721};
361constexpr uint16_t START_PERIODIC_MPS_10_LOW{0x272A};
362
363constexpr uint16_t STOP_PERIODIC_MEASUREMENT{0x3093};
364constexpr uint16_t ACCELERATED_RESPONSE_TIME{0x2B32};
365constexpr uint16_t READ_MEASUREMENT{0xE000};
366// Reset
367constexpr uint16_t SOFT_RESET{0x30A2};
368// Heater
369constexpr uint16_t START_HEATER{0x306D};
370constexpr uint16_t STOP_HEATER{0x3066};
371// Status
372constexpr uint16_t READ_STATUS{0xF32D};
373constexpr uint16_t CLEAR_STATUS{0x3041};
374// Serial
375constexpr uint16_t GET_SERIAL_NUMBER_ENABLE_STRETCH{0x3780};
376constexpr uint16_t GET_SERIAL_NUMBER_DISABLE_STRETCH{0x3682};
377} // namespace command
378} // namespace sht30
380
381} // namespace unit
382} // namespace m5
383#endif
Temperature and humidity, sensor unit.
Definition unit_SHT30.hpp:115
bool writeModeAccelerateResponseTime()
Write the mode to ART.
Definition unit_SHT30.cpp:227
bool readSerialNumber(uint32_t &serialNumber)
Read the serial number value.
Definition unit_SHT30.cpp:311
bool softReset()
Soft reset.
Definition unit_SHT30.cpp:257
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_SHT30.hpp:170
bool stopHeater()
Stop heater.
Definition unit_SHT30.cpp:306
void config(const config_t &cfg)
Set the configuration.
Definition unit_SHT30.hpp:156
float humidity() const
Oldest measured humidity (RH)
Definition unit_SHT30.hpp:180
bool startPeriodicMeasurement(const sht30::MPS mps, const sht30::Repeatability rep)
Start periodic measurement.
Definition unit_SHT30.hpp:194
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_SHT30.hpp:175
bool readStatus(sht30::Status &s)
Read status.
Definition unit_SHT30.cpp:241
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_SHT30.hpp:211
bool measureSingleshot(sht30::Data &d, const sht30::Repeatability rep=sht30::Repeatability::High, const bool stretch=false)
Measurement single shot.
Definition unit_SHT30.cpp:150
bool clearStatus()
Clear status.
Definition unit_SHT30.cpp:252
bool startHeater()
Start heater.
Definition unit_SHT30.cpp:301
bool startPeriodicMeasurement()
Start periodic measurement using previous settings.
Definition unit_SHT30.hpp:203
config_t config() const
Gets the configuration.
Definition unit_SHT30.hpp:151
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_SHT30.hpp:165
bool generalReset()
General reset.
Definition unit_SHT30.cpp:274
Top level namespace of M5Stack.
For SHT30.
Unit-related namespace.
Settings for begin.
Definition unit_SHT30.hpp:123
bool start_heater
start heater on begin?
Definition unit_SHT30.hpp:131
sht30::Repeatability repeatability
Repeatability accuracy level if start on begin.
Definition unit_SHT30.hpp:129
bool start_periodic
Start periodic measurement on begin?
Definition unit_SHT30.hpp:125
sht30::MPS mps
Measuring frequency if start on begin.
Definition unit_SHT30.hpp:127
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Measurement data group.
Definition unit_SHT30.hpp:97
float humidity() const
humidity (RH)
Definition unit_SHT30.cpp:83
std::array< uint8_t, 6 > raw
Definition unit_SHT30.hpp:98
float temperature() const
temperature (Celsius)
Definition unit_SHT30.hpp:100
float celsius() const
temperature (Celsius)
Definition unit_SHT30.cpp:73
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_SHT30.cpp:78
Accessor for Status.
Definition unit_SHT30.hpp:54
bool trackingAlertRH() const
RH tracking alert (*)
Definition unit_SHT30.hpp:66
bool trackingAlert() const
Tracking alert (*)
Definition unit_SHT30.hpp:71
bool alertPending() const
Alert pending status (*)
Definition unit_SHT30.hpp:56
bool heater() const
Heater status.
Definition unit_SHT30.hpp:61
bool command() const
Command status.
Definition unit_SHT30.hpp:81
bool reset() const
System reset detected (*)
Definition unit_SHT30.hpp:76
bool checksum() const
Write data checksum status.
Definition unit_SHT30.hpp:86
MPS
Measuring frequency.
Definition unit_SHT30.hpp:39
@ One
1 measurement per second
@ Four
4 measurement per second
@ Ten
10 measurement per second
@ Two
2 measurement per second
@ Half
0.5 measurement per second
Repeatability
Repeatability accuracy level.
Definition unit_SHT30.hpp:29
@ High
High repeatability.
@ Medium
Medium repeatability.