M5Unit-ENV 1.4.0 git rev:c1b5980
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;
127 const Calibration* calib{};
128};
129
130} // namespace qmp6988
131
136class UnitQMP6988 : public Component, public PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data> {
137 M5_UNIT_COMPONENT_HPP_BUILDER(UnitQMP6988, 0x70);
138
139public:
144 struct config_t {
146 bool start_periodic{true};
148 qmp6988::Oversampling osrs_pressure{qmp6988::Oversampling::X8};
150 qmp6988::Oversampling osrs_temperature{qmp6988::Oversampling::X1};
152 qmp6988::Filter filter{qmp6988::Filter::Coeff4};
154 qmp6988::Standby standby{qmp6988::Standby::Time1sec};
155 };
156
157 explicit UnitQMP6988(const uint8_t addr = DEFAULT_ADDRESS)
158 : Component(addr), _data{new m5::container::CircularBuffer<qmp6988::Data>(1)}
159 {
160 auto ccfg = component_config();
161 ccfg.clock = 100 * 1000U;
162 // QMP6988 datasheet: if bus >400 kbit/s and shared, wait >=1 ms before access
163 component_config(ccfg);
164 }
165 virtual ~UnitQMP6988()
166 {
167 }
168
169 virtual bool begin() override;
170 virtual void update(const bool force = false) override;
171
174
175 inline config_t config() const
176 {
177 return _cfg;
178 }
180 inline void config(const config_t& cfg)
181 {
182 _cfg = cfg;
183 }
185
189 inline float temperature() const
190 {
191 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
192 }
194 inline float celsius() const
195 {
196 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
197 }
199 inline float fahrenheit() const
200 {
201 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
202 }
204 inline float pressure() const
205 {
206 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
207 }
209
212
221 inline bool startPeriodicMeasurement(const qmp6988::Oversampling osrsPressure,
222 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f,
223 const qmp6988::Standby st)
224 {
225 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement(osrsPressure,
226 osrsTemperature, f, st);
227 }
234 {
235 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement();
236 }
242 {
243 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::stopPeriodicMeasurement();
244 }
246
249
260 bool measureSingleshot(qmp6988::Data& d, const qmp6988::Oversampling osrsPressure,
261 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f);
265
268
274 bool readOversampling(qmp6988::Oversampling& osrsPressure, qmp6988::Oversampling& osrsTemperature);
282 bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature);
289 bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure);
296 bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature);
316 bool writeFilter(const qmp6988::Filter f);
329 bool writeStandbyTime(const qmp6988::Standby st);
343 bool writePowerMode(const qmp6988::PowerMode mode);
352
357 bool softReset();
358
359protected:
360 bool start_periodic_measurement();
361 bool start_periodic_measurement(const qmp6988::Oversampling ost, const qmp6988::Oversampling osp,
362 const qmp6988::Filter f, const qmp6988::Standby st);
363 bool stop_periodic_measurement();
364
365 bool read_calibration(qmp6988::Calibration& c);
366
367 bool read_measurement(qmp6988::Data& d, const bool only_temperature = false);
368 bool is_data_ready();
369
370 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitQMP6988, qmp6988::Data);
371
372protected:
373 std::unique_ptr<m5::container::CircularBuffer<qmp6988::Data>> _data{};
374 qmp6988::Calibration _calibration{};
375 config_t _cfg{};
376 bool _only_temperature{};
377};
378
380namespace qmp6988 {
381namespace command {
382
383constexpr uint8_t CHIP_ID{0xD1};
384
385constexpr uint8_t READ_PRESSURE{0xF7}; // ~ F9 3bytes
386constexpr uint8_t READ_TEMPERATURE{0xFA}; // ~ FC 3bytes
387
388constexpr uint8_t IO_SETUP{0xF5};
389constexpr uint8_t CONTROL_MEASUREMENT{0xF4};
390constexpr uint8_t GET_STATUS{0xF3};
391constexpr uint8_t IIR_FILTER{0xF1};
392
393constexpr uint8_t SOFT_RESET{0xE0};
394
395constexpr uint8_t READ_COMPENSATION_COEFFICIENT{0xA0}; // ~ 0xB8 25 bytes
396
397} // namespace command
398} // namespace qmp6988
400
401} // namespace unit
402} // namespace m5
403#endif
Barometric pressure sensor to measure atmospheric pressure and altitude estimation.
Definition unit_QMP6988.hpp:136
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:194
bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions.
Definition unit_QMP6988.cpp:341
bool readStandbyTime(qmp6988::Standby &st)
Read the standby time.
Definition unit_QMP6988.cpp:444
config_t config() const
Gets the configuration.
Definition unit_QMP6988.hpp:175
bool measureSingleshot(qmp6988::Data &d, const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f)
Measurement single shot.
Definition unit_QMP6988.cpp:290
bool readFilter(qmp6988::Filter &f)
Read the IIR filter co-efficient.
Definition unit_QMP6988.cpp:425
bool writePowerMode(const qmp6988::PowerMode mode)
Write the power mode.
Definition unit_QMP6988.cpp:404
bool writeFilter(const qmp6988::Filter f)
Write the IIR filter co-efficient.
Definition unit_QMP6988.cpp:435
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_QMP6988.hpp:199
bool softReset()
Soft reset.
Definition unit_QMP6988.cpp:475
bool readOversampling(qmp6988::Oversampling &osrsPressure, qmp6988::Oversampling &osrsTemperature)
Read the oversampling conditions.
Definition unit_QMP6988.cpp:330
bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure)
Write the oversampling conditions for pressure.
Definition unit_QMP6988.cpp:358
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:189
bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions for temperature.
Definition unit_QMP6988.cpp:373
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:221
void config(const config_t &cfg)
Set the configuration.
Definition unit_QMP6988.hpp:180
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_QMP6988.hpp:241
bool writeStandbyTime(const qmp6988::Standby st)
Write the standby time.
Definition unit_QMP6988.cpp:454
bool startPeriodicMeasurement()
Start periodic measurement using current register settings.
Definition unit_QMP6988.hpp:233
bool writeUseCaseSetting(const qmp6988::UseCase uc)
Write the settings based on use cases.
Definition unit_QMP6988.cpp:469
float pressure() const
Oldest measured pressure (Pa)
Definition unit_QMP6988.hpp:204
bool readPowerMode(qmp6988::PowerMode &mode)
Read the power mode.
Definition unit_QMP6988.cpp:394
Top level namespace of M5Stack.
For QMP6988.
Unit-related namespace.
Settings for begin.
Definition unit_QMP6988.hpp:144
qmp6988::Filter filter
Filter if start on begin.
Definition unit_QMP6988.hpp:152
qmp6988::Standby standby
Standby time if start on begin.
Definition unit_QMP6988.hpp:154
qmp6988::Oversampling osrs_pressure
pressure oversampling if start on begin
Definition unit_QMP6988.hpp:148
qmp6988::Oversampling osrs_temperature
temperature oversampling if start on begin
Definition unit_QMP6988.hpp:150
bool start_periodic
Start periodic measurement on begin?
Definition unit_QMP6988.hpp:146
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
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_QMP6988.cpp:169
float celsius() const
temperature (Celsius)
Definition unit_QMP6988.cpp:158
float pressure() const
pressure (Pa)
Definition unit_QMP6988.cpp:174
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