Neste tutorial, vamos aprender a ativar, gerir e testar o Bluetooth num ESP32 utilizando a linguagem de programação Arduino. O Bluetooth é uma tecnologia sem fios muito utilizada para a comunicação entre dispositivos electrónicos. Pode transformar rapidamente o seu sistema num objeto ligado.
Equipamento
- Um módulo ESP32 (Bluetooth+Wifi integrados)
- Um computador com Python instalado ou um smartphone
- Cabo USB para ligação ao computador ESP32
Configuração do ambiente e do IDE
Para programar o seu ESP32 com o IDE Arduino, pode seguir este tutorial anterior.
Recuperar o endereço MAC
Esta informação não é necessariamente necessária, mas é sempre uma boa ideia saber como obter o endereço MAC do ESP32.
#include "esp_bt_main.h" #include "esp_bt_device.h" #include "BluetoothSerial.h" BluetoothSerial SerialBT; void printDeviceAddress() { const uint8_t* point = esp_bt_dev_get_address(); for (int i = 0; i < 6; i++) { char str[3]; sprintf(str, "%02X", (int)point[i]); Serial.print(str); if (i < 5){ Serial.print(":"); } } } void setup() { Serial.begin(115200); SerialBT.begin("ESP32BT"); Serial.print("MaxAddr : "); printDeviceAddress(); } void loop() {}
Saída
14:42:43.448 -> MaxAddr : 3C:61:05:31:5F:12
Comunicação em série via Bluetooth
A comunicação Bluetooth é activada da mesma forma que a comunicação em série. O método é semelhante para o módulo HC-06
#include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32BT"); //Bluetooth device name Serial.println("The device started, now you can pair it with bluetooth!"); } void loop() { if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) { Serial.write(SerialBT.read()); } delay(20); }
N.B.: Parece haver uma forma de adicionar um código PIN, mas não consigo pô-lo a funcionar.
SerialBT.setPin(pin);SerialBT.begin("ESP32BT ", true);
Emparelhamento
Uma vez configurado o módulo, pode emparelhar o ESP32 com o sistema da sua escolha, como qualquer outro dispositivo Bluetooth. Seleccione o nome na lista de dispositivos detectados (nome ESP32BT)
Teste da comunicação Bluetooth utilizando o terminal Bluetooth de série
Vamos testar a comunicação Bluetooth utilizando a aplicação Serial Terminal Bluetooth.
A mensagem é trocada entre o telemóvel e o ESP32 através de Bluetooth
Código para obter a encomenda completa
No código anterior, copiámos a mensagem byte a byte para a enviar de volta para o monitor. Aqui vamos registar o comando completo numa String msg. Isto permitir-lhe-á analisar o comando e definir a ação correspondente (por exemplo, ligar
#include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif String msg; BluetoothSerial SerialBT; const char *pin = "1234"; void setup() { Serial.begin(115200); SerialBT.begin("ESP32BT"); //Bluetooth device name Serial.println("ESP32BT device started, now you can pair it!"); } void loop(){ readSerialPort(); // Send answer to master if(msg!=""){ Serial.print("Master sent : " ); Serial.println(msg); SerialBT.print("received : "+msg); msg=""; } } void readSerialPort(){ while (SerialBT.available()) { delay(10); if (SerialBT.available() >0) { char c = SerialBT.read(); //gets one byte from serial buffer msg += c; //makes the string readString } } SerialBT.flush(); }
Comunicação entre o ESP32 e o Python via Bluetooth
Pode gerir a comunicação Bluetooth a partir do seu PC.
Para fazer isso, instale o pacote PyBluez
python -m pip install pybluez
Detetar dispositivos bluetooth
import bluetooth target_name = "ESP32BT" target_address = None nearby_devices = bluetooth.discover_devices(lookup_names=True,lookup_class=True) print(nearby_devices) for btaddr, btname, btclass in nearby_devices: if target_name == btname: target_address = btaddr break if target_address is not None: print("found target {} bluetooth device with address {} ".format(target_name,target_address)) else: print("could not find target bluetooth device nearby")
Saída
[('88:C6:26:91:30:84', 'UE\xa0BOOM\xa02', 2360344), ('88:C6:26:7E:F2:7A', 'UE\xa0BOOM\xa02', 2360344), ('4C:EA:AE:D6:92:08', 'OPPO A94 5G', 5898764), ('41:42:DD:1F:45:69', 'MX_light', 2360344), ('3C:61:05:31:5F:12', 'ESP32BT', 7936)] found target ESP32BT bluetooth device with address 3C:61:05:31:5F:12
Ligação e comunicação com o ESP32
Aqui está um script Python para se ligar automaticamente ao dispositivo Bluetooth ESP32 a partir de um PC
import bluetooth import socket target_name = "ESP32BT" target_address = None nearby_devices = bluetooth.discover_devices(lookup_names=True,lookup_class=True) print(nearby_devices) for btaddr, btname, btclass in nearby_devices: if target_name == btname: target_address = btaddr break if target_address is not None: print("found target {} bluetooth device with address {} ".format(target_name,target_address)) """ # With PyBluez NOT WORKING serverMACAddress = target_address port = 1 s = bluetooth.BluetoothSocket(bluetooth.RFCOMM) s.connect((serverMACAddress, port)) while 1: text = raw_input() # Note change to the old (Python 2) raw_input if text == "quit": break s.send(text) data = s.recv(1024) if data: print(data) sock.close()""" serverMACAddress = target_address port = 1 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) s.connect((serverMACAddress,port)) print("connected to {}".format(target_name)) while 1: text = input() if text == "quit": break s.send(bytes(text, 'UTF-8')) data = s.recv(1024) if data: print(data) s.close() else: print("could not find target bluetooth device nearby")
N.B.: Apenas a biblioteca socket funciona para a comunicação Bluetooth. Parece haver um problema de manutenção com a biblioteca PyBluez.