M5Unit-ENV 1.7.1 git rev:b34077f
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#include "unit_BMP280_data.hpp"
17
18namespace m5 {
19namespace unit {
20
25namespace bmp280 {
26
31enum class PowerMode : uint8_t {
32 Sleep,
33 Forced,
34 Normal = 0x03,
35};
36
41enum class Oversampling : uint8_t {
42 Skipped,
43 X1,
44 X2,
45 X4,
46 X8,
47 X16,
48};
49
61
66enum class Filter : uint8_t {
67 Off,
68 Coeff2,
69 Coeff4,
70 Coeff8,
71 Coeff16,
72};
73
78enum class Standby : uint8_t {
79 Time0_5ms,
81 Time125ms,
82 Time250ms,
83 Time500ms,
84 Time1sec,
85 Time2sec,
86 Time4sec,
87};
88
93enum class UseCase : uint8_t {
94 LowPower,
95 Dynamic,
96 Weather,
97 Elevator,
98 Drop,
99 Indoor,
100};
101
102} // namespace bmp280
103
108class UnitBMP280 : public Component, public PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data> {
109 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBMP280, 0x76);
110
111public:
116 struct config_t {
118 bool start_periodic{true};
120 bmp280::Oversampling osrs_pressure{bmp280::Oversampling::X16};
122 bmp280::Oversampling osrs_temperature{bmp280::Oversampling::X2};
124 bmp280::Filter filter{bmp280::Filter::Coeff16};
126 bmp280::Standby standby{bmp280::Standby::Time1sec};
127 };
128
129 explicit UnitBMP280(const uint8_t addr = DEFAULT_ADDRESS)
130 : Component(addr), _data{new m5::container::CircularBuffer<bmp280::Data>(1)}
131 {
132 auto ccfg = component_config();
133 ccfg.clock = 400 * 1000U;
134 component_config(ccfg);
135 }
136 virtual ~UnitBMP280()
137 {
138 }
139
140 virtual bool begin() override;
141 virtual void update(const bool force = false) override;
142
145
146 inline config_t config() const
147 {
148 return _cfg;
149 }
151 inline void config(const config_t& cfg)
152 {
153 _cfg = cfg;
154 }
156
160 inline float temperature() const
161 {
162 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
163 }
165 inline float celsius() const
166 {
167 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
168 }
170 inline float fahrenheit() const
171 {
172 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
173 }
175 inline float pressure() const
176 {
177 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
178 }
180 float altitude(const float sea_level_pa = 101325.0f) const;
182 float relativeAltitude() const;
186
189
198 inline bool startPeriodicMeasurement(const bmp280::Oversampling osrsPressure,
199 const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter,
200 const bmp280::Standby st)
201 {
202 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::startPeriodicMeasurement(
203 osrsPressure, osrsTemperature, filter, st);
204 }
211 {
212 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::startPeriodicMeasurement();
213 }
214
220 {
221 return PeriodicMeasurementAdapter<UnitBMP280, bmp280::Data>::stopPeriodicMeasurement();
222 }
224
227
238 bool measureSingleshot(bmp280::Data& d, const bmp280::Oversampling osrsPressure,
239 const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter);
246 {
247 return measure_singleshot(d);
248 }
250
253
259 bool readOversampling(bmp280::Oversampling& osrsPressure, bmp280::Oversampling& osrsTemperature);
267 bool writeOversampling(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature);
274 bool writeOversamplingPressure(const bmp280::Oversampling osrsPressure);
281 bool writeOversamplingTemperature(const bmp280::Oversampling osrsTemperature);
294 bool readFilter(bmp280::Filter& f);
301 bool writeFilter(const bmp280::Filter& f);
314 bool writeStandbyTime(const bmp280::Standby s);
328 bool writePowerMode(const bmp280::PowerMode m);
337
342 bool softReset();
343
344protected:
345 bool start_periodic_measurement(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature,
346 const bmp280::Filter filter, const bmp280::Standby st);
347 bool start_periodic_measurement();
348 bool stop_periodic_measurement();
349 bool read_measurement(bmp280::Data& d);
350 bool measure_singleshot(bmp280::Data& d);
351
352 bool read_trimming(bmp280::Trimming& t);
353 bool is_data_ready();
354
355 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBMP280, bmp280::Data);
356
357protected:
358 std::unique_ptr<m5::container::CircularBuffer<bmp280::Data>> _data{};
359 config_t _cfg{};
360 bmp280::Trimming _trimming{};
361 float _altitude_reference_pa{101325.0f};
362};
363
365namespace bmp280 {
366namespace command {
367
368constexpr uint8_t CHIP_ID{0xD0};
369// constexpr uint8_t CHIP_VERSION{0xD1};
370constexpr uint8_t SOFT_RESET{0xE0};
371constexpr uint8_t GET_STATUS{0xF3};
372constexpr uint8_t CONTROL_MEASUREMENT{0xF4};
373constexpr uint8_t CONFIG{0xF5};
374
375constexpr uint8_t GET_MEASUREMENT{0xF7}; // 6bytes
376constexpr uint8_t GET_PRESSURE{0xF7}; // 3bytes
377constexpr uint8_t GET_PRESSURE_MSB{0xF7}; // 7:0
378constexpr uint8_t GET_PRESSURE_LSB{0xF8}; // 7:0
379constexpr uint8_t GET_PRESSURE_XLSB{0xF9}; // 7:4
380constexpr uint8_t GET_TEMPERATURE{0xFA}; // 3 bytes
381constexpr uint8_t GET_TEMPERATURE_MSB{0xFA}; // 7:0
382constexpr uint8_t GET_TEMPERATURE_LSB{0xFB}; // 7:0
383constexpr uint8_t GET_TEMPERATURE_XLSB{0xFC}; // 7:4
384
385constexpr uint8_t TRIMMING_DIG{0x88}; // 12 bytes
386constexpr uint8_t TRIMMING_DIG_T1{0x88};
387constexpr uint8_t TRIMMING_DIG_T2{0x8A};
388constexpr uint8_t TRIMMING_DIG_T3{0x8C};
389constexpr uint8_t TRIMMING_DIG_P1{0x8E};
390constexpr uint8_t TRIMMING_DIG_P2{0x90};
391constexpr uint8_t TRIMMING_DIG_P3{0x92};
392constexpr uint8_t TRIMMING_DIG_P4{0x94};
393constexpr uint8_t TRIMMING_DIG_P5{0x96};
394constexpr uint8_t TRIMMING_DIG_P6{0x98};
395constexpr uint8_t TRIMMING_DIG_P7{0x9A};
396constexpr uint8_t TRIMMING_DIG_P8{0x9C};
397constexpr uint8_t TRIMMING_DIG_P9{0x9E};
398constexpr uint8_t TRIMMING_DIG_RESERVED{0xA0};
399
400} // namespace command
401} // namespace bmp280
403
404} // namespace unit
405} // namespace m5
406
407#endif
Pressure and temperature sensor unit.
Definition unit_BMP280.hpp:108
float altitude(const float sea_level_pa=101325.0f) const
Absolute altitude (m) versus the given sea-level pressure (QNH, Pa)
Definition unit_BMP280.cpp:487
bool measureSingleshot(bmp280::Data &d)
Measurement single shot using current settings.
Definition unit_BMP280.hpp:245
bool writeFilter(const bmp280::Filter &f)
Write the IIR filter co-efficient.
Definition unit_BMP280.cpp:391
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BMP280.hpp:175
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BMP280.hpp:219
bool writePowerMode(const bmp280::PowerMode m)
Write the power mode.
Definition unit_BMP280.cpp:357
bool writeStandbyTime(const bmp280::Standby s)
Write the standby time.
Definition unit_BMP280.cpp:424
bool readStandbyTime(bmp280::Standby &s)
Read the standby time.
Definition unit_BMP280.cpp:414
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BMP280.hpp:160
float relativeAltitude() const
Altitude (m) relative to the last setAltitudeReference() tare point (0 m at that pressure)
Definition unit_BMP280.cpp:492
bool writeOversampling(const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature)
Write the oversampling conditions.
Definition unit_BMP280.cpp:295
bool softReset()
Soft reset.
Definition unit_BMP280.cpp:445
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_BMP280.hpp:170
bool writeOversamplingTemperature(const bmp280::Oversampling osrsTemperature)
Write the oversampling conditions for temperature.
Definition unit_BMP280.cpp:326
bool writeOversamplingPressure(const bmp280::Oversampling osrsPressure)
Write the oversampling conditions for pressure.
Definition unit_BMP280.cpp:311
void config(const config_t &cfg)
Set the configuration.
Definition unit_BMP280.hpp:151
bool measureSingleshot(bmp280::Data &d, const bmp280::Oversampling osrsPressure, const bmp280::Oversampling osrsTemperature, const bmp280::Filter filter)
Measurement single shot.
Definition unit_BMP280.cpp:241
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:198
void setAltitudeReference()
Tare the current pressure as the 0 m reference for relativeAltitude()
Definition unit_BMP280.cpp:497
bool startPeriodicMeasurement()
Start periodic measurement using current register settings.
Definition unit_BMP280.hpp:210
bool readPowerMode(bmp280::PowerMode &m)
Read the power mode.
Definition unit_BMP280.cpp:347
config_t config() const
Gets the configuration.
Definition unit_BMP280.hpp:146
bool writeUseCaseSetting(const bmp280::UseCase uc)
Write the settings based on use cases.
Definition unit_BMP280.cpp:439
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_BMP280.hpp:165
bool readFilter(bmp280::Filter &f)
Read the IIR filter co-efficient.
Definition unit_BMP280.cpp:381
bool readOversampling(bmp280::Oversampling &osrsPressure, bmp280::Oversampling &osrsTemperature)
Read the oversampling conditions.
Definition unit_BMP280.cpp:284
For BMP280.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BMP280.hpp:116
bmp280::Oversampling osrs_pressure
Pressure oversampling if start on begin.
Definition unit_BMP280.hpp:120
bmp280::Standby standby
Standby time if start on begin.
Definition unit_BMP280.hpp:126
bmp280::Filter filter
Filter if start on begin.
Definition unit_BMP280.hpp:124
bmp280::Oversampling osrs_temperature
Temperature oversampling if start on begin.
Definition unit_BMP280.hpp:122
bool start_periodic
Start periodic measurement on begin?
Definition unit_BMP280.hpp:118
Measurement data group.
Definition unit_BMP280_data.hpp:143
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Trimming parameter.
Definition unit_BMP280_data.hpp:25
Oversampling
Oversampling factor.
Definition unit_BMP280.hpp:41
@ Skipped
Skipped (No measurements are performed)
Filter
Filter setting.
Definition unit_BMP280.hpp:66
@ Coeff4
co-efficient 4
@ Coeff16
co-efficient 16
@ Coeff8
co-efficient 8
@ Coeff2
co-efficient 2
OversamplingSetting
Oversampling Settings.
Definition unit_BMP280.hpp:54
@ 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:31
@ Normal
Periodic measurements are performed.
UseCase
Preset settings.
Definition unit_BMP280.hpp:93
@ 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:78
BMP280 measurement data, trimming parameters, and compensation (framework independent)