M5Unit-METER 0.1.0 git rev:2ae611f
Loading...
Searching...
No Matches
unit_KmeterISO.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_METER_UNIT_KMETERISO_HPP
11#define M5_UNIT_METER_UNIT_KMETERISO_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
21namespace kmeter_iso {
22
27enum class MeasurementUnit : uint8_t {
28 Celsius,
29 Fahrenheit,
30};
31
36struct Data {
37 std::array<uint8_t, 4> raw{};
38
39 //@note Unit depends on setting
40 inline float temperature() const
41 {
42 return static_cast<int32_t>(((uint32_t)raw[3] << 24) | ((uint32_t)raw[2] << 16) | ((uint32_t)raw[1] << 8) |
43 ((uint32_t)raw[0] << 0)) *
44 0.01f;
45 }
46};
47} // namespace kmeter_iso
48
53class UnitKmeterISO : public Component, public PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data> {
54 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKmeterISO, 0x66);
55
56public:
61 struct config_t {
63 bool start_periodic{true};
65 uint32_t interval{100};
67 kmeter_iso::MeasurementUnit measurement_unit{kmeter_iso::MeasurementUnit::Celsius};
68 };
69
70 explicit UnitKmeterISO(const uint8_t addr = DEFAULT_ADDRESS)
71 : Component(addr), _data{new m5::container::CircularBuffer<kmeter_iso::Data>(1)}
72 {
73 auto ccfg = component_config();
74 ccfg.clock = 100 * 1000U;
75 component_config(ccfg);
76 }
77 virtual ~UnitKmeterISO()
78 {
79 }
80
81 virtual bool begin() override;
82 virtual void update(const bool force = false) override;
83
86
88 {
89 return _cfg;
90 }
92 inline void config(const config_t& cfg)
93 {
94 _cfg = cfg;
95 }
97
100
102 {
103 return _munit;
104 }
107 {
108 _munit = munit;
109 }
111
115 inline float temperature() const
116 {
117 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
118 }
120
123
128 {
129 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::startPeriodicMeasurement();
130 }
137 inline bool startPeriodicMeasurement(const uint32_t interval,
138 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius)
139 {
140 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::startPeriodicMeasurement(interval, munit);
141 }
147 {
148 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::stopPeriodicMeasurement();
149 }
151
157 bool readStatus(uint8_t& status);
158
164 bool readFirmwareVersion(uint8_t& ver);
165
168
177 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius,
178 const uint32_t timeoutMs = 100);
188 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius,
189 const uint32_t timeoutMs = 100);
191
195
201 bool changeI2CAddress(const uint8_t i2c_address);
207 bool readI2CAddress(uint8_t& i2c_address);
209
210protected:
211 bool start_periodic_measurement();
212 bool start_periodic_measurement(const uint32_t interval, const kmeter_iso::MeasurementUnit munit);
213 bool stop_periodic_measurement();
214
215 bool read_measurement(kmeter_iso::Data& d, const kmeter_iso::MeasurementUnit munit);
216 bool read_internal_measurement(kmeter_iso::Data& d, const kmeter_iso::MeasurementUnit munit);
217
218 bool is_data_ready()
219 {
220 uint8_t s{};
221 return readStatus(s) && (s == 0U);
222 }
223 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitKmeterISO, kmeter_iso::Data);
224
225protected:
226 std::unique_ptr<m5::container::CircularBuffer<kmeter_iso::Data>> _data{};
227 kmeter_iso::MeasurementUnit _munit{kmeter_iso::MeasurementUnit::Celsius};
228 config_t _cfg{};
229};
230
231namespace kmeter_iso {
232namespace command {
234// See also https://github.com/m5stack/M5Unit-KMeterISO/blob/main/docs/Unit_KmeterISO_I2C_Protocol.pdf
235constexpr uint8_t TEMPERATURE_CELSIUS_REG{0X00};
236constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0X04};
237constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0X10};
238constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0X14};
239constexpr uint8_t STATUS_REG{0x20};
240constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x30};
241constexpr uint8_t TEMPERATURE_FAHRENHEIT_STRING_REG{0x40};
242constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x50};
243constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_STRING_REG{0x60};
244constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
245constexpr uint8_t I2C_ADDRESS_REG{0xFF};
247} // namespace command
248} // namespace kmeter_iso
249
250} // namespace unit
251} // namespace m5
252#endif
bool readFirmwareVersion(uint8_t &ver)
Read firmware version.
Definition unit_KmeterISO.cpp:109
bool measureSingleshot(kmeter_iso::Data &d, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure temperature single shot.
Definition unit_KmeterISO.cpp:114
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_KmeterISO.cpp:179
void setMeasurementUnit(const kmeter_iso::MeasurementUnit munit)
Definition unit_KmeterISO.hpp:106
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_KmeterISO.hpp:146
bool measureInternalSingleshot(kmeter_iso::Data &d, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure internal temperature single shot.
Definition unit_KmeterISO.cpp:134
bool readStatus(uint8_t &status)
Read status.
Definition unit_KmeterISO.cpp:103
kmeter_iso::MeasurementUnit measurementUnit() const
Definition unit_KmeterISO.hpp:101
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_KmeterISO.hpp:127
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_KmeterISO.cpp:154
bool startPeriodicMeasurement(const uint32_t interval, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius)
Start periodic measurement.
Definition unit_KmeterISO.hpp:137
config_t config()
Gets the configration.
Definition unit_KmeterISO.hpp:87
void config(const config_t &cfg)
Set the configration.
Definition unit_KmeterISO.hpp:92
float temperature() const
Oldest temperature.
Definition unit_KmeterISO.hpp:115
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_KmeterISO.hpp:61
uint32_t interval
periodic interval(ms) if start on begin
Definition unit_KmeterISO.hpp:65
bool start_periodic
Start periodic measurement on begin?
Definition unit_KmeterISO.hpp:63
kmeter_iso::MeasurementUnit measurement_unit
//!< measurement unit if start on begin
Definition unit_KmeterISO.hpp:67
Measurement data group.
Definition unit_ADS111x.hpp:204
Measurement data group.
Definition unit_KmeterISO.hpp:36
std::array< uint8_t, 4 > raw
Raw data.
Definition unit_KmeterISO.hpp:37
MeasurementUnit
measurement unit on periodic measurement
Definition unit_KmeterISO.hpp:27