M5Unit-ENV 1.6.0 git rev:f6fd6b0
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_hpa = 1013.25f) const;
113 float relativeAltitude() const;
115 void setReference();
117
120
130 bool measureSingleshot(spa06::Data& d, const spa06::Oversampling pressure_oversampling = spa06::Oversampling::X16,
131 const spa06::Oversampling temperature_oversampling = spa06::Oversampling::X1);
133
136
142 bool readOversampling(spa06::Oversampling& pressure_oversampling, spa06::Oversampling& temperature_oversampling);
150 bool writeOversampling(const spa06::Oversampling pressure_oversampling,
151 const spa06::Oversampling temperature_oversampling);
158 bool writeOversamplingPressure(const spa06::Oversampling pressure_oversampling);
165 bool writeOversamplingTemperature(const spa06::Oversampling temperature_oversampling);
171 bool readRate(spa06::Rate& rate);
178 bool writeRate(const spa06::Rate rate);
180
181protected:
182 bool start_periodic_measurement(const spa06::Mode mode, const spa06::Oversampling pressure_oversampling,
183 const spa06::Oversampling temperature_oversampling, const spa06::Rate rate);
184 bool start_periodic_measurement();
185 bool seed_temperature();
186 bool stop_periodic_measurement();
187 bool read_measurement(spa06::Data& d);
188 bool measure_singleshot(spa06::Data& d);
189 bool read_coefficients();
190
191 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitSPA06, spa06::Data);
192
193private:
194 config_t _cfg{};
195 spa06::coeffs_t _coeffs{};
196 float _kp{}; // Set by start_periodic_measurement() before any compensation
197 float _kt{};
198 int32_t _seed_tmp_raw{}; // Temperature seeded once for pressure compensation in Mode::Pressure
199 uint8_t _tmp_ext{}; // MEAS_CFG TMP_EXT bit (0 or 0x08) matched to TMP_COEF_SRCE, OR'd into mode writes
200 float _reference_hpa{1013.25f};
201 uint32_t _pushed{}, _consumed{};
202 std::unique_ptr<m5::container::CircularBuffer<spa06::Data>> _data{};
203};
204
205namespace spa06 {
207constexpr uint32_t DEFAULT_STORED_SIZE{4};
208
209namespace command {
211constexpr uint8_t REG_PSR_B2{0x00}; // burst start: PSR(3) + TMP(3) = 6 bytes
212constexpr uint8_t REG_TMP_B2{0x03}; // TMP(3) start (0x03..0x05)
213constexpr uint8_t REG_PRS_CFG{0x06}; // PM_RATE[7:4] PM_PRC[3:0]
214constexpr uint8_t REG_TMP_CFG{0x07}; // TMP_RATE[7:4] TM_PRC[3:0]
215constexpr uint8_t REG_MEAS_CFG{0x08}; // bit7 COEF_RDY, bit6 SENSOR_RDY, bit5 TMP_RDY, bit4 PRS_RDY
216constexpr uint8_t REG_CFG_REG{0x09}; // bit3 TMP_SHIFT_EN, bit2 PRS_SHIFT_EN
217constexpr uint8_t REG_RESET{0x0C};
218constexpr uint8_t REG_ID{0x0D};
219constexpr uint8_t REG_COEF{0x10}; // 0x10..0x24 (21 bytes)
220constexpr uint8_t REG_COEF_SRCE{0x28}; // bit7 TMP_COEF_SRCE (0 internal / 1 external temperature sensor)
222} // namespace command
223} // namespace spa06
224
225} // namespace unit
226} // namespace m5
227#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:478
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:105
bool readOversampling(spa06::Oversampling &pressure_oversampling, spa06::Oversampling &temperature_oversampling)
Read the oversampling.
Definition unit_SPA06.cpp:416
bool writeOversamplingTemperature(const spa06::Oversampling temperature_oversampling)
Write the temperature oversampling.
Definition unit_SPA06.cpp:448
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:328
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:338
float relativeAltitude() const
Altitude (m) relative to the last setReference() tare point (0 m at that pressure)
Definition unit_SPA06.cpp:543
float temperature() const
Latest compensated temperature (degC)
Definition unit_SPA06.cpp:523
bool writeRate(const spa06::Rate rate)
Write the measurement rate (pressure and temperature share the rate)
Definition unit_SPA06.cpp:488
bool writeOversamplingPressure(const spa06::Oversampling pressure_oversampling)
Write the pressure oversampling.
Definition unit_SPA06.cpp:427
void setReference()
Tare the current pressure as the 0 m reference for relativeAltitude()
Definition unit_SPA06.cpp:548
float altitude(const float sea_level_hpa=1013.25f) const
Absolute altitude (m) versus the given sea-level pressure (QNH, hPa)
Definition unit_SPA06.cpp:538
bool writeOversampling(const spa06::Oversampling pressure_oversampling, const spa06::Oversampling temperature_oversampling)
Write the oversampling.
Definition unit_SPA06.cpp:469
virtual bool begin() override
Begin the unit.
Definition unit_SPA06.cpp:50
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_SPA06.cpp:333
float pressure() const
Latest compensated pressure (hPa)
Definition unit_SPA06.cpp:508
virtual void update(const bool force=false) override
Update the unit.
Definition unit_SPA06.cpp:130
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:183
constexpr uint32_t DEFAULT_STORED_SIZE
Default ring buffer depth.
Definition unit_SPA06.hpp:207
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