Skip to content

Commit 1bdd94c

Browse files
committed
🎉 add support for BMP585 [#15]
Add support for BMP585 pressure sensor. Closes #15
1 parent 965e33b commit 1bdd94c

14 files changed

+807
-1
lines changed

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,17 @@ print(result)
274274

275275
### Examples
276276

277-
Take a look at the additional [examples](./examples).
277+
Take a look at the additional [examples](./examples):
278+
279+
* [bma400](examples/bma400)
280+
* [bma456](examples/bma456)
281+
* [bma530](examples/bma530)
282+
* [bma580](examples/bma580)
283+
* [bme280](examples/bme280)
284+
* [bmi088](examples/bmi088)
285+
* [bmi323](examples/bmi323)
286+
* [bmp390](examples/bmp390)
287+
* [bmp585](examples/bmp585)
278288

279289
## Default firmware
280290

examples/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ board:
129129
* [`bmp390/bmp390_spi_interrupt_streaming.py`](./bmp390/bmp390_spi_interrupt_streaming.py)
130130

131131

132+
## [`bmp585`](https://www.bosch-sensortec.com/products/environmental-sensors/pressure-sensors/bmp585/)
133+
134+
The examples in the [`bmp585`](./bmp585) folder
135+
show different communication features for the
136+
[BMP585 shuttle](https://www.bosch-sensortec.com/media/boschsensortec/downloads/shuttle_board_flyer/application_board_3_1/bst-bmp585-sf000.pdf)
137+
board:
138+
139+
* [`bmp585/bmp585_i2c_read_write.py`](./bmp585/bmp585_i2c_read_write.py)
140+
* [`bmp585/bmp585_i2c_polling_streaming.py`](./bmp585/bmp585_i2c_polling_streaming.py)
141+
* [`bmp585/bmp585_i2c_interrupt_streaming.py`](./bmp585/bmp585_i2c_interrupt_streaming.py)
142+
* [`bmp585/bmp585_spi_read_write.py`](./bmp585/bmp585_spi_read_write.py)
143+
* [`bmp585/bmp585_spi_polling_streaming.py`](./bmp585/bmp585_spi_polling_streaming.py)
144+
* [`bmp585/bmp585_spi_interrupt_streaming.py`](./bmp585/bmp585_spi_interrupt_streaming.py)
145+
132146

133147
## Need a specific example or do not know how to read data from your sensor?
134148

examples/bmp585/__init__.py

Whitespace-only changes.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import logging
2+
import struct
3+
import sys
4+
import time
5+
from pathlib import Path
6+
7+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
8+
9+
10+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
11+
logger = logging.getLogger()
12+
logger.setLevel(level)
13+
stdout_handler = logging.StreamHandler(sys.stdout)
14+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
15+
log_formatter = logging.Formatter(log_format)
16+
stdout_handler.setFormatter(log_formatter)
17+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
18+
file_handler.setFormatter(log_formatter)
19+
logger.addHandler(stdout_handler)
20+
logger.addHandler(file_handler)
21+
return logger
22+
23+
24+
if __name__ == "__main__":
25+
logger = setup_logging()
26+
# This example is for Application Board 3.1 hardware
27+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
28+
shuttle.initialize()
29+
shuttle.check_connected_hw()
30+
31+
shuttle.configure_i2c()
32+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
33+
assert shuttle.sensor.chip_id == 0x51
34+
shuttle.configure_interrupt_streaming()
35+
shuttle.start_streaming()
36+
time.sleep(0.1)
37+
for idx in range(1000):
38+
for streaming in shuttle.board.receive_interrupt_streaming_multiple(includes_mcu_timestamp=False):
39+
sensor_id, packet, time_stamp, payload = streaming
40+
(temp_xlsb, temp_lsb, temp_msb, pressure_xlsb, pressure_lsb, pressure_msb) = struct.unpack(
41+
"<BBBBBB", payload
42+
)
43+
pressure = ((pressure_msb << 16) | (pressure_lsb << 8) | pressure_xlsb) / 2**6
44+
(full_degrees,) = struct.unpack("<b", int.to_bytes(temp_msb, 1, byteorder="little"))
45+
fractional_degrees = ((temp_lsb << 8) | temp_xlsb) / 2**16
46+
temperature = full_degrees + fractional_degrees
47+
logger.info(f"[{idx=:03d}], pressure(Pa)={pressure:7.3f}, temperature(C)={temperature:3.3f}")
48+
time.sleep(0.05)
49+
shuttle.board.stop_interrupt_streaming()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import logging
2+
import struct
3+
import sys
4+
import time
5+
from pathlib import Path
6+
7+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
8+
9+
10+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
11+
logger = logging.getLogger()
12+
logger.setLevel(level)
13+
stdout_handler = logging.StreamHandler(sys.stdout)
14+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
15+
log_formatter = logging.Formatter(log_format)
16+
stdout_handler.setFormatter(log_formatter)
17+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
18+
file_handler.setFormatter(log_formatter)
19+
logger.addHandler(stdout_handler)
20+
logger.addHandler(file_handler)
21+
return logger
22+
23+
24+
if __name__ == "__main__":
25+
logger = setup_logging()
26+
# This example is for Application Board 3.1 hardware
27+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
28+
shuttle.initialize()
29+
shuttle.check_connected_hw()
30+
31+
shuttle.configure_i2c()
32+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:04X}")
33+
assert shuttle.sensor.chip_id == 0x51
34+
shuttle.configure_polling_streaming()
35+
shuttle.start_streaming()
36+
time.sleep(0.1)
37+
for idx in range(1000):
38+
for streaming in shuttle.board.receive_polling_streaming_multiple():
39+
sensor_id, payload = streaming
40+
(temp_xlsb, temp_lsb, temp_msb, pressure_xlsb, pressure_lsb, pressure_msb) = struct.unpack(
41+
"<BBBBBB", payload
42+
)
43+
pressure = ((pressure_msb << 16) | (pressure_lsb << 8) | pressure_xlsb) / 2**6
44+
(full_degrees,) = struct.unpack("<b", int.to_bytes(temp_msb, 1, byteorder="little"))
45+
fractional_degrees = ((temp_lsb << 8) | temp_xlsb) / 2**16
46+
temperature = full_degrees + fractional_degrees
47+
logger.info(f"[{idx=:03d}], pressure(Pa)={pressure:7.3f}, temperature(C)={temperature:3.3f}")
48+
time.sleep(0.05)
49+
shuttle.board.stop_polling_streaming()
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import logging
2+
import sys
3+
import time
4+
from pathlib import Path
5+
6+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
7+
8+
9+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
10+
logger = logging.getLogger()
11+
logger.setLevel(level)
12+
stdout_handler = logging.StreamHandler(sys.stdout)
13+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
14+
log_formatter = logging.Formatter(log_format)
15+
stdout_handler.setFormatter(log_formatter)
16+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
17+
file_handler.setFormatter(log_formatter)
18+
logger.addHandler(stdout_handler)
19+
logger.addHandler(file_handler)
20+
return logger
21+
22+
23+
if __name__ == "__main__":
24+
logger = setup_logging()
25+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
26+
shuttle.initialize()
27+
shuttle.check_connected_hw()
28+
29+
shuttle.configure_i2c()
30+
31+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
32+
logger.info(f"rev_id=0x{shuttle.sensor.rev_id:02X}")
33+
logger.info(f"chip_status=0x{shuttle.sensor.chip_status:02X}")
34+
logger.info(f"status=0x{shuttle.sensor.status:02X}")
35+
logger.info(f"drive_config=0b{shuttle.sensor.drive_config:08b}")
36+
logger.info(f"int_config=0b{shuttle.sensor.int_config:08b}")
37+
logger.info(f"dsp_config=0b{shuttle.sensor.dsp_config:08b}")
38+
logger.info(f"odr_config=0b{shuttle.sensor.odr_config:08b}")
39+
shuttle.sensor.osr_config = 1 << 6
40+
shuttle.sensor.odr_config = (1 << 7) | (0x0 << 2) | (0b11 << 0)
41+
time.sleep(0.1)
42+
logger.info(f"odr_config=0b{shuttle.sensor.odr_config:08b}")
43+
logger.info(f"osr_config=0b{shuttle.sensor.osr_config:08b}")
44+
45+
temperature = shuttle.sensor.temperature
46+
logger.info(f"temperature(C)={temperature}")
47+
pressure = shuttle.sensor.pressure
48+
logger.info(f"pressure(Pa)={pressure}")
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import logging
2+
import struct
3+
import sys
4+
import time
5+
from pathlib import Path
6+
7+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
8+
9+
10+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
11+
logger = logging.getLogger()
12+
logger.setLevel(level)
13+
stdout_handler = logging.StreamHandler(sys.stdout)
14+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
15+
log_formatter = logging.Formatter(log_format)
16+
stdout_handler.setFormatter(log_formatter)
17+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
18+
file_handler.setFormatter(log_formatter)
19+
logger.addHandler(stdout_handler)
20+
logger.addHandler(file_handler)
21+
return logger
22+
23+
24+
if __name__ == "__main__":
25+
logger = setup_logging()
26+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
27+
shuttle.initialize()
28+
shuttle.check_connected_hw()
29+
30+
shuttle.configure_spi()
31+
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete
32+
33+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
34+
assert shuttle.sensor.chip_id == 0x51
35+
shuttle.configure_interrupt_streaming()
36+
shuttle.start_streaming()
37+
time.sleep(0.1)
38+
for idx in range(1000):
39+
for streaming in shuttle.board.receive_interrupt_streaming_multiple(includes_mcu_timestamp=False):
40+
sensor_id, packet, time_stamp, payload = streaming
41+
(temp_xlsb, temp_lsb, temp_msb, pressure_xlsb, pressure_lsb, pressure_msb) = struct.unpack(
42+
"<BBBBBB", payload
43+
)
44+
pressure = ((pressure_msb << 16) | (pressure_lsb << 8) | pressure_xlsb) / 2**6
45+
(full_degrees,) = struct.unpack("<b", int.to_bytes(temp_msb, 1, byteorder="little"))
46+
fractional_degrees = ((temp_lsb << 8) | temp_xlsb) / 2**16
47+
temperature = full_degrees + fractional_degrees
48+
logger.info(f"[{idx=:03d}], pressure(Pa)={pressure:7.3f}, temperature(C)={temperature:3.3f}")
49+
time.sleep(0.05)
50+
shuttle.board.stop_interrupt_streaming()
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logging
2+
import struct
3+
import sys
4+
import time
5+
from pathlib import Path
6+
7+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
8+
9+
10+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
11+
logger = logging.getLogger()
12+
logger.setLevel(level)
13+
stdout_handler = logging.StreamHandler(sys.stdout)
14+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
15+
log_formatter = logging.Formatter(log_format)
16+
stdout_handler.setFormatter(log_formatter)
17+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
18+
file_handler.setFormatter(log_formatter)
19+
logger.addHandler(stdout_handler)
20+
logger.addHandler(file_handler)
21+
return logger
22+
23+
24+
if __name__ == "__main__":
25+
logger = setup_logging()
26+
# This example is for Application Board 3.1 hardware
27+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
28+
shuttle.initialize()
29+
shuttle.check_connected_hw()
30+
31+
shuttle.configure_spi()
32+
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete
33+
34+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
35+
assert shuttle.sensor.chip_id == 0x51
36+
shuttle.configure_polling_streaming()
37+
shuttle.start_streaming()
38+
time.sleep(0.1)
39+
for idx in range(1000):
40+
for streaming in shuttle.board.receive_polling_streaming_multiple():
41+
sensor_id, payload = streaming
42+
(temp_xlsb, temp_lsb, temp_msb, pressure_xlsb, pressure_lsb, pressure_msb) = struct.unpack(
43+
"<BBBBBB", payload
44+
)
45+
pressure = ((pressure_msb << 16) | (pressure_lsb << 8) | pressure_xlsb) / 2**6
46+
(full_degrees,) = struct.unpack("<b", int.to_bytes(temp_msb, 1, byteorder="little"))
47+
fractional_degrees = ((temp_lsb << 8) | temp_xlsb) / 2**16
48+
temperature = full_degrees + fractional_degrees
49+
logger.info(f"[{idx=:03d}], pressure(Pa)={pressure:7.3f}, temperature(C)={temperature:3.3f}")
50+
time.sleep(0.05)
51+
shuttle.board.stop_polling_streaming()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import logging
2+
import sys
3+
import time
4+
from pathlib import Path
5+
6+
from umrx_app_v3.shuttle_board.bmp585.bmp585_shuttle import BMP585Shuttle
7+
8+
9+
def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
10+
logger = logging.getLogger()
11+
logger.setLevel(level)
12+
stdout_handler = logging.StreamHandler(sys.stdout)
13+
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
14+
log_formatter = logging.Formatter(log_format)
15+
stdout_handler.setFormatter(log_formatter)
16+
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
17+
file_handler.setFormatter(log_formatter)
18+
logger.addHandler(stdout_handler)
19+
logger.addHandler(file_handler)
20+
return logger
21+
22+
23+
if __name__ == "__main__":
24+
logger = setup_logging()
25+
shuttle = BMP585Shuttle.on_hardware_v3_rev1()
26+
shuttle.initialize()
27+
shuttle.check_connected_hw()
28+
29+
shuttle.configure_spi()
30+
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete
31+
32+
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
33+
logger.info(f"rev_id=0x{shuttle.sensor.rev_id:02X}")
34+
logger.info(f"chip_status=0x{shuttle.sensor.chip_status:02X}")
35+
logger.info(f"status=0x{shuttle.sensor.status:02X}")
36+
logger.info(f"drive_config=0b{shuttle.sensor.drive_config:08b}")
37+
logger.info(f"int_config=0b{shuttle.sensor.int_config:08b}")
38+
logger.info(f"dsp_config=0b{shuttle.sensor.dsp_config:08b}")
39+
logger.info(f"odr_config=0b{shuttle.sensor.odr_config:08b}")
40+
shuttle.sensor.osr_config = 1 << 6
41+
shuttle.sensor.odr_config = (1 << 7) | (0x0 << 2) | (0b11 << 0)
42+
time.sleep(0.1)
43+
logger.info(f"odr_config=0b{shuttle.sensor.odr_config:08b}")
44+
logger.info(f"osr_config=0b{shuttle.sensor.osr_config:08b}")
45+
46+
temperature = shuttle.sensor.temperature
47+
logger.info(f"temperature(C)={temperature}")
48+
pressure = shuttle.sensor.pressure
49+
logger.info(f"pressure(Pa)={pressure}")

0 commit comments

Comments
 (0)