/
mlx90615.py
executable file
·91 lines (72 loc) · 2.74 KB
/
mlx90615.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Just a little python script."""
__author__ = 'Scott Johnston'
__version__ = '0.0.1'
import smbus2
import crcmod
import time
# TODO: Fix register writing, because PEC code isn't being created by smbus2.
class MLX90615:
"""Melexis MLX90615 IR temperature sensor API."""
# Register addresses (0x1x = EEPROM, 0x2x = RAM)
MLX90615_CONFIG = 0x12
MLX90615_EMISSIVITY = 0x13
MLX90615_ID1 = 0x1E
MLX90615_ID2 = 0x1F
MLX90615_RAWIR = 0x25
MLX90615_TA = 0x26
MLX90615_TO = 0x27
def __init__(self, i2c_bus=2, i2c_address=0x5B):
"""Opens the i2c device."""
self.bus = smbus2.SMBus(i2c_bus)
self.address = i2c_address
def get_register(self, register):
return self.bus.read_word_data(self.address, register)
def set_register(self, register, value):
crc8 = crcmod.predefined.mkPredefinedCrcFun('crc-8')
value_msb = (value & 0xFF00) >> 8
value_lsb = value & 0xFF
crcval = crc8(
bytearray([(self.address << 1), register, value_lsb, value_msb]))
print("TODO: Fix register setting, which requires SMBus PEC support.")
return self.bus.write_i2c_block_data(self.address, register, [value_lsb, value_msb, crcval])
def get_ambient_temperature(self):
"""Reads ambient temperature in deg C."""
data = self.get_register(self.MLX90615_TA)
return self._calculate_temperature(data)
def get_object_temperature(self):
"""Reads object temperature in deg C."""
data = self.get_register(self.MLX90615_TO)
return self._calculate_temperature(data)
def close(self):
self.bus.close()
def __enter__(self):
return self
def __exit__(self, *exc_info):
self.close()
@staticmethod
def _calculate_temperature(raw):
"""Converts temperature register value to degrees C."""
return round((raw * 0.02) - 273.15, 3)
@property
def emissivity(self):
"Emissivity (ε)."
data = self.get_register(self.MLX90615_EMISSIVITY)
return data / 16384.0
@emissivity.setter
def emissivity(self, value):
assert 0.1 < value < 1
data = round(16384 * value)
return self.set_register(self.MLX90615_EMISSIVITY, data)
if __name__ == '__main__':
try:
with MLX90615() as mlx90615:
print("Object temperature (deg C) : {}".format(
mlx90615.get_object_temperature()))
print("Ambient temperature (deg C): {}".format(
mlx90615.get_ambient_temperature()))
print("Emissivity calibration (ε) : {}".format(
mlx90615.emissivity))
except IOError:
print("Error creating connection to i2c.")