Once the base BLE libraries are installed, you can install helper libraries for various third-party BLE peripherals, and access them directly. We'll show examples of peripherals accessed from several different host computers.
This example uses the BerryMed Pulse Oximeter sold by Adafuit. Install the pulse oximeter library by typing the pip3
command below into your shell. Then download the example program below.
pip3 install adafruit-circuitpython-ble-berrymed-pulse-oximeter
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ Read data from a BerryMed pulse oximeter, model BM1000C, BM1000E, etc. """ # Protocol defined here: # https://github.com/zh2x/BCI_Protocol # Thanks as well to: # https://github.com/ehborisov/BerryMed-Pulse-Oximeter-tool # https://github.com/ScheindorfHyenetics/berrymedBluetoothOxymeter # # The sensor updates the readings at 100Hz. import _bleio import adafruit_ble from adafruit_ble.advertising.standard import Advertisement from adafruit_ble.services.standard.device_info import DeviceInfoService from adafruit_ble_berrymed_pulse_oximeter import BerryMedPulseOximeterService # CircuitPython <6 uses its own ConnectionError type. So, is it if available. Otherwise, # the built in ConnectionError is used. connection_error = ConnectionError if hasattr(_bleio, "ConnectionError"): connection_error = _bleio.ConnectionError # PyLint can't find BLERadio for some reason so special case it here. ble = adafruit_ble.BLERadio() # pylint: disable=no-member pulse_ox_connection = None while True: print("Scanning...") for adv in ble.start_scan(Advertisement, timeout=5): name = adv.complete_name if not name: continue # "BerryMed" devices may have trailing nulls on their name. if name.strip("\x00") == "BerryMed": pulse_ox_connection = ble.connect(adv) print("Connected") break # Stop scanning whether or not we are connected. ble.stop_scan() print("Stopped scan") try: if pulse_ox_connection and pulse_ox_connection.connected: print("Fetch connection") if DeviceInfoService in pulse_ox_connection: dis = pulse_ox_connection[DeviceInfoService] try: manufacturer = dis.manufacturer except AttributeError: manufacturer = "(Manufacturer Not specified)" try: model_number = dis.model_number except AttributeError: model_number = "(Model number not specified)" print("Device:", manufacturer, model_number) else: print("No device information") pulse_ox_service = pulse_ox_connection[BerryMedPulseOximeterService] while pulse_ox_connection.connected: print(pulse_ox_service.values) except connection_error: try: pulse_ox_connection.disconnect() except connection_error: pass pulse_ox_connection = None
Run the example program, and turn on the pulse oximeter, reading from your finger. Here's a screenshot from running it on Windows, in PowerShell. In this example, I typed ctrl-C after getting a few readings.
This is a Schoshe Heart Rate Monitor, which transmits data using the standard BLE Heart Rate Monitor service. Install the heart rate library by typing the pip3
command below into your shell. Then download the example program below.
pip3 install adafruit-circuitpython-ble-heart-rate
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ Read heart rate data from a heart rate peripheral using the standard BLE Heart Rate service. """ import time import adafruit_ble from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.standard.device_info import DeviceInfoService from adafruit_ble_heart_rate import HeartRateService # PyLint can't find BLERadio for some reason so special case it here. ble = adafruit_ble.BLERadio() # pylint: disable=no-member hr_connection = None while True: print("Scanning...") for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5): if HeartRateService in adv.services: print("found a HeartRateService advertisement") hr_connection = ble.connect(adv) print("Connected") break # Stop scanning whether or not we are connected. ble.stop_scan() print("Stopped scan") if hr_connection and hr_connection.connected: print("Fetch connection") if DeviceInfoService in hr_connection: dis = hr_connection[DeviceInfoService] try: manufacturer = dis.manufacturer except AttributeError: manufacturer = "(Manufacturer Not specified)" try: model_number = dis.model_number except AttributeError: model_number = "(Model number not specified)" print("Device:", manufacturer, model_number) else: print("No device information") hr_service = hr_connection[HeartRateService] print("Location:", hr_service.location) while hr_connection.connected: print(hr_service.measurement_values) time.sleep(1)
Turn on your heart rate monitor, and run the example program. reading from your finger. Here's a screenshot from running it on Ubuntu Linux. In this example, I typed ctrl-C after getting a few readings.
Here's a BLE-enabled food thermometer, which can take two probes. It and similar models are readily available under the "nutrichef" brand name, and identify as "iBBQ" in their BLE advertisements.
Install the iBBQ library by typing the pip3 command below into your shell. Then download the example program below.
pip3 install adafruit-circuitpython-ble-ibbq
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import time import adafruit_ble from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble_ibbq import IBBQService # PyLint can't find BLERadio for some reason so special case it here. ble = adafruit_ble.BLERadio() # pylint: disable=no-member ibbq_connection = None while True: print("Scanning...") for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5): if IBBQService in adv.services: print("found an IBBq advertisement") ibbq_connection = ble.connect(adv) print("Connected") break # Stop scanning whether or not we are connected. ble.stop_scan() if ibbq_connection and ibbq_connection.connected: ibbq_service = ibbq_connection[IBBQService] ibbq_service.init() while ibbq_connection.connected: print( "Temperatures:", ibbq_service.temperatures, "; Battery:", ibbq_service.battery_level, ) time.sleep(2)
Turn on your thermometer, and run the example program. Here's a screenshot from running it on MacOS. In this example, I typed ctrl-C after getting a few readings.
Page last edited January 22, 2025
Text editor powered by tinymce.