M5Unit-ENV 1.7.1 git rev:b34077f
Loading...
Searching...
No Matches
unit_SPA06.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_ENV_UNIT_SPA06_HPP
11#define M5_UNIT_ENV_UNIT_SPA06_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <memory>
16#include "unit_SPA06_data.hpp"
17
18namespace m5 {
19namespace unit {
20
26class UnitSPA06 : public Component, public PeriodicMeasurementAdapter<UnitSPA06, spa06::Data> {
27 M5_UNIT_COMPONENT_HPP_BUILDER(UnitSPA06, 0x76);
28
29public:
34 struct config_t {
36 bool start_periodic{true};
38 spa06::Oversampling pressure_oversampling{spa06::Oversampling::X16};
42 spa06::Rate rate{spa06::Rate::Rate16};
44 spa06::Mode mode{spa06::Mode::PressureAndTemperature};
45 };
46
47 explicit UnitSPA06(const uint8_t addr = DEFAULT_ADDRESS);
48 virtual ~UnitSPA06()
49 {
50 }
51
53 virtual bool begin() override;
56 virtual void update(const bool force = false) override;
57
62 {
63 return _cfg;
64 }
66 void config(const config_t& cfg)
67 {
68 _cfg = cfg;
69 }
71
79 bool softReset();
81
84
96 bool startPeriodicMeasurement(const spa06::Mode mode, const spa06::Oversampling pressure_oversampling,
97 const spa06::Oversampling temperature_oversampling, const spa06::Rate rate);
103
107 float pressure() const;
109 float temperature() const;
111 float altitude(const float sea_level_pa = 101325.0f) const;
113 float relativeAltitude() const;
117 [[deprecated("Use setAltitudeReference() instead")]] void setReference()
118 {
120 }
122
125
135 bool measureSingleshot(spa06::Data& d, const spa06::Oversampling pressure_oversampling = spa06::Oversampling::X16,
136 const spa06::Oversampling temperature_oversampling = spa06::Oversampling::X1);
138
141
147 bool readOversampling(spa06::Oversampling& pressure_oversampling, spa06::Oversampling& temperature_oversampling);
155 bool writeOversampling(const spa06::Oversampling pressure_oversampling,
156 const spa06::Oversampling temperature_oversampling);
163 bool writeOversamplingPressure(const spa06::Oversampling pressure_oversampling);
170 bool writeOversamplingTemperature(const spa06::Oversampling temperature_oversampling);
176 bool readRate(spa06::Rate& rate);
183 bool writeRate(const spa06::Rate rate);
185
186protected:
187 bool start_periodic_measurement(const spa06::Mode mode, const spa06::Oversampling pressure_oversampling,
188 const spa06::Oversampling temperature_oversampling, const spa06::Rate rate);
189 bool start_periodic_measurement();
190 bool seed_temperature();
191 bool stop_periodic_measurement();
192 bool read_measurement(spa06::Data& d);
193 bool measure_singleshot(spa06::Data& d);
194 bool read_coefficients();
195
196 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSPA06, spa06::Data);
197
198private:
199 config_t _cfg{};
200 spa06::coeffs_t _coeffs{};
201 float _kp{}; // Set by start_periodic_measurement() before any compensation
202 float _kt{};
203 int32_t _seed_tmp_raw{}; // Temperature seeded once for pressure compensation in Mode::Pressure
204 uint8_t _tmp_ext{}; // MEAS_CFG TMP_EXT bit (0 or 0x08) matched to TMP_COEF_SRCE, OR'd into mode writes
205 float _altitude_reference_pa{101325.0f};
206 uint32_t _pushed{}, _consumed{};
207 std::unique_ptr<m5::container::CircularBuffer<spa06::Data>> _data{};
208};
209
210namespace spa06 {
212constexpr uint32_t DEFAULT_STORED_SIZE{4};
213
214namespace command {
216constexpr uint8_t REG_PSR_B2{0x00}; // burst start: PSR(3) + TMP(3) = 6 bytes
217constexpr uint8_t REG_TMP_B2{0x03}; // TMP(3) start (0x03..0x05)
218constexpr uint8_t REG_PRS_CFG{0x06}; // PM_RATE[7:4] PM_PRC[3:0]
219constexpr uint8_t REG_TMP_CFG{0x07}; // TMP_RATE[7:4] TM_PRC[3:0]
220constexpr uint8_t REG_MEAS_CFG{0x08}; // bit7 COEF_RDY, bit6 SENSOR_RDY, bit5 TMP_RDY, bit4 PRS_RDY
221constexpr uint8_t REG_CFG_REG{0x09}; // bit3 TMP_SHIFT_EN, bit2 PRS_SHIFT_EN
222constexpr uint8_t REG_RESET{0x0C};
223constexpr uint8_t REG_ID{0x0D};
224constexpr uint8_t REG_COEF{0x10}; // 0x10..0x24 (21 bytes)
225constexpr uint8_t REG_COEF_SRCE{0x28}; // bit7 TMP_COEF_SRCE (0 internal / 1 external temperature sensor)
227} // namespace command
228} // namespace spa06
229
230} // namespace unit
231} // namespace m5
232#endif
Goertek SPA06-003 barometer (pressure + temperature); read pressure()/temperature()/altitude() direct...
Definition unit_SPA06.hpp:26
bool readRate(spa06::Rate &rate)
Read the measurement rate.
Definition unit_SPA06.cpp:480
void config(const config_t &cfg)
Set the configuration.
Definition unit_SPA06.hpp:66
bool softReset()
Soft reset (REG_RESET SOFT_RST), leaving the chip initialized but unconfigured and stopped.
Definition unit_SPA06.cpp:107
float altitude(const float sea_level_pa=101325.0f) const
Absolute altitude (m) versus the given sea-level pressure (QNH, Pa)
Definition unit_SPA06.cpp:540
bool readOversampling(spa06::Oversampling &pressure_oversampling, spa06::Oversampling &temperature_oversampling)
Read the oversampling.
Definition unit_SPA06.cpp:418
bool writeOversamplingTemperature(const spa06::Oversampling temperature_oversampling)
Write the temperature oversampling.
Definition unit_SPA06.cpp:450
config_t config() const
Gets the configuration.
Definition unit_SPA06.hpp:61
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_SPA06.cpp:330
void setAltitudeReference()
Tare the current pressure as the 0 m reference for relativeAltitude()
Definition unit_SPA06.cpp:550
bool measureSingleshot(spa06::Data &d, const spa06::Oversampling pressure_oversampling=spa06::Oversampling::X16, const spa06::Oversampling temperature_oversampling=spa06::Oversampling::X1)
Measure pressure and temperature a single shot.
Definition unit_SPA06.cpp:340
float relativeAltitude() const
Altitude (m) relative to the last setAltitudeReference() tare point (0 m at that pressure)
Definition unit_SPA06.cpp:545
float temperature() const
Latest compensated temperature (degC)
Definition unit_SPA06.cpp:525
bool writeRate(const spa06::Rate rate)
Write the measurement rate (pressure and temperature share the rate)
Definition unit_SPA06.cpp:490
bool writeOversamplingPressure(const spa06::Oversampling pressure_oversampling)
Write the pressure oversampling.
Definition unit_SPA06.cpp:429
void setReference()
Deprecated alias for setAltitudeReference() (kept for source compatibility with 1....
Definition unit_SPA06.hpp:117
bool writeOversampling(const spa06::Oversampling pressure_oversampling, const spa06::Oversampling temperature_oversampling)
Write the oversampling.
Definition unit_SPA06.cpp:471
virtual bool begin() override
Begin the unit.
Definition unit_SPA06.cpp:52
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_SPA06.cpp:335
float pressure() const
Latest compensated pressure (Pa)
Definition unit_SPA06.cpp:510
virtual void update(const bool force=false) override
Update the unit.
Definition unit_SPA06.cpp:132
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin()
Definition unit_SPA06.hpp:34
bool start_periodic
Start periodic measurement on begin()?
Definition unit_SPA06.hpp:36
spa06::Mode mode
Continuous measurement type (pressure / temperature / both)
Definition unit_SPA06.hpp:44
spa06::Oversampling pressure_oversampling
Pressure oversampling; X16 = Standard.
Definition unit_SPA06.hpp:38
spa06::Oversampling temperature_oversampling
Temperature oversampling.
Definition unit_SPA06.hpp:40
spa06::Rate rate
Pressure/temperature measurement rate.
Definition unit_SPA06.hpp:42
One SPA06 sample: a 6-byte burst from PSR_B2 (0x00) = PSR(24) + TMP(24), big-endian.
Definition unit_SPA06_data.hpp:177
constexpr uint32_t DEFAULT_STORED_SIZE
Default ring buffer depth.
Definition unit_SPA06.hpp:212
SPA06-003 measurement data + calibration/compensation (framework independent)
Oversampling
Oversampling factor; the enum value is the PM_PRC/TM_PRC nibble (datasheet Table 4)
Definition unit_SPA06_data.hpp:29
Rate
Measurement rate; the enum value is the PM_RATE/TMP_RATE nibble (measurements per second)
Definition unit_SPA06_data.hpp:44
Mode
Continuous measurement type; the enum value is the MEAS_CFG MEAS_CTRL[2:0] background-mode code.
Definition unit_SPA06_data.hpp:59