M5Unit-THERMO 0.4.0 git rev:7cce598
Loading...
Searching...
No Matches
unit_MLX90614_data.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
13#ifndef M5_UNIT_THERMO_UNIT_MLX90614_DATA_HPP
14#define M5_UNIT_THERMO_UNIT_MLX90614_DATA_HPP
15
16#include <array>
17#include <cmath>
18#include <cstdint>
19#include <limits> // NaN
20
21#include <m5_utility/stl/extension.hpp>
22
23namespace m5 {
24namespace unit {
25
30namespace mlx90614 {
31
36enum class Output : uint8_t {
37 TA_TO1,
38 TA_TO2,
40 TO1_TO2,
41};
42
47enum class IIR : uint8_t {
48 Filter50,
49 Filter25,
50 Filter17,
51 Filter13,
52 Filter100,
53 Filter80,
54 Filter67,
55 Filter57,
56};
57
62enum class FIR : uint8_t {
63 Filter8,
64 Filter16,
65 Filter32,
66 Filter64,
67 Filter128,
68 Filter256,
69 Filter512,
71
72};
73
78enum class Gain : uint8_t {
79 Coeff1,
80 Coeff3,
81 Coeff6,
82 Coeff12_5,
83 Coeff25,
84 Coeff50,
85 Coeff100,
86 // [7] Coeff100 (duplicate)
87};
88
93enum class IRSensor : uint8_t {
94 Single,
95 Dual
96};
97
102struct Data {
103 std::array<uint16_t, 3> raw{};
104
106 inline float ambientKelvin() const
107 {
108 return ((raw[0] & 0x8000) == 0) ? raw[0] * 0.02f : std::numeric_limits<float>::quiet_NaN();
109 }
111 inline float ambientTemperature() const
112 {
113 return ambientCelsius();
114 }
116 inline float ambientCelsius() const
117 {
118 return ambientKelvin() - 273.15f;
119 }
121 inline float ambientFahrenheit() const
122 {
123 return ambientCelsius() * 9.0f / 5.0f + 32.f;
124 }
125
127 inline float objectKelvin1() const
128 {
129 return ((raw[1] & 0x8000) == 0) ? raw[1] * 0.02f : std::numeric_limits<float>::quiet_NaN();
130 }
132 inline float objectTemperature1() const
133 {
134 return objectCelsius1();
135 }
137 inline float objectCelsius1() const
138 {
139 return objectKelvin1() - 273.15f;
140 }
142 inline float objectFahrenheit1() const
143 {
144 return objectCelsius1() * 9.0f / 5.0f + 32.f;
145 }
146
148 inline float objectKelvin2() const
149 {
150 return ((raw[2] & 0x8000) == 0) ? raw[2] * 0.02f : std::numeric_limits<float>::quiet_NaN();
151 }
153 inline float objectTemperature2() const
154 {
155 return objectCelsius2();
156 }
158 inline float objectCelsius2() const
159 {
160 return objectKelvin2() - 273.15f;
161 }
163 inline float objectFahrenheit2() const
164 {
165 return objectCelsius2() * 9.0f / 5.0f + 32.f;
166 }
167};
168
173struct EEPROM {
174 uint16_t toMax{};
175 uint16_t toMin{};
176 uint16_t pwmCtrl{};
177 uint16_t taRange{};
178 uint16_t emissivity{};
179 uint16_t config{};
180 uint16_t addr{};
181 uint16_t id[4]{};
182};
183
191 inline explicit ConfigRegister(const uint16_t v = 0) : value{v}
192 {
193 }
196 inline IIR iir() const
197 {
198 return static_cast<IIR>(value & 0x07);
199 }
202 inline Output output() const
203 {
204 return static_cast<Output>((value >> 4) & 0x03);
205 }
208 inline FIR fir() const
209 {
210 return static_cast<FIR>((value >> 8) & 0x07);
211 }
214 inline Gain gain() const
215 {
216 const uint8_t g = (value >> 11) & 0x07;
217 return static_cast<Gain>(g > 6 ? 6 : g);
218 }
221 inline IRSensor irSensor() const
222 {
223 return static_cast<IRSensor>((value >> 6) & 0x01);
224 }
227 inline bool positiveKs() const
228 {
229 return !(value & (1U << 7));
230 }
233 inline bool positiveKt2() const
234 {
235 return !(value & (1U << 14));
236 }
237
240 inline void iir(const IIR iir)
241 {
242 value = static_cast<uint16_t>((value & ~0x07) | m5::stl::to_underlying(iir));
243 }
246 inline void output(const Output o)
247 {
248 value = static_cast<uint16_t>((value & ~(0x03 << 4)) | (m5::stl::to_underlying(o) << 4));
249 }
252 inline void fir(const FIR fir)
253 {
254 value = static_cast<uint16_t>((value & ~(0x07 << 8)) | (m5::stl::to_underlying(fir) << 8));
255 }
258 inline void gain(const Gain gain)
259 {
260 value = static_cast<uint16_t>((value & ~(0x07 << 11)) | (m5::stl::to_underlying(gain) << 11));
261 }
264 inline void irSensor(const IRSensor irs)
265 {
266 value = static_cast<uint16_t>((value & ~(1U << 6)) | (static_cast<unsigned>(m5::stl::to_underlying(irs)) << 6));
267 }
270 inline void positiveKs(const bool pos)
271 {
272 value = static_cast<uint16_t>((value & ~(1U << 7)) | (static_cast<unsigned>(!pos) << 7));
273 }
276 inline void positiveKt2(const bool pos)
277 {
278 value = static_cast<uint16_t>((value & ~(1U << 14)) | (static_cast<unsigned>(!pos) << 14));
279 }
280 uint16_t value{};
281};
282
288inline float toRaw_to_celsius(const uint16_t t)
289{
290 return t * 0.01f - 273.15f;
291}
292
298inline uint16_t celsius_to_toRaw(const float c)
299{
300 const float v{std::fmax(std::fmin(c, 382.2f), -273.15f)};
301 return static_cast<uint16_t>(100 * (v + 0.005f + 273.15f));
302}
303
309inline float taRaw_to_celsius(const uint8_t t)
310{
311 return t * 64.0f / 100.f - 38.2f;
312}
313
319inline uint8_t celsius_to_taRaw(const float c)
320{
321 const float v{std::fmax(std::fmin(c, 125.f), -38.2f)};
322 return static_cast<uint8_t>(100 * (v + 0.32f + 38.2f) / 64.0f);
323}
324
330inline float raw_to_emissivity(const uint16_t e)
331{
332 return e / 65535.f;
333}
334
340inline uint16_t emissivity_to_raw(const float e)
341{
342 return static_cast<uint16_t>(std::round(65535.f * e));
343}
344
345} // namespace mlx90614
346
347} // namespace unit
348} // namespace m5
349#endif
Top level namespace of M5stack.
For mlx90614.
Unit-related namespace.
Config Register1 (EEPROM 0x05, command 0x25) bit fields.
Definition unit_MLX90614_data.hpp:188
void gain(const Gain gain)
Sets the amplifier gain (bits 13:11)
Definition unit_MLX90614_data.hpp:258
ConfigRegister(const uint16_t v=0)
Constructor.
Definition unit_MLX90614_data.hpp:191
Gain gain() const
Gets the amplifier gain (bits 13:11)
Definition unit_MLX90614_data.hpp:214
void fir(const FIR fir)
Sets the FIR filter (bits 10:8)
Definition unit_MLX90614_data.hpp:252
FIR fir() const
Gets the FIR filter (bits 10:8)
Definition unit_MLX90614_data.hpp:208
uint16_t value
Raw register value.
Definition unit_MLX90614_data.hpp:280
void irSensor(const IRSensor irs)
Sets the IR sensor mode (bit 6)
Definition unit_MLX90614_data.hpp:264
bool positiveKt2() const
Gets the sign of Kt2 (bit 14)
Definition unit_MLX90614_data.hpp:233
void iir(const IIR iir)
Sets the IIR filter (bits 2:0)
Definition unit_MLX90614_data.hpp:240
IIR iir() const
Gets the IIR filter (bits 2:0)
Definition unit_MLX90614_data.hpp:196
void output(const Output o)
Sets the PWM output mode (bits 5:4)
Definition unit_MLX90614_data.hpp:246
void positiveKs(const bool pos)
Sets the sign of Ks (bit 7)
Definition unit_MLX90614_data.hpp:270
void positiveKt2(const bool pos)
Sets the sign of Kt2 (bit 14)
Definition unit_MLX90614_data.hpp:276
bool positiveKs() const
Gets the sign of Ks (bit 7)
Definition unit_MLX90614_data.hpp:227
Output output() const
Gets the PWM output mode (bits 5:4)
Definition unit_MLX90614_data.hpp:202
IRSensor irSensor() const
Gets the IR sensor mode (bit 6)
Definition unit_MLX90614_data.hpp:221
Measurement data group.
Definition unit_MLX90614_data.hpp:102
float ambientTemperature() const
Gets ambient temperature in Celsius (alias of ambientCelsius)
Definition unit_MLX90614_data.hpp:111
float objectFahrenheit2() const
Gets object2 temperature in Fahrenheit (dual zone only, NaN on single zone)
Definition unit_MLX90614_data.hpp:163
float ambientKelvin() const
Gets ambient temperature in Kelvin.
Definition unit_MLX90614_data.hpp:106
float objectKelvin2() const
Gets object2 temperature in Kelvin (dual zone only, NaN on single zone)
Definition unit_MLX90614_data.hpp:148
float objectTemperature1() const
Gets object1 temperature in Celsius (alias of objectCelsius1)
Definition unit_MLX90614_data.hpp:132
float objectTemperature2() const
Gets object2 temperature in Celsius (alias of objectCelsius2)
Definition unit_MLX90614_data.hpp:153
float objectFahrenheit1() const
Gets object1 temperature in Fahrenheit.
Definition unit_MLX90614_data.hpp:142
float objectCelsius1() const
Gets object1 temperature in Celsius.
Definition unit_MLX90614_data.hpp:137
float objectKelvin1() const
Gets object1 temperature in Kelvin.
Definition unit_MLX90614_data.hpp:127
float ambientCelsius() const
Gets ambient temperature in Celsius.
Definition unit_MLX90614_data.hpp:116
float ambientFahrenheit() const
Gets ambient temperature in Fahrenheit.
Definition unit_MLX90614_data.hpp:121
float objectCelsius2() const
Gets object2 temperature in Celsius (dual zone only, NaN on single zone)
Definition unit_MLX90614_data.hpp:158
std::array< uint16_t, 3 > raw
Linearized raw [0]:Ambient [1]:Object1 [2]:Object2.
Definition unit_MLX90614_data.hpp:103
EEPROM structure values.
Definition unit_MLX90614_data.hpp:173
uint16_t pwmCtrl
Pulse Width Modulation control.
Definition unit_MLX90614_data.hpp:176
uint16_t addr
I2C address(Using low byte)
Definition unit_MLX90614_data.hpp:180
uint16_t config
Configuration.
Definition unit_MLX90614_data.hpp:179
uint16_t toMin
Min of the Object Temperature.
Definition unit_MLX90614_data.hpp:175
uint16_t taRange
Range of the Ambient Temperature (H/L)
Definition unit_MLX90614_data.hpp:177
uint16_t toMax
Max of the Object Temperature.
Definition unit_MLX90614_data.hpp:174
uint16_t emissivity
Emissivity.
Definition unit_MLX90614_data.hpp:178
float taRaw_to_celsius(const uint8_t t)
Ambient temperature range raw (one byte of TaRange) to Celsius.
Definition unit_MLX90614_data.hpp:309
IRSensor
Infra-Red Sensor mode.
Definition unit_MLX90614_data.hpp:93
@ Single
Single IR Sensor.
IIR
Infinite Impulse Response.
Definition unit_MLX90614_data.hpp:47
@ Filter25
25% (a1 = 0.25, b1 = 0.75)
@ Filter50
50% (a1 = 0.5, b1 = 0.5)
@ Filter67
67% (a1 = 0.666, b1 = 0.333)
@ Filter80
80% (a1 = 0.8, b1 = 0.2)
@ Filter13
13% (a1 = 0.125, b1 = 0.875)
@ Filter100
100% (a1 = 1, b1 = 0)
@ Filter57
57% (a1 = 0.571, b1 = 0.428)
@ Filter17
17% (a1 = 0.166(6), b1 = 0.833(3))
uint16_t celsius_to_toRaw(const float c)
Celsius to object temperature range raw (ToMin / ToMax)
Definition unit_MLX90614_data.hpp:298
uint8_t celsius_to_taRaw(const float c)
Celsius to ambient temperature range raw (one byte of TaRange)
Definition unit_MLX90614_data.hpp:319
uint16_t emissivity_to_raw(const float e)
Emissivity to emissivity raw.
Definition unit_MLX90614_data.hpp:340
float raw_to_emissivity(const uint16_t e)
Emissivity raw to emissivity.
Definition unit_MLX90614_data.hpp:330
Gain
Amplifier gain.
Definition unit_MLX90614_data.hpp:78
FIR
Finite Impulse Response.
Definition unit_MLX90614_data.hpp:62
@ Filter8
8 Not recommended
@ Filter32
32 Not recommended
@ Filter16
16 Not recommended
@ Filter64
64 Not recommended
Output
PWM output mode.
Definition unit_MLX90614_data.hpp:36
@ TO1_TO2
PWM1: To1 PWM2:To2 (Object 1 & 2)
@ TA_TO1
PWM1: Ta PWM2:To1 (Ambient & Object 1)
@ TA_TO2
PWM1: Ta PWM2:To2 (Ambient & Object 2)
@ TO2_Undefined
PWM1: To2 PWM2:Undefined (Object 2)
float toRaw_to_celsius(const uint16_t t)
Object temperature range raw (ToMin / ToMax) to Celsius.
Definition unit_MLX90614_data.hpp:288