M5Unit-THERMO 0.4.0 git rev:7cce598
Loading...
Searching...
No Matches
unit_MLX90614.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_THERMO_UNIT_MLX90614_HPP
11#define M5_UNIT_THERMO_UNIT_MLX90614_HPP
12
14#include <M5UnitComponent.hpp>
15#include <m5_utility/container/circular_buffer.hpp>
16#include <limits> // NaN
17
18namespace m5 {
19namespace unit {
20
29class UnitMLX90614 : public Component, public PeriodicMeasurementAdapter<UnitMLX90614, mlx90614::Data> {
30 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMLX90614, 0x5A);
31
32public:
37 struct config_t {
39 bool start_periodic{true};
41 mlx90614::IIR iir{mlx90614::IIR::Filter100};
43 mlx90614::FIR fir{mlx90614::FIR::Filter1024};
45 mlx90614::Gain gain{mlx90614::Gain::Coeff12_5};
47 mlx90614::IRSensor irs{mlx90614::IRSensor::Single};
49 float emissivity{1.0f};
50 };
51
52 explicit UnitMLX90614(const uint8_t addr = DEFAULT_ADDRESS)
53 : Component(addr), _data{new m5::container::CircularBuffer<mlx90614::Data>(1)}
54 {
55 // SMBus: 10 kHz to 100 kHz (MLX90614 datasheet 8.4.7 Timing specification)
56 auto ccfg = component_config();
57 ccfg.clock = 100 * 1000U;
58 component_config(ccfg);
59 }
60 virtual ~UnitMLX90614()
61 {
62 }
63
64 virtual bool begin() override;
65 virtual void update(const bool force = false) override;
66
69
71 {
72 return _cfg;
73 }
75 inline void config(const config_t& cfg)
76 {
77 _cfg = cfg;
78 }
80
82 const mlx90614::EEPROM& eeprom() const
83 {
84 return _eeprom;
85 }
86
90 inline float ambientKelvin() const
91 {
92 return !empty() ? oldest().ambientKelvin() : std::numeric_limits<float>::quiet_NaN();
93 }
95 inline float ambientTemperature() const
96 {
97 return !empty() ? oldest().ambientTemperature() : std::numeric_limits<float>::quiet_NaN();
98 }
100 inline float ambientCelsius() const
101 {
102 return !empty() ? oldest().ambientCelsius() : std::numeric_limits<float>::quiet_NaN();
103 }
105 inline float ambientFahrenheit() const
106 {
107 return !empty() ? oldest().ambientFahrenheit() : std::numeric_limits<float>::quiet_NaN();
108 }
110 inline float objectKelvin1() const
111 {
112 return !empty() ? oldest().objectKelvin1() : std::numeric_limits<float>::quiet_NaN();
113 }
115 inline float objectTemperature1() const
116 {
117 return !empty() ? oldest().objectTemperature1() : std::numeric_limits<float>::quiet_NaN();
118 }
120 inline float objectCelsius1() const
121 {
122 return !empty() ? oldest().objectCelsius1() : std::numeric_limits<float>::quiet_NaN();
123 }
125 inline float objectFahrenheit1() const
126 {
127 return !empty() ? oldest().objectFahrenheit1() : std::numeric_limits<float>::quiet_NaN();
128 }
130 inline float objectKelvin2() const
131 {
132 return !empty() ? oldest().objectKelvin2() : std::numeric_limits<float>::quiet_NaN();
133 }
135 inline float objectTemperature2() const
136 {
137 return !empty() ? oldest().objectTemperature2() : std::numeric_limits<float>::quiet_NaN();
138 }
140 inline float objectCelsius2() const
141 {
142 return !empty() ? oldest().objectCelsius2() : std::numeric_limits<float>::quiet_NaN();
143 }
145 inline float objectFahrenheit2() const
146 {
147 return !empty() ? oldest().objectFahrenheit2() : std::numeric_limits<float>::quiet_NaN();
148 }
150
153
161 inline bool startPeriodicMeasurement(const mlx90614::IIR iir, const mlx90614::FIR fir, const mlx90614::Gain gain,
162 const mlx90614::IRSensor irs)
163 {
164 return PeriodicMeasurementAdapter<UnitMLX90614, mlx90614::Data>::startPeriodicMeasurement(iir, fir, gain, irs);
165 }
171 {
172 return PeriodicMeasurementAdapter<UnitMLX90614, mlx90614::Data>::startPeriodicMeasurement();
173 }
179 {
180 return PeriodicMeasurementAdapter<UnitMLX90614, mlx90614::Data>::stopPeriodicMeasurement();
181 }
183
189
194 bool readConfig(uint16_t& v);
202 bool writeConfig(const uint16_t v, const bool apply = true);
218 bool writeOutput(const mlx90614::Output o, const bool apply = true);
224 bool readIIR(mlx90614::IIR& iir);
232 bool writeIIR(const mlx90614::IIR iir, const bool apply = true);
238 bool readFIR(mlx90614::FIR& fir);
246 bool writeFIR(const mlx90614::FIR fir, const bool apply = true);
252 bool readGain(mlx90614::Gain& gain);
261 bool writeGain(const mlx90614::Gain gain, const bool apply = true);
276 bool writeIRSensor(const mlx90614::IRSensor irs, const bool apply = true);
283 bool readPositiveKs(bool& pos);
292 bool writePositiveKs(const bool pos, const bool apply = true);
299 bool readPositiveKt2(bool& pos);
308 bool writePositiveKt2(const bool pos, const bool apply = true);
309
311 [[deprecated("Use readPositiveKt2")]] inline bool readPositiveKf2(bool& pos)
312 {
313 return readPositiveKt2(pos);
314 }
316 [[deprecated("Use writePositiveKt2")]] inline bool writePositiveKf2(const bool pos, const bool apply = true)
317 {
318 return writePositiveKt2(pos, apply);
319 }
321
327
333 bool readObjectMinMax(uint16_t& toMin, uint16_t& toMax);
340 bool readObjectMinMax(float& toMin, float& toMax);
349 template <typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
350 inline bool writeObjectMinMax(const T toMin, const T toMax, const bool apply = true)
351 {
352 return write_object_minmax((uint16_t)toMin, (uint16_t)toMax, apply);
353 }
363 bool writeObjectMinMax(const float toMin, const float toMax, const bool apply = true);
370 bool readAmbientMinMax(uint8_t& taMin, uint8_t& taMax);
377 bool readAmbientMinMax(float& taMin, float& taMax);
386 template <typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
387 inline bool writeAmbientMinMax(const T taMin, const T taMax, const bool apply = true)
388 {
389 return write_ambient_minmax((uint8_t)taMin, (uint8_t)taMax, apply);
390 }
400 bool writeAmbientMinMax(const float taMin, const float taMax, const bool apply = true);
402
407
412 bool readEmissivity(uint16_t& emiss);
418 bool readEmissivity(float& emiss);
426 template <typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
427 inline bool writeEmissivity(const T emiss, const bool apply = true)
428 {
429 return write_emissivity((uint16_t)emiss, apply);
430 }
438 bool writeEmissivity(const float emiss, const bool apply = true);
440
443
450 bool changeI2CAddress(const uint8_t i2c_address);
456 bool readI2CAddress(uint8_t& i2c_address);
458
468 bool sleep();
476 bool wakeup();
484 inline bool applySettings()
485 {
486 return sleep() && wakeup();
487 }
488
489protected:
490 bool read_eeprom(mlx90614::EEPROM& e);
491 bool read_register16(const uint8_t reg, uint16_t& v, const bool stopbit = false);
492 bool write_register16(const uint8_t reg, const uint16_t val);
493 bool write_eeprom(const uint8_t reg, const uint16_t val, const bool apply = true);
494 bool write_object_minmax(const uint16_t toMin, const uint16_t toMax, const bool apply = true);
495 bool write_ambient_minmax(const uint8_t taMin, const uint8_t taMax, const bool apply = true);
496 bool write_emissivity(const uint16_t emiss, const bool apply = true);
497 bool read_measurement(mlx90614::Data& d);
498
499 bool start_periodic_measurement(const mlx90614::IIR iir, const mlx90614::FIR fir, const mlx90614::Gain gain,
500 const mlx90614::IRSensor irs);
501 bool start_periodic_measurement();
502 bool stop_periodic_measurement();
503
504 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitMLX90614, mlx90614::Data);
505
506 // Override for dual zone (xBx / xCx) parts
507 virtual uint32_t get_interval(const mlx90614::IIR iir, const mlx90614::FIR fir);
508 virtual bool has_dual_sensors() const
509 {
510 return false;
511 }
512
513private:
514 std::unique_ptr<m5::container::CircularBuffer<mlx90614::Data>> _data{};
515 mlx90614::EEPROM _eeprom{};
516 config_t _cfg{};
517 bool _bus_released{}; // sleep() left the bus released (SCL held low)
518};
519
526class UnitMLX90614BAA : public UnitMLX90614 {
527 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMLX90614BAA, 0x5A);
528
529public:
530 explicit UnitMLX90614BAA(const uint8_t addr = DEFAULT_ADDRESS) : UnitMLX90614(addr)
531 {
532 }
533};
534
536namespace mlx90614 {
537namespace command {
538// Category bits
539constexpr uint8_t COMMAND_RAM{0x00}; // 000xxxxx
540constexpr uint8_t COMMAND_EEPROM{0x20}; // 001xxxxx
541constexpr uint8_t COMMAND_READ_FLAGS{0xF0}; // 11110000
542constexpr uint8_t COMMAND_ENTER_SLEEP{0xFF}; // 11111111 This mode is not available for the 5V supply version
543// RAM
544constexpr uint8_t READ_RAW_AMBIENT{0x03};
545constexpr uint8_t READ_RAW_IR1{0x04};
546constexpr uint8_t READ_RAW_IR2{0x05};
547constexpr uint8_t READ_TAMBIENT{0x06};
548constexpr uint8_t READ_TOBJECT_1{0x07};
549constexpr uint8_t READ_TOBJECT_2{0x08};
550// EEPROM
551constexpr uint8_t EEPROM_TO_MAX{0x20};
552constexpr uint8_t EEPROM_TO_MIN{0x21};
553constexpr uint8_t EEPROM_PWMCTRL{0x22};
554constexpr uint8_t EEPROM_TARANGE{0x23};
555constexpr uint8_t EEPROM_EMISSIVITY{0x24};
556constexpr uint8_t EEPROM_CONFIG{0x25};
557constexpr uint8_t EEPROM_ADDR{0x2E};
558constexpr uint8_t EEPROM_ID0{0x3C};
559constexpr uint8_t EEPROM_ID1{0x3D};
560constexpr uint8_t EEPROM_ID2{0x3E};
561constexpr uint8_t EEPROM_ID3{0x3F};
562
563} // namespace command
564} // namespace mlx90614
566
567} // namespace unit
568} // namespace m5
569
570#endif
Base class of the UnitMLX90614 series.
bool writeConfig(const uint16_t v, const bool apply=true)
Write the configuration.
Definition unit_MLX90614.cpp:204
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_MLX90614.hpp:170
float ambientKelvin() const
Oldest ambient kelvin.
Definition unit_MLX90614.hpp:90
const mlx90614::EEPROM & eeprom() const
Gets the EEPROM structure.
Definition unit_MLX90614.hpp:82
float objectFahrenheit1() const
Oldest object 1 temperature (Fahrenheit)
Definition unit_MLX90614.hpp:125
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_MLX90614.hpp:178
float ambientTemperature() const
Oldest ambient temperature (Celsius)
Definition unit_MLX90614.hpp:95
bool readPositiveKs(bool &pos)
Read the sign of Ks (Config Register1 bit7)
Definition unit_MLX90614.cpp:323
float objectTemperature2() const
Oldest object 2 temperature (Celsius)
Definition unit_MLX90614.hpp:135
bool startPeriodicMeasurement(const mlx90614::IIR iir, const mlx90614::FIR fir, const mlx90614::Gain gain, const mlx90614::IRSensor irs)
Start periodic measurement.
Definition unit_MLX90614.hpp:161
config_t config()
Gets the configuration.
Definition unit_MLX90614.hpp:70
bool readEmissivity(uint16_t &emiss)
Read the emissivity.
Definition unit_MLX90614.cpp:450
bool readGain(mlx90614::Gain &gain)
Read the Gain.
Definition unit_MLX90614.cpp:283
float objectCelsius1() const
Oldest object 1 temperature (Celsius)
Definition unit_MLX90614.hpp:120
bool applySettings()
Apply EEPROM settings.
Definition unit_MLX90614.hpp:484
bool readConfig(uint16_t &v)
Read the configuration.
Definition unit_MLX90614.cpp:199
bool wakeup()
Wakeup.
Definition unit_MLX90614.cpp:554
bool writeEmissivity(const T emiss, const bool apply=true)
Write the emissivity.
Definition unit_MLX90614.hpp:427
bool writePositiveKt2(const bool pos, const bool apply=true)
Write the sign of Kt2 (Config Register1 bit14)
Definition unit_MLX90614.cpp:353
bool readOutput(mlx90614::Output &o)
Read the Output.
Definition unit_MLX90614.cpp:218
bool writeFIR(const mlx90614::FIR fir, const bool apply=true)
Write the FIR.
Definition unit_MLX90614.cpp:268
float objectKelvin1() const
Oldest object 1 kelvin.
Definition unit_MLX90614.hpp:110
float objectCelsius2() const
Oldest object 2 temperature (Celsius)
Definition unit_MLX90614.hpp:140
bool writeGain(const mlx90614::Gain gain, const bool apply=true)
Write the Gain.
Definition unit_MLX90614.cpp:293
bool readIRSensor(mlx90614::IRSensor &irs)
Read the IRSensor mode.
Definition unit_MLX90614.cpp:303
bool readPositiveKt2(bool &pos)
Read the sign of Kt2 (Config Register1 bit14)
Definition unit_MLX90614.cpp:343
bool writeOutput(const mlx90614::Output o, const bool apply=true)
Write the Output.
Definition unit_MLX90614.cpp:228
float ambientCelsius() const
Oldest ambient temperature (Celsius)
Definition unit_MLX90614.hpp:100
bool readIIR(mlx90614::IIR &iir)
Read the IIR.
Definition unit_MLX90614.cpp:238
bool writeIRSensor(const mlx90614::IRSensor irs, const bool apply=true)
Write the IRSensor mode.
Definition unit_MLX90614.cpp:313
bool sleep()
Sleep.
Definition unit_MLX90614.cpp:516
float ambientFahrenheit() const
Oldest ambient temperature (Fahrenheit)
Definition unit_MLX90614.hpp:105
bool readPositiveKf2(bool &pos)
Definition unit_MLX90614.hpp:311
bool writeObjectMinMax(const T toMin, const T toMax, const bool apply=true)
Write the minimum and maximum temperatures of the measurement for the object.
Definition unit_MLX90614.hpp:350
bool writePositiveKf2(const bool pos, const bool apply=true)
Definition unit_MLX90614.hpp:316
bool readI2CAddress(uint8_t &i2c_address)
Read device I2C address.
Definition unit_MLX90614.cpp:488
bool readObjectMinMax(uint16_t &toMin, uint16_t &toMax)
Read the minimum and maximum temperatures of the measurement for the object.
Definition unit_MLX90614.cpp:363
float objectKelvin2() const
Oldest object 2 kelvin.
Definition unit_MLX90614.hpp:130
float objectFahrenheit2() const
Oldest object 2 temperature (Fahrenheit)
Definition unit_MLX90614.hpp:145
bool writeAmbientMinMax(const T taMin, const T taMax, const bool apply=true)
Write the minimum and maximum temperatures of the measurement for the ambient.
Definition unit_MLX90614.hpp:387
float objectTemperature1() const
Oldest object 1 temperature (Celsius)
Definition unit_MLX90614.hpp:115
void config(const config_t &cfg)
Sets the configuration.
Definition unit_MLX90614.hpp:75
bool readAmbientMinMax(uint8_t &taMin, uint8_t &taMax)
Read the minimum and maximum temperatures of the measurement for the ambient.
Definition unit_MLX90614.cpp:403
bool changeI2CAddress(const uint8_t i2c_address)
Change device I2C address.
Definition unit_MLX90614.cpp:498
bool writeIIR(const mlx90614::IIR iir, const bool apply=true)
Write the IIR.
Definition unit_MLX90614.cpp:248
bool readFIR(mlx90614::FIR &fir)
Read the FIR.
Definition unit_MLX90614.cpp:258
bool writePositiveKs(const bool pos, const bool apply=true)
Write the sign of Ks (Config Register1 bit7)
Definition unit_MLX90614.cpp:333
Top level namespace of M5stack.
For mlx90614.
Unit-related namespace.
Settings for begin.
Definition unit_MLX90614.hpp:37
float emissivity
Emissivity if start on begin.
Definition unit_MLX90614.hpp:49
mlx90614::Gain gain
Gain if start on begin.
Definition unit_MLX90614.hpp:45
mlx90614::IIR iir
IIR filter if start on begin.
Definition unit_MLX90614.hpp:41
mlx90614::FIR fir
FIR filter if start on begin.
Definition unit_MLX90614.hpp:43
mlx90614::IRSensor irs
IRSensor if start on begin.
Definition unit_MLX90614.hpp:47
bool start_periodic
Start periodic measurement on begin?
Definition unit_MLX90614.hpp:39
Measurement data group.
Definition unit_MLX90614_data.hpp:102
EEPROM structure values.
Definition unit_MLX90614_data.hpp:173
MLX90614 data types (enums, Data struct, register fields, conversions)
IRSensor
Infra-Red Sensor mode.
Definition unit_MLX90614_data.hpp:93
IIR
Infinite Impulse Response.
Definition unit_MLX90614_data.hpp:47
Gain
Amplifier gain.
Definition unit_MLX90614_data.hpp:78
FIR
Finite Impulse Response.
Definition unit_MLX90614_data.hpp:62
Output
PWM output mode.
Definition unit_MLX90614_data.hpp:36