M5Unit-THERMO 0.4.0 git rev:7cce598
Loading...
Searching...
No Matches
unit_NCIR2.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_NCIR2_HPP
11#define M5_UNIT_THERMO_UNIT_NCIR2_HPP
12
13#include "unit_NCIR2_data.hpp"
14#include <M5UnitComponent.hpp>
15#include <m5_utility/container/circular_buffer.hpp>
16#include <limits> // NaN
17
18namespace m5 {
19namespace unit {
20
25class UnitNCIR2 : public Component, public PeriodicMeasurementAdapter<UnitNCIR2, ncir2::Data> {
26 M5_UNIT_COMPONENT_HPP_BUILDER(UnitNCIR2, 0x5A);
27
28public:
33 struct config_t {
35 bool start_periodic{true};
37 uint32_t interval{250};
39 uint32_t button_interval{20};
40 };
41
42 explicit UnitNCIR2(const uint8_t addr = DEFAULT_ADDRESS)
43 : Component(addr), _data{new m5::container::CircularBuffer<ncir2::Data>(1)}
44 {
45 auto ccfg = component_config();
46 ccfg.clock = 400 * 1000U;
47 component_config(ccfg);
48 }
49 virtual ~UnitNCIR2()
50 {
51 }
52
53 virtual bool begin() override;
54 virtual void update(const bool force = false) override;
55
58
60 {
61 return _cfg;
62 }
64 inline void config(const config_t& cfg)
65 {
66 _cfg = cfg;
67 }
69
72
76 inline float temperature() const
77 {
78 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
79 }
84 inline float celsius() const
85 {
86 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
87 }
92 inline float fahrenheit() const
93 {
94 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
95 }
97
100
105 inline bool startPeriodicMeasurement(const uint32_t interval)
106 {
107 return PeriodicMeasurementAdapter<UnitNCIR2, ncir2::Data>::startPeriodicMeasurement(interval);
108 }
114 {
115 return PeriodicMeasurementAdapter<UnitNCIR2, ncir2::Data>::startPeriodicMeasurement();
116 }
124 {
125 return PeriodicMeasurementAdapter<UnitNCIR2, ncir2::Data>::stopPeriodicMeasurement();
126 }
128
131
142
145
150 bool readEmissivity(uint16_t& raw);
156 bool readEmissivity(float& e);
163 bool writeEmissivity(const uint16_t raw);
170 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type = nullptr>
171 inline bool writeEmissivity(const T e)
172 {
173 return write_emissivity(static_cast<float>(e));
174 }
176
179
185 bool readAlarmTemperature(const bool highlow, int16_t& raw);
193 bool readAlarmTemperature(const bool highlow, float& celsius);
200 bool writeAlarmTemperature(const bool highlow, const int16_t raw);
208 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type = nullptr>
209 inline bool writeAlarmTemperature(const bool highlow, const T celsius)
210 {
211 return write_alarm_temperature(highlow, static_cast<float>(celsius));
212 }
213
220 bool readAlarmLED(const bool highlow, uint32_t& rgb);
227 inline bool writeAlarmLED(const bool highlow, const uint32_t rgb)
228 {
229 return writeAlarmLED(highlow, rgb >> 16, rgb >> 8, rgb & 0xFF);
230 }
239 bool writeAlarmLED(const bool highlow, const uint8_t r, const uint8_t g, const uint8_t b);
240
249 bool readAlarmBuzzer(const bool highlow, uint16_t& freq, uint16_t& interval, uint8_t& rawDuty);
258 bool readAlarmBuzzer(const bool highlow, uint16_t& freq, uint16_t& interval, float& duty);
267 bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint16_t interval, const uint8_t rawDuty);
276 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type = nullptr>
277 inline bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint16_t interval, const T duty)
278 {
279 return write_alarm_buzzer(highlow, freq, interval, static_cast<float>(duty));
280 }
282
285
291 bool readBuzzer(uint16_t& freq, uint8_t& rawDuty);
298 bool readBuzzer(uint16_t& freq, float& duty);
299
306 bool writeBuzzer(const uint16_t freq, const uint8_t rawDuty);
313 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type = nullptr>
314 inline bool writeBuzzer(const uint16_t freq, const T duty)
315 {
316 return write_buzzer(freq, static_cast<float>(duty));
317 }
318
324 bool readBuzzerControl(bool& enabled);
330 bool writeBuzzerControl(const bool enabled);
332
335
340 bool readLED(uint32_t& rgb);
346 inline bool writeLED(const uint32_t rgb)
347 {
348 return writeLED(rgb >> 16, rgb >> 8, rgb & 0xFF);
349 }
357 bool writeLED(const uint8_t r, const uint8_t g, const uint8_t b);
359
362
370
373
378 bool writeConfig();
380
383
388 bool readButtonStatus(bool& press);
394 inline bool isPressed() const
395 {
396 return _button;
397 }
403 inline bool wasPressed() const
404 {
405 return _button && (_button != _prev_button);
406 }
412 inline bool wasReleased() const
413 {
414 return !_button && (_button != _prev_button);
415 }
417
423 bool readFirmwareVersion(uint8_t& ver);
424
427
432 bool changeI2CAddress(const uint8_t i2c_address);
438 bool readI2CAddress(uint8_t& i2c_address);
440
441protected:
442 bool start_periodic_measurement(const uint32_t interval);
443 bool start_periodic_measurement();
444 bool stop_periodic_measurement();
445
446 bool read_temperature(const uint8_t reg, uint8_t v[2]);
447
448 bool write_emissivity(const float e);
449 bool write_alarm_temperature(const bool highlow, const float celsius);
450 bool write_alarm_buzzer(const bool highlow, const uint16_t freq, const uint16_t interval, const float duty);
451 bool write_buzzer(const uint16_t freq, const float duty);
452
453 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitNCIR2, ncir2::Data);
454
455private:
456 std::unique_ptr<m5::container::CircularBuffer<ncir2::Data>> _data{};
457 bool _button{}, _prev_button{};
458 uint32_t _button_interval{20};
459 types::elapsed_time_t _latest_button{};
460 config_t _cfg{};
461};
462
463namespace ncir2 {
465namespace command {
466constexpr uint8_t TEMPERATURE_REG{0x00}; // R
467constexpr uint8_t EMISSIVITY_REG{0x10}; // R/W
468constexpr uint8_t ALARM_TEMPERATURE_REG{0x20}; // R/W
469constexpr uint8_t ALARM_LED_REG{0x30}; // R/W
470constexpr uint8_t ALARM_BUZZER_REG{0x40}; // W
471constexpr uint8_t ALARM_BUZZER_LOW_FREQ_REG{0x40}; // R/W
472constexpr uint8_t ALARM_BUZZER_LOW_INTERVAL_REG{0x42}; // R/W
473constexpr uint8_t ALARM_BUZZER_LOW_DUTY_REG{0x44}; // R/W
474constexpr uint8_t ALARM_BUZZER_HIGH_FREQ_REG{0x45}; // R/W
475constexpr uint8_t ALARM_BUZZER_HIGH_INTERVAL_REG{0x47}; // R/W
476constexpr uint8_t ALARM_BUZZER_HIGH_DUTY_REG{0x49}; // R/W
477constexpr uint8_t BUZZER_REG{0x50}; // W
478constexpr uint8_t BUZZER_FREQ_REG{0x50}; // R/W
479constexpr uint8_t BUZZER_DUTY_REG{0x52}; // R/W
480constexpr uint8_t BUZZER_CONTROL_REG{0x53}; // R/W
481constexpr uint8_t LED_REG{0x60}; // R/W
482constexpr uint8_t BUTTON_REG{0x70}; // R
483constexpr uint8_t SAVE_CONFIG_REG{0x80}; // W
484constexpr uint8_t CHIP_TEMPERATURE_REG{0x90}; // R
485constexpr uint8_t FIRMWARE_VERSION_REG{0xFE}; // R
486constexpr uint8_t I2C_ADDRESS_REG{0xFF}; // R/W
487} // namespace command
489} // namespace ncir2
490
491} // namespace unit
492} // namespace m5
493
494#endif
MLX90614-based non-contact IR thermometer with STM32 MCU (NCIR2, SKU:U150)
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_NCIR2.hpp:113
bool readEmissivity(uint16_t &raw)
Read the emissivity.
Definition unit_NCIR2.cpp:132
bool writeBuzzer(const uint16_t freq, const uint8_t rawDuty)
Write the buzzer settings.
Definition unit_NCIR2.cpp:296
bool writeConfig()
Write configuration to inner flash.
Definition unit_NCIR2.cpp:352
bool wasPressed() const
Was button pressed?
Definition unit_NCIR2.hpp:403
bool writeAlarmLED(const bool highlow, const uint32_t rgb)
Write the alarm LED color.
Definition unit_NCIR2.hpp:227
bool readChipTemperature(ncir2::Data &d)
Read the Chip temperature.
Definition unit_NCIR2.cpp:347
config_t config()
Gets the configuration.
Definition unit_NCIR2.hpp:59
bool writeAlarmTemperature(const bool highlow, const int16_t raw)
Write the alarm temperature threshold.
Definition unit_NCIR2.cpp:190
bool readAlarmTemperature(const bool highlow, int16_t &raw)
Read the alarm temperature threshold.
Definition unit_NCIR2.cpp:165
bool readBuzzer(uint16_t &freq, uint8_t &rawDuty)
Read the buzzer settings.
Definition unit_NCIR2.cpp:278
float fahrenheit() const
Oldest fahrenheit.
Definition unit_NCIR2.hpp:92
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_NCIR2.hpp:123
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_NCIR2.cpp:398
bool measureSingleshot(ncir2::Data &d)
Measurement single shot.
Definition unit_NCIR2.cpp:123
float celsius() const
Oldest celsius.
Definition unit_NCIR2.hpp:84
bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_NCIR2.cpp:373
bool readButtonStatus(bool &press)
Read the button status.
Definition unit_NCIR2.cpp:362
bool writeEmissivity(const T e)
Write the emissivity.
Definition unit_NCIR2.hpp:171
bool readAlarmLED(const bool highlow, uint32_t &rgb)
Read the alarm LED color.
Definition unit_NCIR2.cpp:209
bool writeBuzzerControl(const bool enabled)
Write the Buzzer control.
Definition unit_NCIR2.cpp:325
bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint16_t interval, const uint8_t rawDuty)
Write the alarm buzzer settings.
Definition unit_NCIR2.cpp:251
bool readBuzzerControl(bool &enabled)
Read the Buzzer control.
Definition unit_NCIR2.cpp:314
bool startPeriodicMeasurement(const uint32_t interval)
Start periodic measurement.
Definition unit_NCIR2.hpp:105
bool readLED(uint32_t &rgb)
Read the LED color.
Definition unit_NCIR2.cpp:330
bool writeBuzzer(const uint16_t freq, const T duty)
Write the buzzer settings.
Definition unit_NCIR2.hpp:314
bool writeAlarmBuzzer(const bool highlow, const uint16_t freq, const uint16_t interval, const T duty)
Write the alarm buzzer settings.
Definition unit_NCIR2.hpp:277
bool writeLED(const uint32_t rgb)
Write the LED color.
Definition unit_NCIR2.hpp:346
void config(const config_t &cfg)
Sets the configuration.
Definition unit_NCIR2.hpp:64
float temperature() const
Oldest temperature.
Definition unit_NCIR2.hpp:76
bool isPressed() const
Is button pressed?
Definition unit_NCIR2.hpp:394
bool writeEmissivity(const uint16_t raw)
Write the emissivity.
Definition unit_NCIR2.cpp:150
bool writeAlarmTemperature(const bool highlow, const T celsius)
Write the alarm temperature threshold.
Definition unit_NCIR2.hpp:209
bool readAlarmBuzzer(const bool highlow, uint16_t &freq, uint16_t &interval, uint8_t &rawDuty)
Read the alarm buzzer settings.
Definition unit_NCIR2.cpp:230
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_NCIR2.cpp:378
bool wasReleased() const
Was button released?
Definition unit_NCIR2.hpp:412
Top level namespace of M5stack.
For UnitNCIR2.
Unit-related namespace.
Settings for begin.
Definition unit_NCIR2.hpp:33
bool start_periodic
Start periodic measurement on begin?
Definition unit_NCIR2.hpp:35
uint32_t button_interval
Button status update interval(ms)
Definition unit_NCIR2.hpp:39
uint32_t interval
Measurement interval if start on begin (ms)
Definition unit_NCIR2.hpp:37
Measurement data group.
Definition unit_NCIR2_data.hpp:34
NCIR2 data types (Data struct)