29
29
import time
30
30
31
31
from smbus import SMBus
32
+ import spidev
33
+
32
34
33
35
class MS5611 :
34
36
37
+ class SPIBus ():
38
+ def __init__ (self , SPI_bus_number , SPI_dev_number ):
39
+ self .bus = spidev .SpiDev ()
40
+ self .SPI_bus_number = SPI_bus_number
41
+ self .SPI_dev_number = SPI_dev_number
42
+
43
+ def open (self ):
44
+ self .bus .open (self .SPI_bus_number , self .SPI_dev_number )
45
+ self .bus .max_speed_hz = 1000000
46
+
47
+ def write_register (self , reg_address , data = 0x00 ):
48
+ self .open ()
49
+ tx = [reg_address , data ]
50
+ rx = self .bus .xfer2 (tx )
51
+ self .bus .close ()
52
+ return rx
53
+
54
+ def read_registers (self , reg_address , length = 3 ):
55
+ self .open ()
56
+ tx = [0 ] * (length + 1 )
57
+ tx [0 ] = reg_address
58
+ rx = self .bus .xfer2 (tx )
59
+ self .bus .close ()
60
+ return rx [1 :len (rx )]
61
+
62
+ class I2CBus ():
63
+ def __init__ (self , I2C_bus_number , address ):
64
+ self .bus = SMBus (I2C_bus_number )
65
+ self .address = address
66
+
67
+ def write_register (self , reg_address , device_address = None ):
68
+ device_address = self .address
69
+ return self .bus .write_byte (device_address , reg_address )
70
+
71
+ def read_registers (self , reg_address , device_address = None ):
72
+ device_address = self .address
73
+ return self .bus .read_i2c_block_data (device_address , reg_address )
74
+
35
75
__MS5611_ADDRESS_CSB_LOW = 0x76
36
76
__MS5611_ADDRESS_CSB_HIGH = 0x77
37
77
__MS5611_DEFAULT_ADDRESS = 0x77
@@ -60,9 +100,9 @@ class MS5611:
60
100
__MS5611_RA_D2_OSR_2048 = 0x56
61
101
__MS5611_RA_D2_OSR_4096 = 0x58
62
102
63
- def __init__ (self , I2C_bus_number = 1 , address = 0x77 ):
64
- self .bus = SMBus (I2C_bus_number )
65
- self .address = address
103
+ def __init__ (self , I2C_bus_number = 1 , address = 0x77 , SPI_bus_number = 0 , SPI_dev_number = 0 , bus = "I2C" ):
104
+ self .bus = self . I2CBus (I2C_bus_number , address ) if bus == "I2C" else \
105
+ self .SPIBus ( SPI_bus_number , SPI_dev_number )
66
106
self .C1 = 0
67
107
self .C2 = 0
68
108
self .C3 = 0
@@ -78,17 +118,17 @@ def initialize(self):
78
118
## The MS6511 Sensor stores 6 values in the EPROM memory that we need in order to calculate the actual temperature and pressure
79
119
## These values are calculated/stored at the factory when the sensor is calibrated.
80
120
## I probably could have used the read word function instead of the whole block, but I wanted to keep things consistent.
81
- C1 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C1 ) #Pressure Sensitivity
121
+ C1 = self .bus .read_registers ( self .__MS5611_RA_C1 ) #Pressure Sensitivity
82
122
#time.sleep(0.05)
83
- C2 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C2 ) #Pressure Offset
123
+ C2 = self .bus .read_registers ( self .__MS5611_RA_C2 ) #Pressure Offset
84
124
#time.sleep(0.05)
85
- C3 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C3 ) #Temperature coefficient of pressure sensitivity
125
+ C3 = self .bus .read_registers ( self .__MS5611_RA_C3 ) #Temperature coefficient of pressure sensitivity
86
126
#time.sleep(0.05)
87
- C4 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C4 ) #Temperature coefficient of pressure offset
127
+ C4 = self .bus .read_registers ( self .__MS5611_RA_C4 ) #Temperature coefficient of pressure offset
88
128
#time.sleep(0.05)
89
- C5 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C5 ) #Reference temperature
129
+ C5 = self .bus .read_registers ( self .__MS5611_RA_C5 ) #Reference temperature
90
130
#time.sleep(0.05)
91
- C6 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_C6 ) #Temperature coefficient of the temperature
131
+ C6 = self .bus .read_registers ( self .__MS5611_RA_C6 ) #Temperature coefficient of the temperature
92
132
93
133
## Again here we are converting the 2 8bit packages into a single decimal
94
134
self .C1 = C1 [0 ] * 256.0 + C1 [1 ]
@@ -101,17 +141,17 @@ def initialize(self):
101
141
self .update ()
102
142
103
143
def refreshPressure (self , OSR = __MS5611_RA_D1_OSR_4096 ):
104
- self .bus .write_byte ( self . address , OSR )
144
+ self .bus .write_register ( OSR )
105
145
106
146
def refreshTemperature (self , OSR = __MS5611_RA_D2_OSR_4096 ):
107
- self .bus .write_byte ( self . address , OSR )
147
+ self .bus .write_register ( OSR )
108
148
109
149
def readPressure (self ):
110
- D1 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_ADC )
150
+ D1 = self .bus .read_registers ( self .__MS5611_RA_ADC )
111
151
self .D1 = D1 [0 ] * 65536 + D1 [1 ] * 256.0 + D1 [2 ]
112
152
113
153
def readTemperature (self ):
114
- D2 = self .bus .read_i2c_block_data ( self . address , self .__MS5611_RA_ADC )
154
+ D2 = self .bus .read_registers ( self .__MS5611_RA_ADC )
115
155
self .D2 = D2 [0 ] * 65536 + D2 [1 ] * 256.0 + D2 [2 ]
116
156
117
157
def calculatePressureAndTemperature (self ):
0 commit comments