M5Unit-METER 0.1.0 git rev:2ae611f
Loading...
Searching...
No Matches
unit_DualKmeter.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_METER_UNIT_DUAL_KMETER_HPP
11#define M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16#include <array>
17
18namespace m5 {
19namespace unit {
20
25namespace dual_kmeter {
26
31enum class Channel : uint8_t {
32 One,
33 Two,
34};
35
40enum class MeasurementUnit : uint8_t {
41 Celsius,
43};
44
49struct Data {
50 std::array<uint8_t, 4> raw{};
52
53 //@note Unit depends on setting
54 inline float temperature() const
55 {
56 return static_cast<int32_t>(((uint32_t)raw[3] << 24) | ((uint32_t)raw[2] << 16) | ((uint32_t)raw[1] << 8) |
57 ((uint32_t)raw[0] << 0)) *
58 0.01f;
59 }
60};
61
62} // namespace dual_kmeter
63
89class UnitDualKmeter : public Component, public PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data> {
90 M5_UNIT_COMPONENT_HPP_BUILDER(UnitDualKmeter, 0x11);
91
92public:
97 struct config_t {
99 bool start_periodic{true};
101 uint32_t interval{100};
103 dual_kmeter::Channel measurement_channel{dual_kmeter::Channel::One};
105 dual_kmeter::MeasurementUnit measurement_unit{dual_kmeter::MeasurementUnit::Celsius};
106 };
107
108 explicit UnitDualKmeter(const uint8_t addr = DEFAULT_ADDRESS)
109 : Component(addr), _data{new m5::container::CircularBuffer<dual_kmeter::Data>(1)}
110 {
111 auto ccfg = component_config();
112 ccfg.clock = 100 * 1000U;
113 component_config(ccfg);
114 }
115 virtual ~UnitDualKmeter()
116 {
117 }
118
119 virtual bool begin() override;
120 virtual void update(const bool force = false) override;
121
124
126 {
127 return _cfg;
128 }
130 inline void config(const config_t& cfg)
131 {
132 _cfg = cfg;
133 }
135
138
140 {
141 return _munit;
142 }
145 {
146 return _channel;
147 }
150 {
151 _munit = munit;
152 }
154
158 inline float temperature() const
159 {
160 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
161 }
163
166
171 {
172 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement();
173 }
182 const uint32_t interval, const dual_kmeter::Channel channel = dual_kmeter::Channel::One,
183 const dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius)
184 {
185 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement(interval,
186 channel, munit);
187 }
193 {
194 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::stopPeriodicMeasurement();
195 }
197
203 bool readStatus(uint8_t& status);
204
210 bool readFirmwareVersion(uint8_t& ver);
211
214
224 dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius,
225 const uint32_t timeoutMs = 100);
235 const dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius,
236 const uint32_t timeoutMs = 100);
238
241
252 bool writeCurrentChannel(const dual_kmeter::Channel channel);
254
255protected:
256 inline bool read_register(const uint8_t reg, uint8_t* rbuf, const uint32_t len)
257 {
258 return readRegister(reg, rbuf, len, 0, false);
259 }
260 inline bool read_register8(const uint8_t reg, uint8_t& v)
261 {
262 return readRegister8(reg, v, 0, false);
263 }
264
265 bool start_periodic_measurement();
266 bool start_periodic_measurement(const uint32_t interval, const dual_kmeter::Channel channel,
267 const dual_kmeter::MeasurementUnit munit);
268 bool stop_periodic_measurement();
269
270 bool read_measurement(dual_kmeter::Data& d, const dual_kmeter::MeasurementUnit munit);
271 bool read_internal_measurement(dual_kmeter::Data& d, const dual_kmeter::MeasurementUnit munit);
272
273 bool is_data_ready()
274 {
275 uint8_t s{};
276 return readStatus(s) && (s == 0U);
277 }
278 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitDualKmeter, dual_kmeter::Data);
279
280protected:
281 std::unique_ptr<m5::container::CircularBuffer<dual_kmeter::Data>> _data{};
282 dual_kmeter::MeasurementUnit _munit{dual_kmeter::MeasurementUnit::Celsius};
283 dual_kmeter::Channel _channel{}, _current_channel{};
284 config_t _cfg{};
285};
286
287namespace dual_kmeter {
289namespace command {
290constexpr uint8_t TEMPERATURE_CELSIUS_REG{0x00}; // R
291constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0x04}; // R
292constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0x10}; // R
293constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0x14}; // R
294constexpr uint8_t CHANNEL_REG{0x20}; // R/W
295constexpr uint8_t STATUS_REG{0x30}; // R
296constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x40}; // R
297constexpr uint8_t TEMPERATURE_FAHRENHEITSTRING_REG{0x50}; // R
298constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x60}; // R
299constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEITSTRING_REG{0x70}; // R
300constexpr uint8_t FIRMWARE_VERSION_REG{0xFE}; // R
301} // namespace command
303} // namespace dual_kmeter
304
305} // namespace unit
306} // namespace m5
307
308#endif
Module 13.2 DualKmeter unit.
bool measureSingleshot(dual_kmeter::Data &d, const dual_kmeter::Channel channel, dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure temperature single shot.
Definition unit_DualKmeter.cpp:122
config_t config()
Gets the configration.
Definition unit_DualKmeter.hpp:125
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_DualKmeter.hpp:192
bool readStatus(uint8_t &status)
Read status.
Definition unit_DualKmeter.cpp:110
bool measureInternalSingleshot(dual_kmeter::Data &d, const dual_kmeter::Channel channel, const dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure internal temperature single shot.
Definition unit_DualKmeter.cpp:146
dual_kmeter::MeasurementUnit measurementUnit() const
Definition unit_DualKmeter.hpp:139
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_DualKmeter.hpp:170
bool writeCurrentChannel(const dual_kmeter::Channel channel)
Write the current measure channel.
Definition unit_DualKmeter.cpp:180
float temperature() const
Oldest temperature.
Definition unit_DualKmeter.hpp:158
void setMeasurementUnit(const dual_kmeter::MeasurementUnit munit)
Definition unit_DualKmeter.hpp:149
bool readFirmwareVersion(uint8_t &ver)
Read firmware version.
Definition unit_DualKmeter.cpp:116
bool startPeriodicMeasurement(const uint32_t interval, const dual_kmeter::Channel channel=dual_kmeter::Channel::One, const dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius)
Start periodic measurement @oaram channel Channel to be measured.
Definition unit_DualKmeter.hpp:181
dual_kmeter::Channel measurementChannel() const
Definition unit_DualKmeter.hpp:144
void config(const config_t &cfg)
Set the configration.
Definition unit_DualKmeter.hpp:130
bool readCurrentChannel(dual_kmeter::Channel &channel)
Read the current measure channel.
Definition unit_DualKmeter.cpp:170
For DualKmeter.
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_DualKmeter.hpp:97
bool start_periodic
Start periodic measurement on begin?
Definition unit_DualKmeter.hpp:99
uint32_t interval
periodic interval(ms) if start on begin
Definition unit_DualKmeter.hpp:101
dual_kmeter::MeasurementUnit measurement_unit
//!< measurement unit if start on begin
Definition unit_DualKmeter.hpp:105
dual_kmeter::Channel measurement_channel
//!< measurement channel if start on begin
Definition unit_DualKmeter.hpp:103
Measurement data group.
Definition unit_ADS111x.hpp:204
Measurement data group.
Definition unit_DualKmeter.hpp:49
std::array< uint8_t, 4 > raw
Raw data.
Definition unit_DualKmeter.hpp:50
Channel channel
Which channel?
Definition unit_DualKmeter.hpp:51
@ One
Assert after one conversion.
@ Two
Assert after two conversion.
MeasurementUnit
measurement unit on periodic measurement
Definition unit_DualKmeter.hpp:40
@ Celsius
Temperature unit is celsius.
@ Fahrenheit
Temperature unit is fahrenheit.
Channel
Channel to be measured.
Definition unit_DualKmeter.hpp:31