1

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?

asked Nov 2, 2020 at 22:31
1
  • 1
    this describes the Arduino side ... you will have to figure out the RPi side since it is off topic here .. arduino.cc/en/Reference/ArduinoBLE Commented Nov 3, 2020 at 4:49

1 Answer 1

1

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)
answered May 4, 2021 at 1:12
3
  • Will this work on the Pi 3B+ because I don't know if it has BLE. Commented May 5, 2021 at 14:12
  • If you add a BT adapter, you should be able to. Commented May 5, 2021 at 20:28
  • 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. Commented May 5, 2021 at 20:55

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.