M5Unit-ENV 1.7.1 git rev:b34077f
Loading...
Searching...
No Matches
unit_QMP6988.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_QMP6988_HPP
11#define M5_UNIT_ENV_UNIT_QMP6988_HPP
12#include <M5UnitComponent.hpp>
13#include <m5_utility/stl/extension.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16
17namespace m5 {
18namespace unit {
19
24namespace qmp6988 {
25
30enum class PowerMode : uint8_t {
31 Sleep,
32 Forced,
33 Normal = 0x03,
34};
35
40enum class Oversampling : uint8_t {
41 Skipped,
42 X1,
43 X2,
44 X4,
45 X8,
46 X16,
47 X32,
48 X64,
49};
50
55enum class OversamplingSetting : uint8_t {
56 HighSpeed,
57 LowPower,
58 Standard,
62 UltraHightAccuracy [[deprecated("Use UltraHighAccuracy")]] = UltraHighAccuracy,
63};
64
69enum class Filter : uint8_t {
70 Off,
71 Coeff2,
72 Coeff4,
73 Coeff8,
74 Coeff16,
75 Coeff32,
76};
77
82enum class Standby : uint8_t {
83 Time1ms,
84 Time5ms,
85 Time50ms,
86 Time250ms,
87 Time500ms,
88 Time1sec,
89 Time2sec,
90 Time4sec,
91};
92
97enum class UseCase : uint8_t {
98 Weather,
99 Drop,
100 Elevator,
101 Stair,
102 Indoor,
103};
104
106struct Calibration {
107 int32_t b00{}, bt1{}, bp1{};
108 int64_t bt2{};
109 int32_t b11{}, bp2{}, b12{}, b21{}, bp3{}, a0{}, a1{}, a2{};
110};
112
117struct Data {
118 std::array<uint8_t, 6> raw{};
120 inline float temperature() const
121 {
122 return celsius();
123 }
124 float celsius() const;
125 float fahrenheit() const;
126 float pressure() const;
130 const Calibration* calib{};
131};
132
133} // namespace qmp6988
134
139class UnitQMP6988 : public Component, public PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data> {
140 M5_UNIT_COMPONENT_HPP_BUILDER(UnitQMP6988, 0x70);
141
142public:
147 struct config_t {
149 bool start_periodic{true};
151 qmp6988::Oversampling osrs_pressure{qmp6988::Oversampling::X8};
153 qmp6988::Oversampling osrs_temperature{qmp6988::Oversampling::X1};
155 qmp6988::Filter filter{qmp6988::Filter::Coeff4};
157 qmp6988::Standby standby{qmp6988::Standby::Time1sec};
158 };
159
160 explicit UnitQMP6988(const uint8_t addr = DEFAULT_ADDRESS)
161 : Component(addr), _data{new m5::container::CircularBuffer<qmp6988::Data>(1)}
162 {
163 auto ccfg = component_config();
164 ccfg.clock = 400 * 1000U;
165 component_config(ccfg);
166 }
167 virtual ~UnitQMP6988()
168 {
169 }
170
171 virtual bool begin() override;
172 virtual void update(const bool force = false) override;
173
176
177 inline config_t config() const
178 {
179 return _cfg;
180 }
182 inline void config(const config_t& cfg)
183 {
184 _cfg = cfg;
185 }
187
191 inline float temperature() const
192 {
193 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
194 }
196 inline float celsius() const
197 {
198 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
199 }
201 inline float fahrenheit() const
202 {
203 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
204 }
206 inline float pressure() const
207 {
208 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
209 }
211 float altitude(const float sea_level_pa = 101325.0f) const;
213 float relativeAltitude() const;
217
220
229 inline bool startPeriodicMeasurement(const qmp6988::Oversampling osrsPressure,
230 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f,
231 const qmp6988::Standby st)
232 {
233 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement(osrsPressure,
234 osrsTemperature, f, st);
235 }
242 {
243 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement();
244 }
250 {
251 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::stopPeriodicMeasurement();
252 }
254
257
268 bool measureSingleshot(qmp6988::Data& d, const qmp6988::Oversampling osrsPressure,
269 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f);
277
280
286 bool readOversampling(qmp6988::Oversampling& osrsPressure, qmp6988::Oversampling& osrsTemperature);
294 bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature);
301 bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure);
308 bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature);
328 bool writeFilter(const qmp6988::Filter f);
341 bool writeStandbyTime(const qmp6988::Standby st);
355 bool writePowerMode(const qmp6988::PowerMode mode);
364
369 bool softReset();
370
371protected:
372 bool start_periodic_measurement();
373 bool start_periodic_measurement(const qmp6988::Oversampling ost, const qmp6988::Oversampling osp,
374 const qmp6988::Filter f, const qmp6988::Standby st);
375 bool stop_periodic_measurement();
376
377 bool read_calibration(qmp6988::Calibration& c);
378
379 bool read_measurement(qmp6988::Data& d, const bool only_temperature = false);
380 bool is_data_ready();
381
382 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitQMP6988, qmp6988::Data);
383
384protected:
385 std::unique_ptr<m5::container::CircularBuffer<qmp6988::Data>> _data{};
386 qmp6988::Calibration _calibration{};
387 config_t _cfg{};
388 bool _only_temperature{};
389 float _altitude_reference_pa{101325.0f};
390};
391
393namespace qmp6988 {
394namespace command {
395
396constexpr uint8_t CHIP_ID{0xD1};
397
398constexpr uint8_t READ_PRESSURE{0xF7}; // ~ F9 3bytes
399constexpr uint8_t READ_TEMPERATURE{0xFA}; // ~ FC 3bytes
400
401constexpr uint8_t IO_SETUP{0xF5};
402constexpr uint8_t CONTROL_MEASUREMENT{0xF4};
403constexpr uint8_t GET_STATUS{0xF3};
404constexpr uint8_t IIR_FILTER{0xF1};
405
406constexpr uint8_t SOFT_RESET{0xE0};
407
408constexpr uint8_t READ_COMPENSATION_COEFFICIENT{0xA0}; // ~ 0xB8 25 bytes
409
410} // namespace command
411} // namespace qmp6988
413
414} // namespace unit
415} // namespace m5
416#endif
Barometric pressure sensor to measure atmospheric pressure and altitude estimation.
Definition unit_QMP6988.hpp:139
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:196
bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions.
Definition unit_QMP6988.cpp:343
bool readStandbyTime(qmp6988::Standby &st)
Read the standby time.
Definition unit_QMP6988.cpp:446
config_t config() const
Gets the configuration.
Definition unit_QMP6988.hpp:177
bool measureSingleshot(qmp6988::Data &d, const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f)
Measurement single shot.
Definition unit_QMP6988.cpp:292
bool readFilter(qmp6988::Filter &f)
Read the IIR filter co-efficient.
Definition unit_QMP6988.cpp:427
bool writePowerMode(const qmp6988::PowerMode mode)
Write the power mode.
Definition unit_QMP6988.cpp:406
void setAltitudeReference()
Tare the current pressure as the 0 m reference for relativeAltitude()
Definition unit_QMP6988.cpp:573
float relativeAltitude() const
Altitude (m) relative to the last setAltitudeReference() tare point (0 m at that pressure)
Definition unit_QMP6988.cpp:568
bool writeFilter(const qmp6988::Filter f)
Write the IIR filter co-efficient.
Definition unit_QMP6988.cpp:437
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_QMP6988.hpp:201
bool softReset()
Soft reset.
Definition unit_QMP6988.cpp:477
bool readOversampling(qmp6988::Oversampling &osrsPressure, qmp6988::Oversampling &osrsTemperature)
Read the oversampling conditions.
Definition unit_QMP6988.cpp:332
bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure)
Write the oversampling conditions for pressure.
Definition unit_QMP6988.cpp:360
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:191
bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions for temperature.
Definition unit_QMP6988.cpp:375
bool startPeriodicMeasurement(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f, const qmp6988::Standby st)
Start periodic measurement.
Definition unit_QMP6988.hpp:229
void config(const config_t &cfg)
Set the configuration.
Definition unit_QMP6988.hpp:182
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_QMP6988.hpp:249
float altitude(const float sea_level_pa=101325.0f) const
Absolute altitude (m) versus the given sea-level pressure (QNH, Pa)
Definition unit_QMP6988.cpp:563
bool writeStandbyTime(const qmp6988::Standby st)
Write the standby time.
Definition unit_QMP6988.cpp:456
bool startPeriodicMeasurement()
Start periodic measurement using current register settings.
Definition unit_QMP6988.hpp:241
bool writeUseCaseSetting(const qmp6988::UseCase uc)
Write the settings based on use cases.
Definition unit_QMP6988.cpp:471
float pressure() const
Oldest measured pressure (Pa)
Definition unit_QMP6988.hpp:206
bool readPowerMode(qmp6988::PowerMode &mode)
Read the power mode.
Definition unit_QMP6988.cpp:396
Top level namespace of M5Stack.
For QMP6988.
Unit-related namespace.
Settings for begin.
Definition unit_QMP6988.hpp:147
qmp6988::Filter filter
Filter if start on begin.
Definition unit_QMP6988.hpp:155
qmp6988::Standby standby
Standby time if start on begin.
Definition unit_QMP6988.hpp:157
qmp6988::Oversampling osrs_pressure
pressure oversampling if start on begin
Definition unit_QMP6988.hpp:151
qmp6988::Oversampling osrs_temperature
temperature oversampling if start on begin
Definition unit_QMP6988.hpp:153
bool start_periodic
Start periodic measurement on begin?
Definition unit_QMP6988.hpp:149
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Measurement data group.
Definition unit_QMP6988.hpp:117
float temperature() const
temperature (Celsius)
Definition unit_QMP6988.hpp:120
const Calibration * calib
Points to the owning unit's calibration for compensation.
Definition unit_QMP6988.hpp:130
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_QMP6988.cpp:171
float celsius() const
temperature (Celsius)
Definition unit_QMP6988.cpp:160
float pressure() const
Definition unit_QMP6988.cpp:176
std::array< uint8_t, 6 > raw
Definition unit_QMP6988.hpp:118
UseCase
Preset settings.
Definition unit_QMP6988.hpp:97
@ Stair
Stair detection.
OversamplingSetting
Oversampling Settings.
Definition unit_QMP6988.hpp:55
PowerMode
Operation mode.
Definition unit_QMP6988.hpp:30
Filter
Filter setting.
Definition unit_QMP6988.hpp:69
@ Coeff32
co-efficient 32
Oversampling
Oversampling value.
Definition unit_QMP6988.hpp:40
Standby
Measurement standby time for power mode Normal.
Definition unit_QMP6988.hpp:82