M5Unit-TUBE 0.0.1 git rev:12e5f29
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{}; // Raw data
31 float voltage{}; // Calculated voltage
32
33 inline float pressure() const
34 {
35 return voltage * k + b;
36 }
37
38 float k{}, b{};
39};
40
41} // namespace mcp_h10
42
80class UnitMCP_H10 : public Component, public PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data> {
81 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMCP_H10, 0x00 /* No I2C */);
82
83public:
91 explicit UnitMCP_H10(const float minV, const float maxV, const float coefficient, const float offset)
92 : Component(DEFAULT_ADDRESS),
93 _data{new m5::container::CircularBuffer<mcp_h10::Data>(1)},
94 _minV{minV},
95 _maxV{maxV},
96 _coefficient{coefficient},
97 _offset{offset}
98 {
99 }
100 virtual ~UnitMCP_H10() = default;
101
102 virtual bool begin() override;
103 virtual void update(const bool force = false) override;
104
109 struct config_t {
111 bool start_periodic{true};
113 uint32_t interval_ms{100};
115 float calib_vzero{};
116 };
117
120
122 {
123 return _cfg;
124 }
126 inline void config(const config_t& cfg)
127 {
128 _cfg = cfg;
129 }
131
135 inline float coefficient() const
136 {
137 return _coefficient;
138 }
140 inline float offset() const
141 {
142 return _offset;
143 }
145 inline float minimumVoltage() const
146 {
147 return _minV;
148 }
150 inline float maximumVoltage() const
151 {
152 return _maxV;
153 }
155 inline float voltageRange() const
156 {
157 return maximumVoltage() - minimumVoltage();
158 }
159
161
165 inline float pressure() const
166 {
167 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
168 }
170
173
178 inline bool startPeriodicMeasurement(const uint32_t interval)
179 {
180 return PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data>::startPeriodicMeasurement(interval);
181 }
187 {
188 return PeriodicMeasurementAdapter<UnitMCP_H10, mcp_h10::Data>::stopPeriodicMeasurement();
189 }
191
194
201
204 inline bool isCalibrated() const
205 {
206 return _calib_zero_diff != 0.0f;
207 }
212 void setCalibration(const float vzero)
213 {
214 const float ideal_zero_voltage = -offset() / coefficient();
215 _calib_zero_diff = vzero - ideal_zero_voltage;
216 }
218 inline void clearCalibration()
219 {
220 _calib_zero_diff = 0.0f;
221 };
223
224protected:
225 bool read_measurement(mcp_h10::Data& d);
226 bool start_periodic_measurement(const uint32_t interval);
227 bool stop_periodic_measurement();
228
229 std::unique_ptr<m5::container::CircularBuffer<mcp_h10::Data>> _data{};
230
231 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitMCP_H10, mcp_h10::Data);
232
233private:
234 float _minV{}, _maxV{}, _coefficient{}, _offset{};
235 float _calib_zero_diff{};
236 config_t _cfg{};
237};
238
243class UnitMCP_H10_B200KPPN : public UnitMCP_H10 {
244 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMCP_H10_B200KPPN, 0x00 /* No I2C */);
245
246public:
247 explicit UnitMCP_H10_B200KPPN() : UnitMCP_H10(0.1f, 3.1f, 100.f, -110.f)
248 {
249 }
250 virtual ~UnitMCP_H10_B200KPPN() = default;
251};
252
256} // namespace unit
257} // namespace m5
258#endif
MCP-H10 family unit base class.
bool measureSingleshot(mcp_h10::Data &d)
Measurement single shot.
Definition unit_MCP_H10.cpp:78
bool isCalibrated() const
Set calibration parameter.
Definition unit_MCP_H10.hpp:204
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_MCP_H10.hpp:186
UnitMCP_H10(const float minV, const float maxV, const float coefficient, const float offset)
Constructor.
Definition unit_MCP_H10.hpp:91
config_t config()
Gets the configration.
Definition unit_MCP_H10.hpp:121
float maximumVoltage() const
maximum voltage (OH)
Definition unit_MCP_H10.hpp:150
float minimumVoltage() const
minimum voltage (OL)
Definition unit_MCP_H10.hpp:145
void setCalibration(const float vzero)
Set calibration parameter.
Definition unit_MCP_H10.hpp:212
float offset() const
offset (B)
Definition unit_MCP_H10.hpp:140
void config(const config_t &cfg)
Set the configration.
Definition unit_MCP_H10.hpp:126
bool startPeriodicMeasurement(const uint32_t interval)
Start periodic measurement.
Definition unit_MCP_H10.hpp:178
void clearCalibration()
Disable calibration.
Definition unit_MCP_H10.hpp:218
float pressure() const
Oldest measured pressure (kPA)
Definition unit_MCP_H10.hpp:165
float voltageRange() const
Voltage range.
Definition unit_MCP_H10.hpp:155
float coefficient() const
coefficient (K)
Definition unit_MCP_H10.hpp:135
Top level namespace of M5stack.
For MCP-H10 family.
Unit-related namespace.
Settings for begin.
Definition unit_MCP_H10.hpp:109
bool start_periodic
Start periodic measurement on begin?
Definition unit_MCP_H10.hpp:111
float calib_vzero
Calibration (Voltage value to be considered as pressure 0)
Definition unit_MCP_H10.hpp:115
uint32_t interval_ms
Interval time if start on begin (ms)
Definition unit_MCP_H10.hpp:113
Measurement data group.
Definition unit_MCP_H10.hpp:29