Esp32 wemos d1r32 bluetooth

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

PS: tentei com outros celulares e ate mesmo conectar a um controle de ps4, e tive os mesmos resultados, o dispositivo aparece no monitor serial junto ao seu endereço MAC, porem não consigo firmar uma conexão!

Olá! Bem vindo ao Forum.

Se você tiver um celular Android, instale um app de Bluetooth serial e tente conectar ele (parear e conectar) com o Wemos usando o código abaixo:

#include "BluetoothSerial.h"
#define baudrate 115200
BluetoothSerial ESPBT;
String msg;


void setup() {
  Serial.begin(baudrate);                           // Inicia o monitor serial e o Bluetooth
  ESPBT.begin("ESP do MR");
}


void loop()   {
  
    readSerialPort();                             // Chama a função readSerialPort
    if(msg!=""){                                      // Se a mensagem construída não for vazia
    ESPBT.println(msg);                       // imprime no Bluetooth
    }
    

    if (ESPBT.available()){
      char temp = ESPBT.read();
      Serial.print(temp);             // imprime no monitor serial
    } 
}

  
void readSerialPort(){                               //Define a função readSerialPort
  msg="";
 while (Serial.available()) {                        // Enquanto a comunicação serial estiver aberta
   delay(10);  
   if (Serial.available() >0) {                      // Se algo for digitado no terminal serial
     char c = Serial.read();                         // obtém 1 byte do terminal serial
     msg += c;                                             //constrói a string msg somando o byte recebido
   }
  }
}

O Wemos vai aparecer como "ESP do MR".
O que você escrever no computador tem que aparecer no celular.
Depois mande um caracter do celular e ele deve aparecer no computador.

Olá @Brazilino obrigado por me responder, mesmo com o seu código e seguindo suas instruções não tive resultado, algo mais que eu possa estar testando? segue um vídeo do meu celular para te mostrar como esta aparecendo por lá!
** https://youtube.com/shorts/d4kxc3TrZaY?feature=share **
PS: tentei em outros celulares e tive o mesmo resultado, já com o modulo wifi do mesmo tive sucesso!

Seu vídeo vai até o momento em que você consegue parear o celular com o ESP. A parte de conectar não é feita clicando em cima do dispositivo pareado, mas sim dentro do aplicativo de Bluetooth Serial.

1 Like

Obrigado @Brazilino peço perdão pela minha ingenuidade, segundo oque voce falou consegui me conectar! então os demais problemas que estou enfrentando devem ser erros no meu código!

Imagina, todos nós começamos do zero e a ideia é nos ajudarmos. Divirta-se! :upside_down_face:

1 Like

5 posts were split to a new topic: Tenho um ESP32 DEV Kit v1 e consegui parear com um leitor de códigos de barras bluetooth