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?

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)
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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.