M5Unit-THERMO 0.4.0 git rev:7cce598
Loading...
Searching...
No Matches
unit_Thermal2.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_THERMO_UNIT_THERMAL2_HPP
11#define M5_UNIT_THERMO_UNIT_THERMAL2_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15
16namespace m5 {
17namespace unit {
18
23class UnitThermal2 : public Component, public PeriodicMeasurementAdapter<UnitThermal2, thermal2::Data> {
24 M5_UNIT_COMPONENT_HPP_BUILDER(UnitThermal2, 0x32);
25
26public:
31 struct config_t {
33 bool start_periodic{true};
35 thermal2::Refresh rate{thermal2::Refresh::Rate16Hz};
37 uint8_t monitor_width{15};
39 uint8_t monitor_height{11};
41 uint8_t function_control{thermal2::enabled_function_led};
43 uint32_t button_interval{20};
44 };
45
46 explicit UnitThermal2(const uint8_t addr = DEFAULT_ADDRESS)
47 : Component(addr), _data{new m5::container::CircularBuffer<thermal2::Data>(1)}
48 {
49 auto ccfg = component_config();
50 ccfg.clock = 400 * 1000U;
51 component_config(ccfg);
52 }
53 virtual ~UnitThermal2()
54 {
55 }
56
57 virtual bool begin() override;
58 virtual void update(const bool force = false) override;
59
62
64 {
65 return _cfg;
66 }
68 inline void config(const config_t& cfg)
69 {
70 _cfg = cfg;
71 }
73
76
82 {
83 return PeriodicMeasurementAdapter<UnitThermal2, thermal2::Data>::startPeriodicMeasurement(rate);
84 }
90 {
91 return PeriodicMeasurementAdapter<UnitThermal2, thermal2::Data>::startPeriodicMeasurement();
92 }
98 {
99 return PeriodicMeasurementAdapter<UnitThermal2, thermal2::Data>::stopPeriodicMeasurement();
100 }
102
105
117
120
126 bool readFunctionControl(uint8_t& value);
132 inline bool readBuzzerEnabled(bool& enabled)
133 {
134 return read_function_control_bit(thermal2::enabled_function_buzzer, enabled);
135 }
141 inline bool readLEDEnabled(bool& enabled)
142 {
143 return read_function_control_bit(thermal2::enabled_function_led, enabled);
144 }
152 bool writeFunctionControl(const uint8_t value, const bool verify = true);
158 inline bool writeBuzzerEnabled(const bool enabled)
159 {
160 return write_function_control_bit(thermal2::enabled_function_buzzer, enabled);
161 }
167 inline bool writeLEDEnabled(const bool enabled)
168 {
169 return write_function_control_bit(thermal2::enabled_function_led, enabled);
170 }
171
184 bool writeRefreshRate(const thermal2::Refresh rate);
185
192 bool readNoiseFilterLevel(uint8_t& level);
199 bool writeNoiseFilterLevel(const uint8_t level);
200
207 bool readTemperatureMonitorSize(uint8_t& wid, uint8_t& hgt);
214 bool writeTemperatureMonitorSize(const uint8_t wid, const uint8_t hgt);
215
217 [[deprecated("Use readTemperatureMonitorSize")]] inline bool readTemeratureMonitorSize(uint8_t& wid, uint8_t& hgt)
218 {
219 return readTemperatureMonitorSize(wid, hgt);
220 }
222 [[deprecated("Use writeTemperatureMonitorSize")]] inline bool writeTemeratureMonitorSize(const uint8_t wid,
223 const uint8_t hgt)
224 {
225 return writeTemperatureMonitorSize(wid, hgt);
226 }
228
231
236 bool readAlarmEnabled(uint8_t& enabled_bits);
243 bool writeAlarmEnabled(const uint8_t enabled_bits);
244
251 bool readAlarmTemperature(const bool highlow, uint16_t& raw);
258 bool readAlarmTemperature(const bool highlow, float& celsius);
267 bool writeAlarmTemperature(const bool highlow, const uint16_t raw);
274 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type = nullptr>
275 inline bool writeAlarmTemperature(const bool highlow, const T celsius)
276 {
277 return std::isfinite(celsius) &&
278 writeAlarmTemperature(highlow, thermal2::celsius_to_raw(static_cast<float>(celsius)));
279 }
280
287 bool readAlarmLED(const bool highlow, uint32_t& rgb);
294 inline bool writeAlarmLED(const bool highlow, const uint32_t rgb)
295 {
296 return writeAlarmLED(highlow, rgb >> 16, rgb >> 8, rgb & 0xFF);
297 }
306 bool writeAlarmLED(const bool highlow, const uint8_t r, const uint8_t g, const uint8_t b);
307
316 bool readAlarmBuzzer(const bool highlow, uint16_t& freq, uint8_t& interval);
325 bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint8_t interval);
327
331
339 bool readBuzzer(uint16_t& freq, uint8_t& duty);
349 bool writeBuzzer(const uint16_t freq, const uint8_t duty, const bool verify = true);
357 bool writeBuzzerDuty(const uint8_t duty);
358
364 inline bool readBuzzerControl(bool& enabled)
365 {
366 return readBuzzerEnabled(enabled);
367 }
373 inline bool writeBuzzerControl(const bool enabled)
374 {
375 return writeBuzzerEnabled(enabled);
376 }
378
382
387 bool readLED(uint32_t& rgb);
394 inline bool writeLED(const uint32_t rgb, const bool verify = true)
395 {
396 return writeLED(rgb >> 16, rgb >> 8, rgb & 0xFF, verify);
397 }
406 bool writeLED(const uint8_t r, const uint8_t g, const uint8_t b, const bool verify = true);
408
411
416 bool readButtonStatus(uint8_t& bs);
417
423 inline bool isPressed() const
424 {
425 return _button & thermal2::button_is_pressed;
426 }
432 inline bool wasPressed() const
433 {
434 return _button & thermal2::button_was_pressed;
435 }
441 inline bool wasReleased() const
442 {
443 return _button & thermal2::button_was_released;
444 }
450 inline bool wasClicked() const
451 {
452 return _button & thermal2::button_was_clicked;
453 }
459 inline bool wasHold() const
460 {
461 return _button & thermal2::button_was_hold;
462 }
468 inline bool isHolding() const
469 {
470 return isPressed() && _holding;
471 }
473
479 bool readFirmwareVersion(uint16_t& ver);
480
483
489 bool changeI2CAddress(const uint8_t i2c_address);
495 bool readI2CAddress(uint8_t& i2c_address);
497
498protected:
499 bool read_function_control_bit(const uint8_t bit, bool& enabled);
500 bool write_function_control_bit(const uint8_t bit, const bool enabled);
501 bool write_function_control(const uint8_t value, const bool verify);
502
503 bool request_data();
504 bool read_data_status(uint8_t s[2]); // [0]:data refresh ctrl, [1]subpage information
505 bool read_data(thermal2::Data& data);
506
507 bool start_periodic_measurement(const thermal2::Refresh rate);
508 bool start_periodic_measurement();
509 bool stop_periodic_measurement();
510
511 inline bool read_register(const uint8_t reg, uint8_t* v, const uint32_t len)
512 {
513 return readRegister(reg, v, len, 0, false /* stopbit false */);
514 }
515
516 inline bool read_register8(const uint8_t reg, uint8_t& v)
517 {
518 return readRegister8(reg, v, 0, false /* stopbit false */);
519 }
520
521 inline bool read_register16LE(const uint8_t reg, uint16_t& v)
522 {
523 return readRegister16LE(reg, v, 0, false /* stopbit false */);
524 }
525
526 inline bool read_register16BE(const uint8_t reg, uint16_t& v)
527 {
528 return readRegister16BE(reg, v, 0, false /* stopbit false */);
529 }
530
531 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitThermal2, thermal2::Data);
532
533private:
534 std::unique_ptr<m5::container::CircularBuffer<thermal2::Data>> _data{};
535 uint8_t _button{}, _holding{};
536 uint32_t _button_interval{20};
537 types::elapsed_time_t _latest_button{};
538 config_t _cfg{};
539};
540
541namespace thermal2 {
543namespace command {
544constexpr uint8_t BUTTON_STATUS_REG{0x00}; // R/W
545constexpr uint8_t TEMPERATURE_ALARM_STATUS_REG{0x01}; // R
546// constexpr uint8_t DEVICE_STATUS_REG{0x02}; // R 2
547constexpr uint8_t DEVICE_ID_REG{0x04}; // R 2
548constexpr uint8_t FIRMWARE_VERSION_REG{0x06}; // R 2
549constexpr uint8_t I2C_ADDRESS_REG{0x08}; // R/W 2 (0x09:bit inverted) I
550constexpr uint8_t FUNCTION_CONTROL_REG{0x0A}; // R/W
551constexpr uint8_t REFRESH_RATE_CONFIG_REG{0x0B}; // R/W I
552constexpr uint8_t NOISE_FILTER_CONFIG_REG{0x0C}; // R/W I
553
554constexpr uint8_t TEMPERATURE_MONITOR_SIZE_REG{0x10}; // R/W I
555constexpr uint8_t ENABLE_TEMPERATURE_ALARM_REG{0x11}; // R/W I
556constexpr uint8_t BUZZER_FREQ_REG{0x12}; // R/W 2
557constexpr uint8_t BUZZER_DUTY_REG{0x14}; // R/W
558constexpr uint8_t LED_REG{0x15}; // R/W 3(R,G,B)
559
560constexpr uint8_t LOW_ALARM_THRESHOLD_REG{0x20}; // R/W 2 I
561constexpr uint8_t LOW_ALARM_BUZZER_FREQ_REG{0x22}; // R/W 2 I
562constexpr uint8_t LOW_ALARM_INTERVAL_REG{0x24}; // R/W I
563constexpr uint8_t LOW_ALARM_LED_REG{0x25}; // R/W 3 I
564
565constexpr uint8_t HIGH_ALARM_THRESHOLD_REG{0x30}; // R/W 2 I
566constexpr uint8_t HIGH_ALARM_BUZZER_FREQ_REG{0x32}; // R/W 2 I
567constexpr uint8_t HIGH_ALARM_INTERVAL_REG{0x34}; // R/W I
568constexpr uint8_t HIGH_ALARM_LED_REG{0x35}; // R/W 3 I
569
570constexpr uint8_t DATA_REFRESH_CONTROL_REG{0x6E}; // R/W I
571constexpr uint8_t SUB_PAGE_INFORMATION_REG{0x6F}; // R
572
573constexpr uint8_t MEDIAN_TEMPERATURE_REG{0x70}; // R 2
574constexpr uint8_t AVERAGE_TEMPERATURE_REG{0x72}; // R 2
575constexpr uint8_t MOST_DIFF_TEMPERATURE_REG{0x74}; // R 2
576constexpr uint8_t MOST_DIFF_X_POS_REG{0x76}; // R
577constexpr uint8_t MOST_DIFF_Y_POS_REG{0x77}; // R
578constexpr uint8_t LOWEST_TEMPERATURE_REG{0x78}; // R 2
579constexpr uint8_t LOWEST_DIFF_X_POS_REG{0x7A}; // R
580constexpr uint8_t LOWEST_DIFF_Y_POS_REG{0x7B}; // R
581constexpr uint8_t HIGHEST_TEMPERATURE_REG{0x7C}; // R 2
582constexpr uint8_t HIGHEST_DIFF_X_POS_REG{0x7E}; // R
583constexpr uint8_t HIGHEST_DIFF_Y_POS_REG{0x7F}; // R
584
585constexpr uint8_t TEMPERATURE_DATA_REG{0x80}; // R 768
586} // namespace command
588} // namespace thermal2
589
590} // namespace unit
591} // namespace m5
592#endif
Unit Thermal2 (MLX90640 32x24 thermal camera, SKU:U149)
bool wasHold() const
Was button hold?
Definition unit_Thermal2.hpp:459
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_Thermal2.cpp:507
bool readBuzzerControl(bool &enabled)
Read the Buzzer control.
Definition unit_Thermal2.hpp:364
bool readNoiseFilterLevel(uint8_t &level)
Read the noise filter level.
Definition unit_Thermal2.cpp:306
bool wasPressed() const
Was button pressed?
Definition unit_Thermal2.hpp:432
bool writeBuzzerControl(const bool enabled)
Write the Buzzer control.
Definition unit_Thermal2.hpp:373
bool readLED(uint32_t &rgb)
Read the LED color.
Definition unit_Thermal2.cpp:465
bool writeTemperatureMonitorSize(const uint8_t wid, const uint8_t hgt)
Write the temperature monitor size.
Definition unit_Thermal2.cpp:332
bool writeTemeratureMonitorSize(const uint8_t wid, const uint8_t hgt)
Definition unit_Thermal2.hpp:222
bool wasReleased() const
Was button released?
Definition unit_Thermal2.hpp:441
bool writeAlarmTemperature(const bool highlow, const uint16_t raw)
Write the alarm temperature threshold.
Definition unit_Thermal2.cpp:371
void config(const config_t &cfg)
Sets the configuration.
Definition unit_Thermal2.hpp:68
bool startPeriodicMeasurement(const thermal2::Refresh rate)
Start periodic measurement.
Definition unit_Thermal2.hpp:81
bool isPressed() const
Is button pressed?
Definition unit_Thermal2.hpp:423
bool readAlarmTemperature(const bool highlow, uint16_t &raw)
Read the alarm temperature threshold.
Definition unit_Thermal2.cpp:352
bool readLEDEnabled(bool &enabled)
Read the LED enabled.
Definition unit_Thermal2.hpp:141
bool writeBuzzerEnabled(const bool enabled)
Write the buzzer enabled.
Definition unit_Thermal2.hpp:158
bool writeAlarmEnabled(const uint8_t enabled_bits)
Write the alarm control.
Definition unit_Thermal2.cpp:347
bool writeAlarmTemperature(const bool highlow, const T celsius)
Write the alarm temperature threshold.
Definition unit_Thermal2.hpp:275
bool writeRefreshRate(const thermal2::Refresh rate)
Write the refresh rate.
Definition unit_Thermal2.cpp:297
bool readTemeratureMonitorSize(uint8_t &wid, uint8_t &hgt)
Definition unit_Thermal2.hpp:217
bool readTemperatureMonitorSize(uint8_t &wid, uint8_t &hgt)
Read the temperature monitor size.
Definition unit_Thermal2.cpp:320
bool writeNoiseFilterLevel(const uint8_t level)
Write the noise filter level.
Definition unit_Thermal2.cpp:311
bool writeAlarmLED(const bool highlow, const uint32_t rgb)
Write the alarm LED color.
Definition unit_Thermal2.hpp:294
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_Thermal2.hpp:97
bool readFirmwareVersion(uint16_t &ver)
Read the firmware version.
Definition unit_Thermal2.cpp:501
bool readAlarmEnabled(uint8_t &enabled_bits)
Read the alarm control.
Definition unit_Thermal2.cpp:342
bool wasClicked() const
Was button clicked?
Definition unit_Thermal2.hpp:450
bool readAlarmLED(const bool highlow, uint32_t &rgb)
Read the alarm LED color.
Definition unit_Thermal2.cpp:377
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_Thermal2.cpp:520
bool writeLEDEnabled(const bool enabled)
Write the LED enabled.
Definition unit_Thermal2.hpp:167
bool measureSingleshot(thermal2::Data &page0, thermal2::Data &page1)
Measurement single shot.
Definition unit_Thermal2.cpp:189
bool writeBuzzer(const uint16_t freq, const uint8_t duty, const bool verify=true)
Write the buzzer settings.
Definition unit_Thermal2.cpp:440
bool writeBuzzerDuty(const uint8_t duty)
Write the buzzer duty settings.
Definition unit_Thermal2.cpp:460
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_Thermal2.hpp:89
bool isHolding() const
Is button holding?
Definition unit_Thermal2.hpp:468
bool readFunctionControl(uint8_t &value)
Read the function control.
Definition unit_Thermal2.cpp:235
bool writeFunctionControl(const uint8_t value, const bool verify=true)
Write the function control.
Definition unit_Thermal2.cpp:241
bool readButtonStatus(uint8_t &bs)
Read the button status.
Definition unit_Thermal2.cpp:492
bool writeLED(const uint32_t rgb, const bool verify=true)
Write the LED color.
Definition unit_Thermal2.hpp:394
config_t config()
Gets the configuration.
Definition unit_Thermal2.hpp:63
bool readBuzzer(uint16_t &freq, uint8_t &duty)
Read the buzzer settings.
Definition unit_Thermal2.cpp:427
bool readAlarmBuzzer(const bool highlow, uint16_t &freq, uint8_t &interval)
Read the alarm buzzer settings.
Definition unit_Thermal2.cpp:398
bool readBuzzerEnabled(bool &enabled)
Read the buzzer enabled.
Definition unit_Thermal2.hpp:132
bool readRefreshRate(thermal2::Refresh &rate)
Read the refresh rate.
Definition unit_Thermal2.cpp:286
bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint8_t interval)
Write the alarm buzzer settings.
Definition unit_Thermal2.cpp:412
Top level namespace of M5stack.
For UnitThermal2.
Unit-related namespace.
Settings for begin.
Definition unit_Thermal2.hpp:31
uint8_t function_control
Function control bits.
Definition unit_Thermal2.hpp:41
uint8_t monitor_height
Temperature monitor height.
Definition unit_Thermal2.hpp:39
uint32_t button_interval
Button status update interval(ms)
Definition unit_Thermal2.hpp:43
thermal2::Refresh rate
Refresh rate if start on begin.
Definition unit_Thermal2.hpp:35
bool start_periodic
Start periodic measurement on begin?
Definition unit_Thermal2.hpp:33
uint8_t monitor_width
Temperature monitor width.
Definition unit_Thermal2.hpp:37
Measurement data group.
Definition unit_Thermal2_data.hpp:103
Thermal2 data types (constants, Refresh, conversions, Data struct)
Refresh
Refresh rate(Hz)
Definition unit_Thermal2_data.hpp:65