M5Unit-METER 0.3.0 git rev:2c09d95
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
41 inline float temperature() const
42 {
43 return static_cast<int32_t>((static_cast<uint32_t>(raw[3]) << 24) | (static_cast<uint32_t>(raw[2]) << 16) |
44 (static_cast<uint32_t>(raw[1]) << 8) | static_cast<uint32_t>(raw[0])) *
45 0.01f;
46 }
47};
48} // namespace kmeter_iso
49
54class UnitKmeterISO : public Component, public PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data> {
55 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKmeterISO, 0x66);
56
57public:
62 struct config_t {
64 bool start_periodic{true};
66 uint32_t interval{100};
68 kmeter_iso::MeasurementUnit measurement_unit{kmeter_iso::MeasurementUnit::Celsius};
69 };
70
71 explicit UnitKmeterISO(const uint8_t addr = DEFAULT_ADDRESS)
72 : Component(addr), _data{new m5::container::CircularBuffer<kmeter_iso::Data>(1)}
73 {
74 auto ccfg = component_config();
75 ccfg.clock = 100 * 1000U;
76 component_config(ccfg);
77 }
78 virtual ~UnitKmeterISO()
79 {
80 }
81
82 virtual bool begin() override;
83 virtual void update(const bool force = false) override;
84
87
89 {
90 return _cfg;
91 }
93 inline void config(const config_t& cfg)
94 {
95 _cfg = cfg;
96 }
98
104 {
105 return _munit;
106 }
110 {
111 _munit = munit;
112 }
114
118 inline float temperature() const
119 {
120 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
121 }
123
126
131 {
132 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::startPeriodicMeasurement();
133 }
140 inline bool startPeriodicMeasurement(const uint32_t interval,
141 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius)
142 {
143 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::startPeriodicMeasurement(interval, munit);
144 }
150 {
151 return PeriodicMeasurementAdapter<UnitKmeterISO, kmeter_iso::Data>::stopPeriodicMeasurement();
152 }
154
160 bool readStatus(uint8_t& status);
161
167 bool readFirmwareVersion(uint8_t& ver);
168
171
180 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius,
181 const uint32_t timeoutMs = 100);
191 const kmeter_iso::MeasurementUnit munit = kmeter_iso::MeasurementUnit::Celsius,
192 const uint32_t timeoutMs = 100);
194
198
204 bool changeI2CAddress(const uint8_t i2c_address);
210 bool readI2CAddress(uint8_t& i2c_address);
212
213protected:
214 bool start_periodic_measurement();
215 bool start_periodic_measurement(const uint32_t interval, const kmeter_iso::MeasurementUnit munit);
216 bool stop_periodic_measurement();
217
218 bool read_measurement(kmeter_iso::Data& d, const kmeter_iso::MeasurementUnit munit);
219 bool read_internal_measurement(kmeter_iso::Data& d, const kmeter_iso::MeasurementUnit munit);
220
221 bool is_data_ready()
222 {
223 uint8_t s{};
224 return readStatus(s) && (s == 0U);
225 }
226 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitKmeterISO, kmeter_iso::Data);
227
228protected:
229 std::unique_ptr<m5::container::CircularBuffer<kmeter_iso::Data>> _data{};
230 kmeter_iso::MeasurementUnit _munit{kmeter_iso::MeasurementUnit::Celsius};
231 config_t _cfg{};
232};
233
234namespace kmeter_iso {
235namespace command {
237// See also https://github.com/m5stack/M5Unit-KMeterISO/blob/main/docs/Unit_KmeterISO_I2C_Protocol.pdf
238constexpr uint8_t TEMPERATURE_CELSIUS_REG{0X00};
239constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0X04};
240constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0X10};
241constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0X14};
242constexpr uint8_t STATUS_REG{0x20};
243constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x30};
244constexpr uint8_t TEMPERATURE_FAHRENHEIT_STRING_REG{0x40};
245constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x50};
246constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_STRING_REG{0x60};
247constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
248constexpr uint8_t I2C_ADDRESS_REG{0xFF};
250} // namespace command
251} // namespace kmeter_iso
252
253} // namespace unit
254} // namespace m5
255#endif
bool measureSingleshot(kmeter_iso::Data &data, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure temperature single shot.
Definition unit_KmeterISO.cpp:122
bool readFirmwareVersion(uint8_t &ver)
Read firmware version.
Definition unit_KmeterISO.cpp:117
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_KmeterISO.cpp:187
void setMeasurementUnit(const kmeter_iso::MeasurementUnit munit)
Set the measurement unit on periodic measurement.
Definition unit_KmeterISO.hpp:109
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_KmeterISO.hpp:149
bool readStatus(uint8_t &status)
Read status.
Definition unit_KmeterISO.cpp:111
kmeter_iso::MeasurementUnit measurementUnit() const
Gets the measurement unit on periodic measurement.
Definition unit_KmeterISO.hpp:103
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_KmeterISO.hpp:130
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_KmeterISO.cpp:162
bool startPeriodicMeasurement(const uint32_t interval, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius)
Start periodic measurement.
Definition unit_KmeterISO.hpp:140
config_t config()
Gets the configuration.
Definition unit_KmeterISO.hpp:88
void config(const config_t &cfg)
Set the configuration.
Definition unit_KmeterISO.hpp:93
float temperature() const
Oldest temperature.
Definition unit_KmeterISO.hpp:118
bool measureInternalSingleshot(kmeter_iso::Data &data, const kmeter_iso::MeasurementUnit munit=kmeter_iso::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure internal temperature single shot.
Definition unit_KmeterISO.cpp:142
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_KmeterISO.hpp:62
uint32_t interval
periodic interval(ms) if start on begin
Definition unit_KmeterISO.hpp:66
bool start_periodic
Start periodic measurement on begin?
Definition unit_KmeterISO.hpp:64
Measurement data group.
Definition unit_KmeterISO.hpp:36
std::array< uint8_t, 4 > raw
Raw data.
Definition unit_KmeterISO.hpp:37
float temperature() const
Temperature value.
Definition unit_KmeterISO.hpp:41
MeasurementUnit
measurement unit on periodic measurement
Definition unit_KmeterISO.hpp:27