10#ifndef M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
11#define M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
50 std::array<uint8_t, 4>
raw{};
54 inline float temperature()
const
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)) *
89class UnitDualKmeter :
public Component,
public PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data> {
90 M5_UNIT_COMPONENT_HPP_BUILDER(UnitDualKmeter, 0x11);
109 : Component(addr), _data{new
m5::container::CircularBuffer<
dual_kmeter::
Data>(1)}
111 auto ccfg = component_config();
112 ccfg.clock = 100 * 1000U;
113 component_config(ccfg);
115 virtual ~UnitDualKmeter()
119 virtual bool begin()
override;
120 virtual void update(
const bool force =
false)
override;
160 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
172 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement();
185 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement(interval,
194 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::stopPeriodicMeasurement();
225 const uint32_t timeoutMs = 100);
236 const uint32_t timeoutMs = 100);
256 inline bool read_register(
const uint8_t reg, uint8_t* rbuf,
const uint32_t len)
258 return readRegister(reg, rbuf, len, 0,
false);
260 inline bool read_register8(
const uint8_t reg, uint8_t& v)
262 return readRegister8(reg, v, 0,
false);
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();
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);
278 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitDualKmeter, dual_kmeter::Data);
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{};
290constexpr uint8_t TEMPERATURE_CELSIUS_REG{0x00};
291constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0x04};
292constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0x10};
293constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0x14};
294constexpr uint8_t CHANNEL_REG{0x20};
295constexpr uint8_t STATUS_REG{0x30};
296constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x40};
297constexpr uint8_t TEMPERATURE_FAHRENHEITSTRING_REG{0x50};
298constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x60};
299constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEITSTRING_REG{0x70};
300constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
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
Top level namespace of M5stack.
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