33
33
34
34
**Hardware:**
35
35
36
- * ` LPS25HB Breakout < https://www.adafruit.com/products/45XX>`_
36
+ * LPS25HB Breakout https://www.adafruit.com/products/4530
37
37
38
38
**Software and Dependencies:**
39
39
* Adafruit CircuitPython firmware for the supported boards:
44
44
"""
45
45
__version__ = "0.0.0-auto.0"
46
46
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LPS2X.git"
47
+ from time import sleep
47
48
from micropython import const
48
49
import adafruit_bus_device .i2c_device as i2cdevice
49
50
from adafruit_register .i2c_struct import ROUnaryStruct
50
51
from adafruit_register .i2c_bits import RWBits , ROBits
51
52
from adafruit_register .i2c_bit import RWBit
52
53
53
- _WHO_AM_I = const (0x0F )
54
- _CTRL_REG1 = const (0x20 )
55
- _CTRL_REG2 = const (0x21 )
56
- _PRESS_OUT_XL = const (0x28 | 0x80 ) # | 0x80 to set auto increment on multi-byte read
57
- _TEMP_OUT_L = const (0x2B | 0x80 ) # | 0x80 to set auto increment on multi-byte read
54
+ # _LPS2X_I2CADDR_DEFAULT = 0x5D # LPS2X default i2c address
55
+ # _LPS2X_WHOAMI = 0x0F # Chip ID register
56
+ # _LPS2X_PRESS_OUT_XL =(# | 0x80) ///< | 0x80 to set auto increment on multi-byte read
57
+ # _LPS2X_TEMP_OUT_L = (0x2B # 0x80) ///< | 0x80 to set auto increment on
58
+ _LPS2X_WHO_AM_I = const (0x0F )
59
+ _LPS2X_PRESS_OUT_XL = const (
60
+ 0x28 | 0x80
61
+ ) # | 0x80 to set auto increment on multi-byte read
62
+ _LPS2X_TEMP_OUT_L = const (
63
+ 0x2B | 0x80
64
+ ) # | 0x80 to set auto increment on multi-byte read
58
65
59
- _LPS25_CHIP_ID = 0xBD
60
- _LPS25_DEFAULT_ADDRESS = 0x5D
66
+ _LPS25_CTRL_REG1 = const (0x20 ) # First control register. Includes BD & ODR
67
+ _LPS25_CTRL_REG2 = const (0x21 ) # Second control register. Includes SW Reset
68
+ # _LPS25_CTRL_REG3 = 0x22 # Third control register. Includes interrupt polarity
69
+ # _LPS25_CTRL_REG4 = 0x23 # Fourth control register. Includes DRDY INT control
70
+ # _LPS25_INTERRUPT_CFG = 0x24 # Interrupt control register
71
+ # _LPS25_THS_P_L_REG = 0xB0 # Pressure threshold value for int
72
+
73
+
74
+ # _LPS22_THS_P_L_REG = 0x0C # Pressure threshold value for int
75
+ _LPS22_CTRL_REG1 = 0x10 # First control register. Includes BD & ODR
76
+ _LPS22_CTRL_REG2 = 0x11 # Second control register. Includes SW Reset
77
+ # _LPS22_CTRL_REG3 = 0x12 # Third control register. Includes interrupt polarity
78
+
79
+ _LPS2X_DEFAULT_ADDRESS = 0x5D
80
+ _LPS25HB_CHIP_ID = 0xBD
81
+ _LPS22HB_CHIP_ID = 0xB1 # LPS22 default device id from WHOAMI
61
82
62
83
63
84
class CV :
@@ -84,64 +105,65 @@ def is_valid(cls, value):
84
105
class Rate (CV ):
85
106
"""Options for ``data_rate``
86
107
87
- +-----------------------+------------------------------------------------------------------+
88
- | Rate | Description |
89
- +-----------------------+------------------------------------------------------------------+
90
- | ``Rate.ONE_SHOT`` | Setting `data_rate` to ``Rate.ONE_SHOT`` takes a single pressure |
91
- | | and temperature measurement |
92
- +-----------------------+------------------------------------------------------------------+
93
- | ``Rate.RATE_1_HZ`` | 1 Hz |
94
- +-----------------------+------------------------------------------------------------------+
95
- | ``Rate.RATE_7_HZ`` | 7 Hz |
96
- +-----------------------+------------------------------------------------------------------+
97
- | ``Rate.RATE_12_5_HZ`` | 12.5 Hz |
98
- +-----------------------+------------------------------------------------------------------+
99
- | ``Rate.RATE_25_HZ`` | 25 Hz |
100
- +-----------------------+------------------------------------------------------------------+
108
+ +-----------------------------+------------------------------------------------+
109
+ | Rate | Description |
110
+ +-----------------------------+------------------------------------------------+
111
+ | ``Rate.LSP25_SHUTDOWN`` | Setting `data_rate` to ``Rate.LSP25_SHUTDOWN`` |
112
+ | | stops measurements from being taken |
113
+ +-----------------------------+------------------------------------------------+
114
+ | ``Rate.LSP25_RATE_1_HZ`` | 1 Hz |
115
+ +-----------------------------+------------------------------------------------+
116
+ | ``Rate.LSP25_RATE_7_HZ`` | 7 Hz |
117
+ +-----------------------------+------------------------------------------------+
118
+ | ``Rate.LSP25_RATE_12_5_HZ`` | 12.5 Hz |
119
+ +-----------------------------+------------------------------------------------+
120
+ | ``Rate.LSP25_RATE_25_HZ`` | 25 Hz |
121
+ +-----------------------------+------------------------------------------------+
122
+ | ``Rate.LSP22_SHUTDOWN`` | Setting `data_rate` to ``Rate.LSP22_SHUTDOWN`` |
123
+ | | stops measurements from being taken |
124
+ +-----------------------------+------------------------------------------------+
125
+ | ``Rate.LSP22_RATE_1_HZ`` | 1 Hz |
126
+ +-----------------------------+------------------------------------------------+
127
+ | ``Rate.LSP22_RATE_10_HZ`` | 10 Hz |
128
+ +-----------------------------+------------------------------------------------+
129
+ | ``Rate.LSP22_RATE_25_HZ`` | 25 Hz |
130
+ +-----------------------------+------------------------------------------------+
131
+ | ``Rate.LSP22_RATE_50_HZ`` | 50 Hz |
132
+ +-----------------------------+------------------------------------------------+
101
133
102
134
"""
103
135
104
136
pass # pylint: disable=unnecessary-pass
105
137
106
138
107
- Rate .add_values (
108
- (
109
- ("RATE_ONE_SHOT" , 0 , 0 , None ),
110
- ("RATE_1_HZ" , 1 , 1 , None ),
111
- ("RATE_7_HZ" , 2 , 7 , None ),
112
- ("RATE_12_5_HZ" , 3 , 12.5 , None ),
113
- ("RATE_25_HZ" , 4 , 25 , None ),
114
- )
115
- )
116
-
117
-
118
139
class LPS2X : # pylint: disable=too-many-instance-attributes
119
- """Library for the ST LPS2x family of pressure sensors
140
+ """Base class ST LPS2x family of pressure sensors
120
141
121
- :param ~busio.I2C i2c_bus: The I2C bus the LPS25HB is connected to.
142
+ :param ~busio.I2C i2c_bus: The I2C bus the sensor is connected to.
122
143
:param address: The I2C device address for the sensor. Default is ``0x5d`` but will accept
123
144
``0x5c`` when the ``SDO`` pin is connected to Ground.
124
145
125
146
"""
126
147
127
- _chip_id = ROUnaryStruct (_WHO_AM_I , "<B" )
128
- _reset = RWBit (_CTRL_REG2 , 2 )
129
- enabled = RWBit (_CTRL_REG1 , 7 )
130
- """Controls the power down state of the sensor. Setting to `False` will shut the sensor down"""
131
- _data_rate = RWBits (3 , _CTRL_REG1 , 4 )
132
- _raw_temperature = ROUnaryStruct (_TEMP_OUT_L , "<h" )
133
- _raw_pressure = ROBits (24 , _PRESS_OUT_XL , 0 , 3 )
148
+ _chip_id = ROUnaryStruct (_LPS2X_WHO_AM_I , "<B" )
149
+ _raw_temperature = ROUnaryStruct (_LPS2X_TEMP_OUT_L , "<h" )
150
+ _raw_pressure = ROBits (24 , _LPS2X_PRESS_OUT_XL , 0 , 3 )
134
151
135
- def __init__ (self , i2c_bus , address = _LPS25_DEFAULT_ADDRESS ):
152
+ def __init__ (self , i2c_bus , address = _LPS2X_DEFAULT_ADDRESS , chip_id = None ):
136
153
self .i2c_device = i2cdevice .I2CDevice (i2c_bus , address )
137
- if not self ._chip_id in [_LPS25_CHIP_ID ]:
154
+ if not self ._chip_id in [chip_id ]:
138
155
raise RuntimeError (
139
- "Failed to find LPS25HB ! Found chip ID 0x%x" % self ._chip_id
156
+ "Failed to find LPS2X ! Found chip ID 0x%x" % self ._chip_id
140
157
)
141
-
142
158
self .reset ()
143
- self .enabled = True
144
- self .data_rate = Rate .RATE_25_HZ # pylint:disable=no-member
159
+ self .initialize ()
160
+ sleep (0.010 ) # delay 10ms for first reading
161
+
162
+ def initialize (self ): # pylint: disable=no-self-use
163
+ """Configure the sensor with the default settings. For use after calling `reset()`"""
164
+ raise RuntimeError (
165
+ "LPS2X Base class cannot be instantiated directly. Use LPS22 or LPS25 instead"
166
+ ) # override in subclass
145
167
146
168
def reset (self ):
147
169
"""Reset the sensor, restoring all configuration registers to their defaults"""
@@ -162,16 +184,16 @@ def pressure(self):
162
184
@property
163
185
def temperature (self ):
164
186
"""The current temperature measurement in degrees C"""
187
+
165
188
raw_temperature = self ._raw_temperature
166
- return (raw_temperature / 480 ) + 42.5
189
+ return (
190
+ raw_temperature / self ._temp_scaling # pylint:disable=no-member
191
+ ) + self ._temp_offset # pylint:disable=no-member
167
192
168
193
@property
169
194
def data_rate (self ):
170
195
"""The rate at which the sensor measures ``pressure`` and ``temperature``. ``data_rate``
171
- shouldbe set to one of the values of ``adafruit_lps2x.DataRate``. Note that setting
172
- ``data_rate``to ``Rate.ONE_SHOT`` places the sensor into a low-power shutdown mode where
173
- measurements toupdate ``pressure`` and ``temperature`` are only taken when
174
- ``take_measurement`` is called."""
196
+ shouldbe set to one of the values of ``adafruit_lps2x.Rate``."""
175
197
return self ._data_rate
176
198
177
199
@data_rate .setter
@@ -180,3 +202,82 @@ def data_rate(self, value):
180
202
raise AttributeError ("data_rate must be a `Rate`" )
181
203
182
204
self ._data_rate = value
205
+
206
+
207
+ class LPS25 (LPS2X ):
208
+ """Library for the ST LPS25 pressure sensors
209
+
210
+ :param ~busio.I2C i2c_bus: The I2C bus the LPS25HB is connected to.
211
+ :param address: The I2C device address for the sensor. Default is ``0x5d`` but will accept
212
+ ``0x5c`` when the ``SDO`` pin is connected to Ground.
213
+
214
+ """
215
+
216
+ enabled = RWBit (_LPS25_CTRL_REG1 , 7 )
217
+ """Controls the power down state of the sensor. Setting to `False` will shut the sensor down"""
218
+ _reset = RWBit (_LPS25_CTRL_REG2 , 2 )
219
+ _data_rate = RWBits (3 , _LPS25_CTRL_REG1 , 4 )
220
+
221
+ def __init__ (self , i2c_bus , address = _LPS2X_DEFAULT_ADDRESS ):
222
+
223
+ Rate .add_values (
224
+ (
225
+ ("LPS25_RATE_ONE_SHOT" , 0 , 0 , None ),
226
+ ("LPS25_RATE_1_HZ" , 1 , 1 , None ),
227
+ ("LPS25_RATE_7_HZ" , 2 , 7 , None ),
228
+ ("LPS25_RATE_12_5_HZ" , 3 , 12.5 , None ),
229
+ ("LPS25_RATE_25_HZ" , 4 , 25 , None ),
230
+ )
231
+ )
232
+ super ().__init__ (i2c_bus , address , chip_id = _LPS25HB_CHIP_ID )
233
+
234
+ self ._temp_scaling = 480
235
+ self ._temp_offset = 42.5
236
+ # self._inc_spi_flag = 0x40
237
+
238
+ def initialize (self ):
239
+ """Configure the sensor with the default settings. For use after calling `reset()`"""
240
+ self .enabled = True
241
+ self .data_rate = Rate .LPS25_RATE_25_HZ # pylint:disable=no-member
242
+
243
+ # void configureInterrupt(bool activelow, bool opendrain,
244
+ # bool pres_high = false, bool pres_low = false);
245
+
246
+
247
+ class LPS22 (LPS2X ):
248
+ """Library for the ST LPS22 pressure sensors
249
+
250
+ :param ~busio.I2C i2c_bus: The I2C bus the LPS22HB is connected to.
251
+ :param address: The I2C device address for the sensor. Default is ``0x5d`` but will accept
252
+ ``0x5c`` when the ``SDO`` pin is connected to Ground.
253
+
254
+ """
255
+
256
+ _reset = RWBit (_LPS22_CTRL_REG2 , 2 )
257
+ _data_rate = RWBits (3 , _LPS22_CTRL_REG1 , 4 )
258
+
259
+ def __init__ (self , i2c_bus , address = _LPS2X_DEFAULT_ADDRESS ):
260
+ # Only adding Class-appropriate rates
261
+ Rate .add_values (
262
+ (
263
+ ("LPS22_RATE_ONE_SHOT" , 0 , 0 , None ),
264
+ ("LPS22_RATE_1_HZ" , 1 , 1 , None ),
265
+ ("LPS22_RATE_10_HZ" , 2 , 10 , None ),
266
+ ("LPS22_RATE_25_HZ" , 3 , 25 , None ),
267
+ ("LPS22_RATE_50_HZ" , 4 , 50 , None ),
268
+ ("LPS22_RATE_75_HZ" , 5 , 75 , None ),
269
+ )
270
+ )
271
+
272
+ super ().__init__ (i2c_bus , address , chip_id = _LPS22HB_CHIP_ID )
273
+ self ._temp_scaling = 100
274
+ self ._temp_offset = 0
275
+
276
+ def initialize (self ):
277
+ """Configure the sensor with the default settings. For use after calling `reset()`"""
278
+ self .data_rate = Rate .LPS22_RATE_75_HZ # pylint:disable=no-member
279
+
280
+ # void configureInterrupt(bool activelow, bool opendrain, bool data_ready,
281
+ # bool pres_high = false, bool pres_low = false,
282
+ # bool fifo_full = false, bool fifo_watermark = false,
283
+ # bool fifo_overflow = false);
0 commit comments