-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathowen.py
109 lines (92 loc) · 4.63 KB
/
owen.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import smbus
import time
# Get I2C bus
bus = smbus.SMBus(1)
# I2C address of the device
MPL3115A2_DEFAULT_ADDRESS = 0x70
# MPL3115A2 Register Map
MPL3115A2_REG_STATUS = 0x00 # Sensor status Register
MPL3115A2_REG_PRESSURE_MSB = 0x01 # Pressure data out MSB
MPL3115A2_REG_PRESSURE_CSB = 0x02 # Pressure data out CSB
MPL3115A2_REG_PRESSURE_LSB = 0x03 # Pressure data out LSB
MPL3115A2_REG_TEMP_MSB = 0x04 # Temperature data out MSB
MPL3115A2_REG_TEMP_LSB = 0x05 # Temperature data out LSB
MPL3115A2_REG_DR_STATUS = 0x06 # Data Ready status register
MPL3115A2_OUT_P_DELTA_MSB = 0x07 # Pressure data out delta MSB
MPL3115A2_OUT_P_DELTA_CSB = 0x08 # Pressure data out delta CSB
MPL3115A2_OUT_P_DELTA_LSB = 0x09 # Pressure data out delta LSB
MPL3115A2_OUT_T_DELTA_MSB = 0x0A # Temperature data out delta MSB
MPL3115A2_OUT_T_DELTA_LSB = 0x0B # Temperature data out delta LSB
MPL3115A2_REG_WHO_AM_I = 0x0C # Device Identification Register
MPL3115A2_PT_DATA_CFG = 0x13 # PT Data Configuration Register
MPL3115A2_CTRL_REG1 = 0x26 # Control Register-1
MPL3115A2_CTRL_REG2 = 0x27 # Control Register-2
MPL3115A2_CTRL_REG3 = 0x28 # Control Register-3
MPL3115A2_CTRL_REG4 = 0x29 # Control Register-4
MPL3115A2_CTRL_REG5 = 0x2A # Control Register-5
# MPL3115A2 PT Data Configuration Register
MPL3115A2_PT_DATA_CFG_TDEFE = 0x01 # Raise event flag on new temperature data
MPL3115A2_PT_DATA_CFG_PDEFE = 0x02 # Raise event flag on new pressure/altitude data
MPL3115A2_PT_DATA_CFG_DREM = 0x04 # Generate data ready event flag on new pressure/altitude or temperature data
# MPL3115A2 Control Register-1 Configuration
MPL3115A2_CTRL_REG1_SBYB = 0x01 # Part is ACTIVE
MPL3115A2_CTRL_REG1_OST = 0x02 # OST Bit ACTIVE
MPL3115A2_CTRL_REG1_RST = 0x04 # Device reset enabled
MPL3115A2_CTRL_REG1_OS1 = 0x00 # Oversample ratio = 1
MPL3115A2_CTRL_REG1_OS2 = 0x08 # Oversample ratio = 2
MPL3115A2_CTRL_REG1_OS4 = 0x10 # Oversample ratio = 4
MPL3115A2_CTRL_REG1_OS8 = 0x18 # Oversample ratio = 8
MPL3115A2_CTRL_REG1_OS16 = 0x20 # Oversample ratio = 16
MPL3115A2_CTRL_REG1_OS32 = 0x28 # Oversample ratio = 32
MPL3115A2_CTRL_REG1_OS64 = 0x30 # Oversample ratio = 64
MPL3115A2_CTRL_REG1_OS128 = 0x38 # Oversample ratio = 128
MPL3115A2_CTRL_REG1_RAW = 0x40 # RAW output mode
MPL3115A2_CTRL_REG1_ALT = 0x80 # Part is in altimeter mod
MPL3115A2_CTRL_REG1_BAR = 0x00 # Part is in barometer mode
class MPL3115A2():
def control_alt_config(self):
"""Select the Control Register-1 Configuration from the given provided value"""
CONTROL_CONFIG = (MPL3115A2_CTRL_REG1_SBYB | MPL3115A2_CTRL_REG1_OS128 | MPL3115A2_CTRL_REG1_ALT)
bus.write_byte_data(MPL3115A2_DEFAULT_ADDRESS, MPL3115A2_CTRL_REG1, CONTROL_CONFIG)
def data_config(self):
"""Select the PT Data Configuration Register from the given provided value"""
DATA_CONFIG = (MPL3115A2_PT_DATA_CFG_TDEFE | MPL3115A2_PT_DATA_CFG_PDEFE | MPL3115A2_PT_DATA_CFG_DREM)
bus.write_byte_data(MPL3115A2_DEFAULT_ADDRESS, MPL3115A2_PT_DATA_CFG, DATA_CONFIG)
def read_alt_temp(self):
"""Read data back from MPL3115A2_REG_STATUS(0x00), 6 bytes
status, tHeight MSB, tHeight CSB, tHeight LSB, temp MSB, temp LSB"""
data = bus.read_i2c_block_data(MPL3115A2_DEFAULT_ADDRESS, MPL3115A2_REG_STATUS, 6)
# Convert the data to 20-bits
tHeight = ((data[1] * 65536) + (data[2] * 256) + (data[3] & 0xF0)) / 16
temp = ((data[4] * 256) + (data[5] & 0xF0)) / 16
altitude = tHeight / 16.0
cTemp = temp / 16.0
fTemp = cTemp * 1.8 + 32
return {'a' : altitude, 'c' : cTemp, 'f' : fTemp}
def control_pres_config(self):
"""Select the Control Register-1 Configuration from the given provided value"""
CONTROL_CONFIG = (MPL3115A2_CTRL_REG1_SBYB | MPL3115A2_CTRL_REG1_OS128)
bus.write_byte_data(MPL3115A2_DEFAULT_ADDRESS, MPL3115A2_CTRL_REG1, CONTROL_CONFIG)
def read_pres(self):
"""Read data back from MPL3115A2_REG_STATUS(0x00), 4 bytes
status, pres MSB, pres CSB, pres LSB"""
data = bus.read_i2c_block_data(MPL3115A2_DEFAULT_ADDRESS, MPL3115A2_REG_STATUS, 4)
# Convert the data to 20-bits
pres = ((data[1] * 65536) + (data[2] * 256) + (data[3] & 0xF0)) / 16
pressure = (pres / 4.0) / 1000.0
return {'p' : pressure}
#from MPL3115A2 import MPL3115A2
mpl3115a2 = MPL3115A2()
while True :
mpl3115a2.control_alt_config()
mpl3115a2.data_config()
time.sleep(1)
alt = mpl3115a2.read_alt_temp()
print "Altitude : %.2f m"%(alt['a'])
print "Temperature in Celsius : %.2f C"%(alt['c'])
print "Temperature in Fahrenheit : %.2f F"%(alt['f'])
mpl3115a2.control_pres_config()
time.sleep(1)
pres = mpl3115a2.read_pres()
print "Pressure : %.2f kPa"%(pres['p'])
print " ************************************* "