1
+ from micropython import const
2
+ from machine import I2C
3
+
4
+
5
+ MCP9808_I2C_address = const (0x18 )
6
+
7
+ MCP9808_CONFIG_REG = const (0x01 )
8
+ MCP9808_UPPER_TEMP_REG = const (0x02 )
9
+ MCP9808_LOWER_TEMP_REG = const (0x03 )
10
+ MCP9808_CRITICAL_TEMP_REG = const (0x04 )
11
+ MCP9808_AMBIENT_TEMP_REG = const (0x05 )
12
+ MCP9808_MANUFACTURER_ID_REG = const (0x06 )
13
+ MCP9808_DEVICE_ID_REG = const (0x07 )
14
+ MCP9808_RESOLUTION_REG = const (0x08 )
15
+
16
+
17
+ class MCP9808 ():
18
+
19
+ def __init__ (self ):
20
+ self .i2c = I2C (2 , freq = 400000 )
21
+ self .init ()
22
+
23
+
24
+ def write_byte (self , reg , value ):
25
+ if not type (value ) is bytearray :
26
+ value = bytearray ([value ])
27
+
28
+ self .i2c .writeto_mem (MCP9808_I2C_address , reg , value )
29
+
30
+
31
+ def write_word (self , reg , value ):
32
+ value = value & 0xFFFF
33
+ arr = bytearray (0x02 )
34
+ arr [1 ] = (value & 0xFF )
35
+ arr [0 ] = ((value >> 8 ) & 0xFF )
36
+
37
+ self .i2c .writeto_mem (MCP9808_I2C_address , reg , arr )
38
+
39
+
40
+ def read_byte (self , reg ):
41
+ retval = self .i2c .readfrom_mem (MCP9808_I2C_address , reg , 0x01 )
42
+ return retval [0x00 ]
43
+
44
+
45
+ def read_word (self , reg ):
46
+ value = self .i2c .readfrom_mem (MCP9808_I2C_address , reg , 0x02 )
47
+ retval = ((value [0x00 ] << 0x08 ) | value [0x01 ])
48
+ return retval
49
+
50
+
51
+ def init (self ):
52
+ manufacturer_ID = self .read_word (MCP9808_MANUFACTURER_ID_REG )
53
+ device_ID = self .read_word (MCP9808_DEVICE_ID_REG )
54
+
55
+ if (manufacturer_ID == 0x0054 ):
56
+ if (device_ID == 0x400 ):
57
+ print ("MCP9808 detected." )
58
+ self .write_word (MCP9808_CONFIG_REG , 0x060E )
59
+ self .write_word (MCP9808_RESOLUTION_REG , 0x0003 )
60
+ else :
61
+ print ("Issue with I2C device/bus!" )
62
+ else :
63
+ print ("MCP9808 not present." )
64
+
65
+
66
+ def read_T_and_status (self ):
67
+ t = self .read_word (MCP9808_AMBIENT_TEMP_REG )
68
+ status = ((t & 0xE000 ) >> 13 )
69
+
70
+ hb = ((t & 0x0F00 ) >> 8 )
71
+ lb = (t & 0x00FF )
72
+ tmp = ((hb * 16.0 ) + (lb / 16.0 ))
73
+
74
+ if (t & 0x1000 ):
75
+ tmp = (256 - tmp )
76
+
77
+ return tmp , status
78
+
79
+
80
+ def read_set_point (self , reg ):
81
+ ts = self .read_word (reg )
82
+
83
+ if (ts != 0xFFFF ):
84
+ tmp = (ts & 0x0FFC )
85
+ tmp >>= 2
86
+
87
+ if (ts & 0x1000 ):
88
+ tmp = (tmp - 1024 )
89
+
90
+ tmp *= 0.25
91
+
92
+ return tmp
93
+
94
+
95
+ def read_T_upper (self ):
96
+ return self .read_set_point (MCP9808_UPPER_TEMP_REG )
97
+
98
+
99
+ def read_T_lower (self ):
100
+ return self .read_set_point (MCP9808_LOWER_TEMP_REG )
101
+
102
+
103
+ def read_T_critical (self ):
104
+ return self .read_set_point (MCP9808_CRITICAL_TEMP_REG )
105
+
106
+
107
+ def write_set_point (self , reg , value ):
108
+ regval = int (16.0 * value )
109
+
110
+ if (value < 0 ):
111
+ regval |= 0x1000
112
+
113
+ self .write_word (reg , regval )
114
+
115
+
116
+ def set_T_upper (self , value ):
117
+ self .write_set_point (MCP9808_UPPER_TEMP_REG , value )
118
+
119
+
120
+ def set_T_lower (self , value ):
121
+ self .write_set_point (MCP9808_LOWER_TEMP_REG , value )
122
+
123
+
124
+ def set_T_critical (self , value ):
125
+ self .write_set_point (MCP9808_CRITICAL_TEMP_REG , value )
126
+
127
+
128
+
129
+
130
+
0 commit comments