M5Unit-TUBE 0.0.2 git rev:56c1d96
Loading...
Searching...
No Matches
unit_MCP_H10.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_TUBE_UNIT_MCP_H10_HPP
11#define M5_UNIT_TUBE_UNIT_MCP_H10_HPP
12
13#include <M5UnitComponent.hpp>
14#include <limits> // NaN
15
16namespace m5 {
17namespace unit {
18
23namespace mcp_h10 {
24
29struct Data {
30 uint16_t raw{};
31 float voltage{};
32
34 inline float pressure() const
35 {
36 return voltage * k + b;
37 }
38
39 float k{};
40 float b{};
41};
42
43} // namespace mcp_h10
44
82class UnitMCP_H10 : public Component, public PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data> {
83 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMCP_H10, 0x00 /* No I2C */);
84
85public:
93 explicit UnitMCP_H10(const float minV, const float maxV, const float coefficient, const float offset)
94 : Component(DEFAULT_ADDRESS),
95 _data{new m5::container::CircularBuffer<mcp_h10::Data>(1)},
96 _minV{minV},
97 _maxV{maxV},
98 _coefficient{coefficient},
99 _offset{offset}
100 {
101 }
102 virtual ~UnitMCP_H10() = default;
103
106 virtual bool begin() override;
109 virtual void update(const bool force = false) override;
110
115 struct config_t {
117 bool start_periodic{true};
119 uint32_t interval_ms{100};
121 float calib_vzero{};
122 };
123
126
128 {
129 return _cfg;
130 }
132 inline void config(const config_t& cfg)
133 {
134 _cfg = cfg;
135 }
137
141 inline float coefficient() const
142 {
143 return _coefficient;
144 }
146 inline float offset() const
147 {
148 return _offset;
149 }
151 inline float minimumVoltage() const
152 {
153 return _minV;
154 }
156 inline float maximumVoltage() const
157 {
158 return _maxV;
159 }
161 inline float voltageRange() const
162 {
163 return maximumVoltage() - minimumVoltage();
164 }
165
167
171 inline float pressure() const
172 {
173 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
174 }
176
179
184 inline bool startPeriodicMeasurement(const uint32_t interval)
185 {
186 return PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data>::startPeriodicMeasurement(interval);
187 }
193 {
194 return PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data>::stopPeriodicMeasurement();
195 }
197
200
208
212 inline bool isCalibrated() const
213 {
214 return _calib_zero_diff != 0.0f;
215 }
220 void setCalibration(const float vzero)
221 {
222 const float ideal_zero_voltage = -offset() / coefficient();
223 _calib_zero_diff = vzero - ideal_zero_voltage;
224 }
226 inline void clearCalibration()
227 {
228 _calib_zero_diff = 0.0f;
229 }
231
232protected:
233 bool read_measurement(mcp_h10::Data& d);
234 bool read_voltage_millivolts(float& voltage, uint16_t& raw);
235 bool read_voltage_via_pbhub(float& voltage, uint16_t& raw);
236 bool start_periodic_measurement(const uint32_t interval);
237 bool stop_periodic_measurement();
238
239 std::unique_ptr<m5::container::CircularBuffer<mcp_h10::Data>> _data{};
240
241 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitMCP_H10, mcp_h10::Data);
242
243private:
244 float _minV{}, _maxV{}, _coefficient{}, _offset{};
245 float _calib_zero_diff{};
246 config_t _cfg{};
247 bool _via_pbhub{};
248};
249
254class UnitMCP_H10_B200KPPN : public UnitMCP_H10 {
255 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMCP_H10_B200KPPN, 0x00 /* No I2C */);
256
257public:
258 explicit UnitMCP_H10_B200KPPN() : UnitMCP_H10(0.1f, 3.1f, 100.f, -110.f)
259 {
260 }
261 virtual ~UnitMCP_H10_B200KPPN() = default;
262};
263
264} // namespace unit
265} // namespace m5
266#endif
MCP-H10 family unit base class.
bool measureSingleshot(mcp_h10::Data &d)
Measurement single shot.
Definition unit_MCP_H10.cpp:83
bool isCalibrated() const
Returns true if calibration is set.
Definition unit_MCP_H10.hpp:212
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_MCP_H10.hpp:192
UnitMCP_H10(const float minV, const float maxV, const float coefficient, const float offset)
Constructor.
Definition unit_MCP_H10.hpp:93
virtual void update(const bool force=false) override
Update periodic measurement.
Definition unit_MCP_H10.cpp:49
config_t config()
Gets the configuration.
Definition unit_MCP_H10.hpp:127
float maximumVoltage() const
maximum voltage (OH)
Definition unit_MCP_H10.hpp:156
float minimumVoltage() const
minimum voltage (OL)
Definition unit_MCP_H10.hpp:151
void setCalibration(const float vzero)
Set calibration parameter.
Definition unit_MCP_H10.hpp:220
float offset() const
offset (B)
Definition unit_MCP_H10.hpp:146
virtual bool begin() override
Begin unit, applying config_t settings.
Definition unit_MCP_H10.cpp:26
void config(const config_t &cfg)
Set the configuration.
Definition unit_MCP_H10.hpp:132
bool startPeriodicMeasurement(const uint32_t interval)
Start periodic measurement.
Definition unit_MCP_H10.hpp:184
void clearCalibration()
Disable calibration.
Definition unit_MCP_H10.hpp:226
float pressure() const
Oldest measured pressure (kPA)
Definition unit_MCP_H10.hpp:171
float voltageRange() const
Voltage range.
Definition unit_MCP_H10.hpp:161
float coefficient() const
coefficient (K)
Definition unit_MCP_H10.hpp:141
Top level namespace of M5stack.
For MCP-H10 family.
Unit-related namespace.
Settings for begin.
Definition unit_MCP_H10.hpp:115
bool start_periodic
Start periodic measurement on begin?
Definition unit_MCP_H10.hpp:117
float calib_vzero
Calibration (Voltage value to be considered as pressure 0)
Definition unit_MCP_H10.hpp:121
uint32_t interval_ms
Interval time if start on begin (ms)
Definition unit_MCP_H10.hpp:119
Measurement data group.
Definition unit_MCP_H10.hpp:29
uint16_t raw
ADC reading (millivolts via GPIO, raw count via PbHub)
Definition unit_MCP_H10.hpp:30
float voltage
Voltage after clamp and calibration.
Definition unit_MCP_H10.hpp:31
float k
Calibration coefficient (K)
Definition unit_MCP_H10.hpp:39
float b
Calibration offset (B)
Definition unit_MCP_H10.hpp:40
float pressure() const
Calculate pressure from voltage using linear calibration (P = k * V + b)
Definition unit_MCP_H10.hpp:34