11import  time 
2+ from  machine  import  I2C 
23
34class  MPL3115A2exception (Exception ):
45    pass 
56
67class  MPL3115A2 :
7- 
8-     MPL3115_I2CADDR              =  const (0x60 )
9-     MPL3115_STATUS               =  const (0x00 )
10-     MPL3115_PRESSURE_DATA_MSB    =  const (0x01 )
11-     MPL3115_PRESSURE_DATA_CSB    =  const (0x02 )
12-     MPL3115_PRESSURE_DATA_LSB    =  const (0x03 )
13-     MPL3115_TEMP_DATA_MSB        =  const (0x04 )
14-     MPL3115_TEMP_DATA_LSB        =  const (0x05 )
15-     MPL3115_DR_STATUS            =  const (0x06 )
16-     MPL3115_DELTA_DATA           =  const (0x07 )
17-     MPL3115_WHO_AM_I             =  const (0x0c )
18-     MPL3115_FIFO_STATUS          =  const (0x0d )
19-     MPL3115_FIFO_DATA            =  const (0x0e )
20-     MPL3115_FIFO_SETUP           =  const (0x0e )
21-     MPL3115_TIME_DELAY           =  const (0x10 )
22-     MPL3115_SYS_MODE             =  const (0x11 )
23-     MPL3115_INT_SORCE            =  const (0x12 )
24-     MPL3115_PT_DATA_CFG          =  const (0x13 )
25-     MPL3115_BAR_IN_MSB           =  const (0x14 )
26-     MPL3115_P_ARLARM_MSB         =  const (0x16 )
27-     MPL3115_T_ARLARM             =  const (0x18 )
28-     MPL3115_P_ARLARM_WND_MSB     =  const (0x19 )
29-     MPL3115_T_ARLARM_WND         =  const (0x1b )
30-     MPL3115_P_MIN_DATA           =  const (0x1c )
31-     MPL3115_T_MIN_DATA           =  const (0x1f )
32-     MPL3115_P_MAX_DATA           =  const (0x21 )
33-     MPL3115_T_MAX_DATA           =  const (0x24 )
34-     MPL3115_CTRL_REG1            =  const (0x26 )
35-     MPL3115_CTRL_REG2            =  const (0x27 )
36-     MPL3115_CTRL_REG3            =  const (0x28 )
37-     MPL3115_CTRL_REG4            =  const (0x29 )
38-     MPL3115_CTRL_REG5            =  const (0x2a )
39-     MPL3115_OFFSET_P             =  const (0x2b )
40-     MPL3115_OFFSET_T             =  const (0x2c )
41-     MPL3115_OFFSET_H             =  const (0x2d )
42-     ALTITUDE 		            =  const (0 )
43-     PRESSURE 		            =  const (1 )
44- 
45-     def  __init__ (self , pysense = None , sda = 'P22' , scl = 'P21' ):
8+     MPL3115_I2CADDR  =  const (0x60 )
9+     MPL3115_STATUS  =  const (0x00 )
10+     MPL3115_PRESSURE_DATA_MSB  =  const (0x01 )
11+     MPL3115_PRESSURE_DATA_CSB  =  const (0x02 )
12+     MPL3115_PRESSURE_DATA_LSB  =  const (0x03 )
13+     MPL3115_TEMP_DATA_MSB  =  const (0x04 )
14+     MPL3115_TEMP_DATA_LSB  =  const (0x05 )
15+     MPL3115_DR_STATUS  =  const (0x06 )
16+     MPL3115_DELTA_DATA  =  const (0x07 )
17+     MPL3115_WHO_AM_I  =  const (0x0c )
18+     MPL3115_FIFO_STATUS  =  const (0x0d )
19+     MPL3115_FIFO_DATA  =  const (0x0e )
20+     MPL3115_FIFO_SETUP  =  const (0x0e )
21+     MPL3115_TIME_DELAY  =  const (0x10 )
22+     MPL3115_SYS_MODE  =  const (0x11 )
23+     MPL3115_INT_SORCE  =  const (0x12 )
24+     MPL3115_PT_DATA_CFG  =  const (0x13 )
25+     MPL3115_BAR_IN_MSB  =  const (0x14 )
26+     MPL3115_P_ARLARM_MSB  =  const (0x16 )
27+     MPL3115_T_ARLARM  =  const (0x18 )
28+     MPL3115_P_ARLARM_WND_MSB  =  const (0x19 )
29+     MPL3115_T_ARLARM_WND  =  const (0x1b )
30+     MPL3115_P_MIN_DATA  =  const (0x1c )
31+     MPL3115_T_MIN_DATA  =  const (0x1f )
32+     MPL3115_P_MAX_DATA  =  const (0x21 )
33+     MPL3115_T_MAX_DATA  =  const (0x24 )
34+     MPL3115_CTRL_REG1  =  const (0x26 )
35+     MPL3115_CTRL_REG2  =  const (0x27 )
36+     MPL3115_CTRL_REG3  =  const (0x28 )
37+     MPL3115_CTRL_REG4  =  const (0x29 )
38+     MPL3115_CTRL_REG5  =  const (0x2a )
39+     MPL3115_OFFSET_P  =  const (0x2b )
40+     MPL3115_OFFSET_T  =  const (0x2c )
41+     MPL3115_OFFSET_H  =  const (0x2d )
42+     ALTITUDE  =  const (0 )
43+     PRESSURE  =  const (1 )
44+ 
45+     def  __init__ (self , pysense  =  None , sda  =  'P22' , scl  =  'P21' , mode  =  PRESSURE ):
4646        if  pysense  is  not None :
4747            self .i2c  =  pysense .i2c 
4848        else :
49-             from  machine  import  I2C 
5049            self .i2c  =  I2C (0 , mode = I2C .MASTER , pins = (sda , scl ))
5150
5251        self .STA_reg  =  bytearray (1 )
53- 
54-         self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0xB8 ]))
55-         self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_PT_DATA_CFG , bytes ([0x07 ]))
56-         self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0xB9 ]))
52+         self .mode  =  mode 
53+ 
54+         if  self .mode  is  PRESSURE :
55+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0x38 ])) # barometer mode, not raw, oversampling 128, minimum time 512 ms 
56+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_PT_DATA_CFG , bytes ([0x07 ])) # no events detected 
57+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0x39 ])) # active 
58+         elif  self .mode  is  ALTITUDE :
59+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0xB8 ])) # altitude mode, not raw, oversampling 128, minimum time 512 ms 
60+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_PT_DATA_CFG , bytes ([0x07 ])) # no events detected 
61+             self .i2c .writeto_mem (MPL3115_I2CADDR , MPL3115_CTRL_REG1 , bytes ([0xB9 ])) # active 
62+         else :
63+             raise  MPL3115A2exception ("Invalid Mode MPL3115A2" )
5764
5865        if  self ._read_status ():
5966            pass 
@@ -62,7 +69,6 @@ def __init__(self, pysense=None, sda='P22', scl='P21'):
6269
6370    def  _read_status (self ):
6471        while  True :
65- 
6672            self .i2c .readfrom_mem_into (MPL3115_I2CADDR , MPL3115_STATUS , self .STA_reg )
6773
6874            if (self .STA_reg [0 ] ==  0 ):
@@ -73,41 +79,40 @@ def _read_status(self):
7379            else :
7480                return  False 
7581
76-     def  _fixed_decimal (self , frac_value ):
77-         fixed_decimal  =  0 
82+     def  pressure (self ):
83+         if  self .mode  ==  ALTITUDE :
84+             raise  MPL3115A2exception ("Incorrect Measurement Mode MPL3115A2" )
7885
79-         for  x  in  range (2 ,len (bin (frac_value ))):
80-             fixed_decimal  +=  int (bin (frac_value )[x ])* (2 ** (- (x - 1 )))
86+         OUT_P_MSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_MSB ,1 )
87+         OUT_P_CSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_CSB ,1 )
88+         OUT_P_LSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_LSB ,1 )
89+ 
90+         return  float ((OUT_P_MSB [0 ] <<  10 ) +  (OUT_P_CSB [0 ] <<  2 ) +  ((OUT_P_LSB [0 ] >>  6 ) &  0x03 ) +  ((OUT_P_LSB [0 ] >>  4 ) &  0x03 ) /  4.0 )
8191
82-         return  fixed_decimal 
92+     def  altitude (self ):
93+         if  self .mode  ==  PRESSURE :
94+             raise  MPL3115A2exception ("Incorrect Measurement Mode MPL3115A2" )
8395
84-     def  alt (self ):
8596        OUT_P_MSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_MSB ,1 )
8697        OUT_P_CSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_CSB ,1 )
8798        OUT_P_LSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_LSB ,1 )
88-         OUT_P_ALL  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_PRESSURE_DATA_MSB ,5 )
89- 
90-         pres_frac  =  OUT_P_LSB [0 ] >>  4 
91-         pres_int  =  (OUT_P_MSB [0 ] <<  8 )| (OUT_P_CSB [0 ])
9299
93-         if  ( pres_int   &  ( 1  <<  ( 16   -   1 )))  !=   0 :  # if sign bit is set e.g., 8bit: 128-255 
94-              pres_int   =   pres_int   -  ( 1   <<   16 )
100+         alt_int   =  ( OUT_P_MSB [ 0 ]  <<  8 )  +  ( OUT_P_CSB [ 0 ]) 
101+         alt_frac   =  (( OUT_P_LSB [ 0 ]  >>   4 )  &   0x0F )
95102
96-         pres_frac  =  self ._fixed_decimal (pres_frac )
103+         if  alt_int  >  32767 :
104+             alt_int  -=  65536 
97105
98-         return ( float (str ( pres_int ) + str ( pres_frac )[ 1 :]) )
106+         return   float (alt_int   +   alt_frac   /   4.0 )
99107
100-     def  temp (self ):
108+     def  temperature (self ):
101109        OUT_T_MSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_TEMP_DATA_MSB ,1 )
102110        OUT_T_LSB  =  self .i2c .readfrom_mem (MPL3115_I2CADDR , MPL3115_TEMP_DATA_LSB ,1 )
103111
104-         temp_frac  =  OUT_T_LSB [0 ] >>  4 
105- 
106112        temp_int  =  OUT_T_MSB [0 ]
113+         temp_frac  =  OUT_T_LSB [0 ]
107114
108-         if  (temp_int  &  (1  <<  (8  -  1 ))) !=  0 : # if sign bit is set e.g., 8bit: 128-255 
109-             temp_int  =  temp_int  -  (1  <<  8 )
110- 
111-         temp_frac  =  self ._fixed_decimal (temp_frac )
115+         if  temp_int  >  127 :
116+             temp_int  -=  256 
112117
113-         return ( float (str ( temp_int ) + str ( temp_frac )[ 1 :]) )
118+         return   float (temp_int   +   temp_frac   /   256.0 )
0 commit comments