ESP32 WROOM collegamento Bluetooth (SPP) a modulo HC-05

Buongiorno,

per quanto riguarda la comunicazione via Bluetooth non sono un esperto quindi per prima cosa mi sono documentato ma purtroppo non ho trovato molto riguardante questa connesione ma soltanto quella BLE e dopo vari tentativi e ricerche su internet non sono riuscito a trovare una soluzione, vi spiego il problema...
Vorrei collegare ESP32 tramite bluetooth al modulo HC-05 collegato ad un arduino Mega2560 per inviare e ricevere dati da un sensore ( la parte di ricezione ed invio dati è già funzionante).
Ho utilizzato per test l'esempio fornito dall'IDE di arduino per la connesione SPP del ESP32, modificando ovviamente il MAC address del modulo HC-05:

//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Victor Tchistiak - 2019
//
//This example demostrates master mode bluetooth connection and pin 
//it creates a bridge between Serial and Classical Bluetooth (SPP)
//this is an extention of the SerialToSerialBT example by Evandro Copercini - 2018
//

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

String MACadd = "98:D3:21:FC:73:E5";
uint8_t address1[6]  = {0x98, 0xD3, 0x21, 0xFC, 0x73, 0xE5};
//uint8_t address[6]  = {0x00, 0x1D, 0xA5, 0x02, 0xC3, 0x22};
String name = "HC-05";
char *pin = "1234"; //<- standard pin would be provided by default
bool connected;

void setup() {
  Serial.begin(115200);
  //SerialBT.setPin(pin);
  SerialBT.begin("ESP32test", true); 
  //SerialBT.setPin(pin);
  Serial.println("The device started in master mode, make sure remote BT device is on!");
  
  // connect(address) is fast (upto 10 secs max), connect(name) is slow (upto 30 secs max) as it needs
  // to resolve name to address first, but it allows to connect to different devices with the same name.
  // Set CoreDebugLevel to Info to view devices bluetooth address and device names
  //connected = SerialBT.connect(name);
  connected = SerialBT.connect(address);
  
  if(connected) {
    Serial.println("Connected Succesfully!");
  } else {
    while(!SerialBT.connected(10000)) {
      Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app."); 
    }
  }
  // disconnect() may take upto 10 secs max
  if (SerialBT.disconnect()) {
    Serial.println("Disconnected Succesfully!");
  }
  // this would reconnect to the name(will use address, if resolved) or address used with connect(name/address).
  SerialBT.connect();
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

una volta caricato il codice appena stampa su seriale "Connected Succesfully!" viene visualizzato questo errore:

Stack smashing protect failure!

abort() was called at PC 0x400d5f4c on core 0

Backtrace: 0x4009194c:0x3ffcf9b0 0x40091b7d:0x3ffcf9d0 0x400d5f4c:0x3ffcf9f0 0x400fe52f:0x3ffcfa10 0x400f59be:0x3ffcfa60 0x4008e0bd:0x3ffcfa90

e ESP32 viene resettato.
Inoltre ho provato a collegare sempre tramite questo sketch ESP32 ad un computer per verificare se non fosse guasto o difettoso e il collegamento funziona soltanto se rimane aperto un programma per comunicazione seriale per esempio Putty.
Ho provato anche a eseguire la connesione utilizzando i comandi AT del modulo HC-05 e accopiando il modulo con ESP32 ma il risultato dei vari comandi è sempre stato "FAIL".

Vi ringrazio anticipatamente per le risposte/indicazioni che potreste darmi!

Ciao,

intanto dovresti capire perché si riavvia e questo te lo dice nel messaggio di backtrace.

Quindi ti consiglio questo tool da implementare ad Arduino-IDE che ti decodifica quel messaggio, a me ha risolto diversi mal di testa :grin:

Ciao,

Grazie! Ho cercato su internet il codice di errore ma ovviamente non l'ho trovato, proverò subito questo tool almeno riuscirò a capire l'errore

Ho utilizzato il tool, la decodifica degli errori da questo messaggio:

Decoding stack results
0x4009194c: invoke_abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 155
0x40091b7d: abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 170
0x400d5f4c: __stack_chk_fail at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/stack_check.c line 36
0x400fe52f: btc_spp_cb_handler at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/bt/bluedroid/btc/profile/std/spp/btc_spp.c line 676
0x400f59be: btc_task at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/bt/bluedroid/btc/core/btc_task.c line 110
0x4008e0bd: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143

andando a cercarli ho capito di aver installato delle librerie non aggiornate che davano questi errori ed ho risolto questo problema.
Ricaricando il programma non dà più errori ma non si collega ancora, praticamente entra in questo ciclo if:

if(connected) {
    Serial.println("Connected Succesfully!");
  } else {
    while(!SerialBT.connected(10000)) {
      Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app.");
    }
  }

Ho riprovato a collegare esp32 al modulo HC-05 tramite i comandi AT da terminale e sono riuscito a collegarli, utilizzando però un altro sketch di esempio in cui non usa la funzione che in relatà mi serve:

SerialBT.connect(address)

bool BluetoothSerial::connect(uint8_t remoteAddress[])
{
    if (!isReady(true, READY_TIMEOUT)) return false;
    if (!remoteAddress) {
        log_e("No remote address is provided");
        return false; 
    }
    disconnect();
    _remote_name[0] = 0;
    _isRemoteAddressSet = true;
    memcpy(_peer_bd_addr, remoteAddress, ESP_BD_ADDR_LEN);
    log_i("master : remoteAddress");
    if (esp_spp_start_discovery(_peer_bd_addr) == ESP_OK) {
        return waitForConnect(READY_TIMEOUT);
    }
    return false;
}

posto anche la funzione trovata nelle librerie standard.

Premetto che con il BT ho fatto prove nel passato e non sono tanto fresco, ora utilizzo di più il BLE detto questo...

ho trovato questo facendo una ricerca

// connect(address) is fast (upto 10 secs max), connect(name) is slow (upto 30 secs max) as it needs
  // to resolve name to address first, but it allows to connect to different devices with the same name.
  // Set CoreDebugLevel to Info to view devices bluetooth address and device names
  connected = SerialBT.connect(name);
  //connected = SerialBT.connect(address);
  
  if(connected) {
    Serial.println("Connected Succesfully!");
  } else {
    while(!SerialBT.connected(10000)) {
      Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app."); 
    }
  }

Quindi, sei sicuro di aver messo il nome giusto ? se si, prova ad aumentare il timeout nel while come indicato dai commenti.

Se non funzione prova con l'address al posto del nome.

Ho utilizzato tutti e due e non si connette, sia il name che l'address, mentre invece utilizzando il computer si è connesso utilizzando l'address(il name non ho provato) ma soltanto se era aperto Putty.
Nel senso se Putty non era connesso alla porta seriale COM7 (virtuale) il collegamento non avveniva invece se prima di resettare/caricare lo sketch aprivo Putty si collega nell'arco di qualche secondo.

Proverò a mettere più secondi forse potrebbe anche essere questo il problema!

dolphkin:
Ho utilizzato tutti e due e non si connette, sia il name che l'address, mentre invece utilizzando il computer si è connesso utilizzando l'address(il name non ho provato) ma soltanto se era aperto Putty.
Nel senso se Putty non era connesso alla porta seriale COM7 (virtuale) il collegamento non avveniva invece se prima di resettare/caricare lo sketch aprivo Putty si collega nell'arco di qualche secondo.

Proverò a mettere più secondi forse potrebbe anche essere questo il problema!

Ciao, hai risolto? ho lo stesso problema.