L'ESP32 intègre le Bluetooth 4.0 LE Low Energy parfaitement adapté aux objets connectés.


Le Bluetooth LE  est une variante du Bluetooth qui engendre une consommation d'énergie extrêmement réduite. L'application principale du BLE est la transmission à courtes distances de petites quantités de données. La latence et le débit sont réduits par rapport au Bluetooth classique.

Le BLE est utilisable en liaison point à point ou en réseau maillé.


Attention, Il faut activer la localisation sur le client (smartphone) 

Attention, la version BLE a changé, cette bibliothèque a été testé avec le Firmware  esp32-idf3-20200411-v1.12-357.bin et ne fonctionnera pas avec d'autres Firmwares.


Télécharger la bibliothèque  : esp_ble_uart_v2.zip et  l'installer  (voir le tutoriel)


Exemples de programmes :

L'application Serial Bluetooth Terminal pour Android  permet de faire des tests d'envoi / réception de données à partir d'un Smartphone.


 Principe serveur et client


La communication est basée sur deux rôles :

    • Client : Un périphérique qui initie la communication, qui lance des commandes et des requêtes  et accepte des réponses, par exemple un smartphone.
    • Serveur : Un périphérique qui est à l'écoute, qui reçoit des commandes et des demandes, et renvoie des réponses, par exemple un capteur de pulsation cardiaque.


Le serveur annonce son existence, afin qu'il puisse être trouvé par d'autres périphériques, et contient les données que le client peut lire. 

Le client scanne les périphériques à proximité, et lorsqu'il trouve le serveur qu'il recherche, il établit une connexion et écoute les données entrantes. C'est ce qu'on appelle la communication point à point.


Exemple pour la bibliothèque Bluetooth UART


Le serveur expose à un client des données, appelées  service ou  caractéristique. Elles sont identifiées par un nombre nommé UUID.  

Ex : 6E400003-B5A3-F393-E0A9-E50E24DCCA9E      On peut choisir un UUID aléatoire pour des utilisations propriétaires.


UART_TX

Le client peut demander une notification pour une caractéristique particulière du serveur. Le serveur peut alors envoyer la valeur au client dès qu’elle est disponible.

 Par exemple, un serveur de pulsation cardiaque peut avertir son client chaque fois qu’il prend une mesure. Cela évite au client de devoir interroger le serveur et économise de l'énergie.


UART_RX

Le client écrit une donnée sur le serveur avec confirmation (OK).




 BluetoothLE  UART envoi de données

 

ESP32  Micropython programme pour envoyer en BluetoothLE des données


from esp_ble_uart import *
from time import *

nom = 'ESP32-ble-uart-gcworks'
UUID_UART = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_TX = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_RX = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'

uart = Bleuart(nom, UUID_UART, UUID_TX, UUID_RX)
uart.close()

# Fonction pour envoyer des données
def envoi(val_tx):
    uart.write(str(val_tx))  
    print("envoi tx = ", val_tx)


while True:
    envoi("abc")       
    sleep_ms(500)
    envoi(12)
    sleep_ms(500) 
     

L'application Serial Bluetooth Terminal pour Android  permet de faire des tests d'envoi / réception de données à partir d'un Smartphone.

Avec un terminal série on peut ajouter \n pour aller à la ligne : uart.write(str(val_tx) + '\n')

Pensez à personnaliser vos UUID dans le cas de l'utilisation de plusieurs périphériques.



 BluetoothLE  UART envoi et réception de données


Programme ESP32  Micropython pour  envoyer et recevoir en BluetoothLE des données


from esp_ble_uart import *
import time

nom = 'ESP32-ble-uart-gcworks'
UUID_UART = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_TX = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_RX = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
val_rx = "12"

uart = Bleuart(nom, UUID_UART, UUID_TX, UUID_RX)
uart.close()

def rcp_rx():
    global val_rx
    val_rx = uart.read().decode().strip()
    print('sur rx: ', val_rx)               # Interruption : affichage données reçues

uart.irq(handler=rcp_rx)


def env_tx(val_tx):
    uart.write(str(val_tx) + '\n')
    print("tx", val_tx)

while True:
    env_tx("xxx")       # xxx données à envoyer au format String
    time.sleep_ms(1000)
    val_rx_int = int(val_rx[:-1])   #à utiliser si l'octet reçu est un entier
    print(val_rx_int)

      

L'application Serial Bluetooth Terminal pour Android  permet de faire des tests d'envoi / réception de données à partir d'un Smartphone.



 Bluetooth UART App Inventor pilotage Néopixels


Programme App Inventor à télécharger : app_inventor_esp_ble_uart_neopixel.zip


Version projet App Inventor aia esp_ble_uart_aia.zip


Tutoriel App Inventor


Programme ESP32  Micropython pour communiquer en Bluetooth avec App Inventor en UART émetteur Tx-récepteur Rx asynchrone + Néopixels


from esp_ble_uart import *
from time import *
import machine, neopixel

np = neopixel.NeoPixel(machine.Pin(26), 8)

nom = 'ESP32-ble-uart-gcworks'
UUID_UART = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_TX = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
UUID_RX = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'

uart = Bleuart(nom, UUID_UART, UUID_TX, UUID_RX)
uart.close())

val_rx = "20,0,0"

def rcp_rx():
    global val_rx
    val_rx = uart.read().decode().strip()
    print('sur rx: ', val_rx)        # Interruption : affichage données reçues

uart.irq(handler=rcp_rx)

def env_tx(val_tx):
    uart.write(str(val_tx) + '\n')
    print("tx", val_tx)

while True:
    couleur = val_rx.split(",",3)

    print(couleur)
    r = int(couleur[0])
    v = int(couleur[1])
    b = int(couleur[2])

    for adresse_pixel in range(0, 8):
        np[adresse_pixel] = (r, v, b)

    np.write()
    sleep_ms(1000)



      



BluetoothLE UART App Inventor envoi et réception de données

 


Programme App Inventor à télécharger : app_inventor_esp_ble_uart.zip


Tutoriel App Inventor


Utiliser le programme BluetoothLE UART envoi et réception de données
























Créé avec HelpNDoc Personal Edition: Produire des aides en ligne pour les applications Qt