M5Unit-ENV 1.4.0 git rev:c1b5980
Loading...
Searching...
No Matches
unit_BMP280.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_BMP280_HPP
11#define M5_UNIT_ENV_UNIT_BMP280_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 bmp280 {
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};
48
60
65enum class Filter : uint8_t {
66 Off,
67 Coeff2,
68 Coeff4,
69 Coeff8,
70 Coeff16,
71};
72
77enum class Standby : uint8_t {
78 Time0_5ms,
80 Time125ms,
81 Time250ms,
82 Time500ms,
83 Time1sec,
84 Time2sec,
85 Time4sec,
86};
87
92enum class UseCase : uint8_t {
93 LowPower,
94 Dynamic,
95 Weather,
96 Elevator,
97 Drop,
98 Indoor,
99};
100
105union Trimming {
106 uint8_t value[12 * 2]{};
107 struct {
108 //
109 uint16_t dig_T1;
110 int16_t dig_T2;
111 int16_t dig_T3;
112 //
113 uint16_t dig_P1;
114 int16_t dig_P2;
115 int16_t dig_P3;
116 int16_t dig_P4;
117 int16_t dig_P5;
118 int16_t dig_P6;
119 int16_t dig_P7;
120 int16_t dig_P8;
121 int16_t dig_P9;
122 // uint16_t reserved;
123 } __attribute__((packed));
124};
125
130struct Data {
131 std::array<uint8_t, 6> raw{};
133
135 inline float temperature() const
136 {
137 return celsius();
138 }
139 float celsius() const;
140 float fahrenheit() const;
141 float pressure() const;
142};
143
144} // namespace bmp280
145
150class UnitBMP280 : public Component, public PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data> {
151 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBMP280, 0x76);
152
153public:
158 struct config_t {
160 bool start_periodic{true};
162 bmp280::Oversampling osrs_pressure{bmp280::Oversampling::X16};
164 bmp280::Oversampling osrs_temperature{bmp280::Oversampling::X2};
166 bmp280::Filter filter{bmp280::Filter::Coeff16};
168 bmp280::Standby standby{bmp280::Standby::Time1sec};
169 };
170
171 explicit UnitBMP280(const uint8_t addr = DEFAULT_ADDRESS)
172 : Component(addr), _data{new m5::container::CircularBuffer<bmp280::Data>(1)}
173 {
174 auto ccfg = component_config();
175 ccfg.clock = 400 * 1000U;
176 component_config(ccfg);
177 }
178 virtual ~UnitBMP280()
179 {
180 }
181
182 virtual bool begin() override;
183 virtual void update(const bool force = false) override;
184
187
188 inline config_t config() const
189 {
190 return _cfg;
191 }
193 inline void config(const config_t& cfg)
194 {
195 _cfg = cfg;
196 }
198
202 inline float temperature() const
203 {
204 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
205 }
207 inline float celsius() const
208 {
209 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
210 }
212 inline float fahrenheit() const
213 {
214 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
215 }
217 inline float pressure() const
218 {
219 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
220 }
222
225
234 inline bool startPeriodicMeasurement(const bmp280::Oversampling osrsPressure,
235 const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter,
236 const bmp280::Standby st)
237 {
238 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::startPeriodicMeasurement(
239 osrsPressure, osrsTemperature, filter, st);
240 }
247 {
248 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::startPeriodicMeasurement();
249 }
250
256 {
257 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::stopPeriodicMeasurement();
258 }
260
263
274 bool measureSingleshot(bmp280::Data& d, const bmp280::Oversampling osrsPressure,
275 const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter);
278 {
279 return measure_singleshot(d);
280 }
282
285
291 bool readOversampling(bmp280::Oversampling& osrsPressure, bmp280::Oversampling& osrsTemperature);
299 bool writeOversampling(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature);
306 bool writeOversamplingPressure(const bmp280::Oversampling osrsPressure);
313 bool writeOversamplingTemperature(const bmp280::Oversampling osrsTemperature);
326 bool readFilter(bmp280::Filter& f);
333 bool writeFilter(const bmp280::Filter& f);
346 bool writeStandbyTime(const bmp280::Standby s);
360 bool writePowerMode(const bmp280::PowerMode m);
369
374 bool softReset();
375
376protected:
377 bool start_periodic_measurement(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature,
378 const bmp280::Filter filter, const bmp280::Standby st);
379 bool start_periodic_measurement();
380 bool stop_periodic_measurement();
381 bool read_measurement(bmp280::Data& d);
382 bool measure_singleshot(bmp280::Data& d);
383
384 bool read_trimming(bmp280::Trimming& t);
385 bool is_data_ready();
386
387 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBMP280, bmp280::Data);
388
389protected:
390 std::unique_ptr<m5::container::CircularBuffer<bmp280::Data>> _data{};
391 config_t _cfg{};
392 bmp280::Trimming _trimming{};
393};
394
396namespace bmp280 {
397namespace command {
398
399constexpr uint8_t CHIP_ID{0xD0};
400// constexpr uint8_t CHIP_VERSION{0xD1};
401constexpr uint8_t SOFT_RESET{0xE0};
402constexpr uint8_t GET_STATUS{0xF3};
403constexpr uint8_t CONTROL_MEASUREMENT{0xF4};
404constexpr uint8_t CONFIG{0xF5};
405
406constexpr uint8_t GET_MEASUREMENT{0xF7}; // 6bytes
407constexpr uint8_t GET_PRESSURE{0xF7}; // 3bytes
408constexpr uint8_t GET_PRESSURE_MSB{0xF7}; // 7:0
409constexpr uint8_t GET_PRESSURE_LSB{0xF8}; // 7:0
410constexpr uint8_t GET_PRESSURE_XLSB{0xF9}; // 7:4
411constexpr uint8_t GET_TEMPERATURE{0xFA}; // 3 bytes
412constexpr uint8_t GET_TEMPERATURE_MSB{0xFA}; // 7:0
413constexpr uint8_t GET_TEMPERATURE_LSB{0xFB}; // 7:0
414constexpr uint8_t GET_TEMPERATURE_XLSB{0xFC}; // 7:4
415
416constexpr uint8_t TRIMMING_DIG{0x88}; // 12 bytes
417constexpr uint8_t TRIMMING_DIG_T1{0x88};
418constexpr uint8_t TRIMMING_DIG_T2{0x8A};
419constexpr uint8_t TRIMMING_DIG_T3{0x8C};
420constexpr uint8_t TRIMMING_DIG_P1{0x8E};
421constexpr uint8_t TRIMMING_DIG_P2{0x90};
422constexpr uint8_t TRIMMING_DIG_P3{0x92};
423constexpr uint8_t TRIMMING_DIG_P4{0x94};
424constexpr uint8_t TRIMMING_DIG_P5{0x96};
425constexpr uint8_t TRIMMING_DIG_P6{0x98};
426constexpr uint8_t TRIMMING_DIG_P7{0x9A};
427constexpr uint8_t TRIMMING_DIG_P8{0x9C};
428constexpr uint8_t TRIMMING_DIG_P9{0x9E};
429constexpr uint8_t TRIMMING_DIG_RESERVED{0xA0};
430
431} // namespace command
432} // namespace bmp280
434
435} // namespace unit
436} // namespace m5
437
438#endif
Pressure and temperature sensor unit.
Definition unit_BMP280.hpp:150
bool measureSingleshot(bmp280::Data &d)
Measurement single shot using current settings.
Definition unit_BMP280.hpp:277
bool writeFilter(const bmp280::Filter &f)
Write the IIR filter co-efficient.
Definition unit_BMP280.cpp:505
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BMP280.hpp:217
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BMP280.hpp:255
bool writePowerMode(const bmp280::PowerMode m)
Write the power mode.
Definition unit_BMP280.cpp:471
bool writeStandbyTime(const bmp280::Standby s)
Write the standby time.
Definition unit_BMP280.cpp:538
bool readStandbyTime(bmp280::Standby &s)
Read the standby time.
Definition unit_BMP280.cpp:528
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BMP280.hpp:202
bool writeOversampling(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature)
Write the oversampling conditions.
Definition unit_BMP280.cpp:409
bool softReset()
Soft reset.
Definition unit_BMP280.cpp:559
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_BMP280.hpp:212
bool writeOversamplingTemperature(const bmp280::Oversampling osrsTemperature)
Write the oversampling conditions for temperature.
Definition unit_BMP280.cpp:440
bool writeOversamplingPressure(const bmp280::Oversampling osrsPressure)
Write the oversampling conditions for pressure.
Definition unit_BMP280.cpp:425
void config(const config_t &cfg)
Set the configuration.
Definition unit_BMP280.hpp:193
bool measureSingleshot(bmp280::Data &d, const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter)
Measurement single shot.
Definition unit_BMP280.cpp:355
bool startPeriodicMeasurement(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter, const bmp280::Standby st)
Start periodic measurement.
Definition unit_BMP280.hpp:234
bool startPeriodicMeasurement()
Start periodic measurement using current register settings.
Definition unit_BMP280.hpp:246
bool readPowerMode(bmp280::PowerMode &m)
Read the power mode.
Definition unit_BMP280.cpp:461
config_t config() const
Gets the configuration.
Definition unit_BMP280.hpp:188
bool writeUseCaseSetting(const bmp280::UseCase uc)
Write the settings based on use cases.
Definition unit_BMP280.cpp:553
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_BMP280.hpp:207
bool readFilter(bmp280::Filter &f)
Read the IIR filter co-efficient.
Definition unit_BMP280.cpp:495
bool readOversampling(bmp280::Oversampling &osrsPressure, bmp280::Oversampling &osrsTemperature)
Read the oversampling conditions.
Definition unit_BMP280.cpp:398
For BMP280.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BMP280.hpp:158
bmp280::Oversampling osrs_pressure
Pressure oversampling if start on begin.
Definition unit_BMP280.hpp:162
bmp280::Standby standby
Standby time if start on begin.
Definition unit_BMP280.hpp:168
bmp280::Filter filter
Filter if start on begin.
Definition unit_BMP280.hpp:166
bmp280::Oversampling osrs_temperature
Temperature oversampling if start on begin.
Definition unit_BMP280.hpp:164
bool start_periodic
Start periodic measurement on begin?
Definition unit_BMP280.hpp:160
Measurement data group.
Definition unit_BMP280.hpp:130
const Trimming * trimming
For calculate.
Definition unit_BMP280.hpp:132
float temperature() const
temperature (Celsius)
Definition unit_BMP280.hpp:135
float pressure() const
pressure (Pa)
Definition unit_BMP280.cpp:236
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_BMP280.cpp:231
std::array< uint8_t, 6 > raw
RAW data [0,1,2]:pressure [3,4,5]:temperature.
Definition unit_BMP280.hpp:131
float celsius() const
temperature (Celsius)
Definition unit_BMP280.cpp:220
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Trimming parameter.
Definition unit_BMP280.hpp:105
Oversampling
Oversampling factor.
Definition unit_BMP280.hpp:40
@ Skipped
Skipped (No measurements are performed)
Filter
Filter setting.
Definition unit_BMP280.hpp:65
@ Coeff4
co-efficient 4
@ Coeff16
co-efficient 16
@ Coeff8
co-efficient 8
@ Coeff2
co-efficient 2
OversamplingSetting
Oversampling Settings.
Definition unit_BMP280.hpp:53
@ LowPower
17 bit / 1.31 Pa, 16 bit / 0.0050 C
@ UltraLowPower
16 bit / 2.62 Pa, 16 bit / 0.0050 C
@ StandardResolution
18 bit / 0.66 Pa, 16 bit / 0.0050 C
@ HighResolution
19 bit / 0.33 Pa, 16 bit / 0.0050 C
@ UltraHighResolution
20 bit / 0.16 Pa, 17 bit / 0.0025 C
PowerMode
Operation mode.
Definition unit_BMP280.hpp:30
@ Normal
Periodic measurements are performed.
UseCase
Preset settings.
Definition unit_BMP280.hpp:92
@ Weather
Weather monitoring.
@ Drop
Drop detection.
@ Indoor
Indoor navigation.
@ Elevator
Elevator / floor change detection.
@ Dynamic
Handheld device dynamic.
Standby
Measurement standby time for power mode Normal.
Definition unit_BMP280.hpp:77