Ola, possuo um esp32 da marca Wemos, modelo D1 R32, no qual já possui por padrão um modulo Bluetooth e Wifi, porem não consigo me conectar a nenhum dispositivo Bluetooth independente do código, mesmo pegando códigos prontos ou ate mesmo exemplos do próprio arduino IDE, no monitor serial aparece o dispositivo no qual desejo me conectar, e no meu celular também aparece, consigo fazer o pareamento, porem não a conexão mesmo!
Existe a possibilidade dela estar com defeito? ou seria uma falha da minha própria parte?
#include <map>
#include <BluetoothSerial.h>
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth não está habilitado! Por favor, execute `make menuconfig` para habilitá-lo.
#endif
#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth não disponível ou não habilitado. Só está disponível para o chip ESP32.
#endif
BluetoothSerial SerialBT;
#define BT_DISCOVER_TIME 15000 // Aumentei o tempo de descoberta para 15 segundos
#define MAX_RETRIES 3 // Número máximo de tentativas de conexão
esp_spp_sec_t sec_mask = ESP_SPP_SEC_NONE;
esp_spp_role_t role = ESP_SPP_ROLE_SLAVE;
void setup() {
Serial.begin(115200);
if (!SerialBT.begin("ESP32test", true)) {
Serial.println("========== serialBT falhou!");
abort();
}
Serial.println("Iniciando discoverAsync...");
BTScanResults *btDeviceList = SerialBT.getScanResults();
if (SerialBT.discoverAsync([](BTAdvertisedDevice *pDevice) {
Serial.printf(">>>>>>>>>>>Encontrado novo dispositivo assíncrono: %s\n", pDevice->toString().c_str());
})) {
delay(BT_DISCOVER_TIME);
Serial.print("Parando discoverAsync... ");
SerialBT.discoverAsyncStop();
Serial.println("discoverAsync parado");
delay(5000);
if (btDeviceList->getCount() > 0) {
BTAddress addr;
int channel = 0;
Serial.println("Dispositivos encontrados:");
for (int i = 0; i < btDeviceList->getCount(); i++) {
BTAdvertisedDevice *device = btDeviceList->getDevice(i);
Serial.printf(" ----- %s %s %d\n", device->getAddress().toString().c_str(), device->getName().c_str(), device->getRSSI());
delay(1000); // Adicionando um pequeno delay antes de escanear canais
std::map<int, std::string> channels = SerialBT.getChannels(device->getAddress());
Serial.printf("Escaneando por serviços, encontrados %d canais\n", channels.size());
for (auto const &entry : channels) {
Serial.printf(" canal %d (%s)\n", entry.first, entry.second.c_str());
}
if (channels.size() > 0) {
addr = device->getAddress();
channel = channels.begin()->first;
break; // Pare ao encontrar o primeiro dispositivo com canais disponíveis
}
}
if (addr) {
int retries = 0;
bool connected = false;
while (retries < MAX_RETRIES && !connected) {
Serial.printf("Conectando a %s - canal %d (Tentativa %d de %d)\n", addr.toString().c_str(), channel, retries + 1, MAX_RETRIES);
connected = SerialBT.connect(addr, channel, sec_mask, role);
if (connected) {
Serial.println("Conectado com sucesso!");
} else {
Serial.println("Falha na conexão, tentando novamente...");
retries++;
delay(2000); // Aguardar um pouco antes de tentar novamente
}
}
if (!connected) {
Serial.println("Falha ao conectar após várias tentativas.");
}
} else {
Serial.println("Nenhum dispositivo com canais disponíveis foi encontrado.");
}
} else {
Serial.println("Nenhum dispositivo encontrado.");
}
} else {
Serial.println("Erro no discoverAsync, por exemplo, não funcionando após um \"connect\"");
}
}
String sendData = "Olá do esp32!\n";
void loop() {
if (!SerialBT.isClosed() && SerialBT.connected()) {
if (SerialBT.write((const uint8_t *)sendData.c_str(), sendData.length()) != sendData.length()) {
Serial.println("tx: erro");
} else {
Serial.printf("tx: %s", sendData.c_str());
}
if (SerialBT.available()) {
Serial.print("rx: ");
while (SerialBT.available()) {
int c = SerialBT.read();
if (c >= 0) {
Serial.print((char)c);
}
}
Serial.println();
}
} else {
Serial.println("não conectado");
}
delay(1000);
}