I have an Arduino Nano 33 IOT and it uses BLE. I want it to talk to my Pi 3B+ and send all of its sensor data. I cannot figure out a way to do it using Python for the Pi and ArduinoBLE library for my Nano IoT. Is it possible?
1 Answer
For completeness, it appears an appropriate Python library can be installed with:
pip3 install adafruit-circuitpython-ble
The test code, used with the Arduino code 'Echo' from the ArduinoHardwareBLE library is below. This was updated to let you choose the name of the device (here, MY_BLE) rather than any random device that has UART capability. It also allows you to send a small file from a few lines, with a "#" denoting a comment (first character in the line). ESC and a return quits the program.
# Connect to an "eval()" service over BLE UART.
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
ble = BLERadio()
uart_connection = None
def send_stuff(s):
uart_service.write(s.encode("utf-8"))
uart_service.write(b'\n')
readline=uart_service.readline().decode("utf-8")
while(len(readline)>0):
print(readline)
readline=uart_service.readline().decode("utf-8")
while True:
if not uart_connection:
print("Trying to connect...")
print("ESC then RETURN to exit.")
for adv in ble.start_scan(ProvideServicesAdvertisement):
if UARTService in adv.services:
regular_name = adv.complete_name
if(regular_name=='MY_BLE'):
uart_connection = ble.connect(adv)
print("Connected")
# for some reason, we have to read a line...
uart_service = uart_connection[UARTService]
print(uart_service.readline().decode("utf-8"))
break
ble.stop_scan()
if uart_connection and uart_connection.connected:
uart_service = uart_connection[UARTService]
while uart_connection.connected:
s = input("Prompt: ")
if(len(s)>0):
if(ord(s[0])==27):
print("done.")
exit()
else:
# Check if "!" character is used; if so, send contents of a file
if(s[0]=="!"):
print("sending commands")
count=0
file1=open('commands.txt','r')
Lines=file1.readlines()
for line in Lines:
count=count+1
tmp=line.strip()
if(len(tmp)>0):
if(tmp[0]=='#'):
print("comment:" + tmp)
else:
print("Line{}: {}".format(count, tmp))
send_stuff(tmp)
else:
send_stuff(s)
-
Will this work on the Pi 3B+ because I don't know if it has BLE. Commented May 5, 2021 at 14:12
-
-
The specs on the 3B+ say it has BLE, so this might work. I have not tested it however; only with an Ubuntu 20.04 LTS system with (Anaconda) Python 3.7.7.– asylumaxCommented May 5, 2021 at 20:55