Collegamento cellulare con bluetooth ed ESP32

Nel mio progetto ho un menù visualizzato su LCD, per accedervi, clicco il pulsante dell'encoder. Sto creando un app in modo da avere lo stesso menù sul cellulare. Per collegarmi al menù del cellulare ho fatto così:

void loop() {
  // Visualizzazione del menù principale se si preme il pulsante dell'encoder
  if (PULSANTE PREMUTO) {
    Menu_principale();
  } else if (SerialBT.available()) menu_bluetooth();

Questo è all'inizio del loop.

Invece questa è la routine che ho inizato a sviluppare:

void menu_bluetooth(){

  legge_carattere = SerialBT.read(); // Legge un carattere dal Bluetooth
  if (legge_carattere == 'Z') {
    spegne_tutto();
    lcd.clear();
    lcd.setCursor(2, 2); 
    lcd.print("Collegato al telefono");
    while(legge_carattere != 'F'){
      if (SerialBT.available()){
        legge_carattere = SerialBT.read();
        if (legge_carattere!= '\n'){
          messaggio+=String(legge_carattere);
        } else messaggio = "";
      }
      if (messaggio=="giorno1") {
        //ledcWrite(pwm_channels[scelta-4],0);
        digitalWrite(pin_giorno,1);  
      } else if (messaggio=="giorno0") digitalWrite(pin_giorno,0); 
    }
  } 
  spegne_tutto();
}

Le mie intenzioni sono:
quando ESP32 si collega al bluetooth salta a questa routine.
Se viene mandato il carattere "Z" continua con la procedura (vuol dire che si è collegato l'app creata da me, infatti nel momento in cui l'app si collega al bluetooth dell' ESP32 manda anche il carattere Z).
vengono spente tutte le luci e sul LCD compare la scritta di collegamento avvenuto. Poi ci sarà un while, si uscirà dal ciclo quando riceverà la lettera F che il telefono manderà prima di scollegarsi.
Quando l'ESP32 riceverà la stringa 'giorno1' accenderà il relativo pin, mentre se riceverà 'giorno0' lo spegnerà.
Queste sono le mie intenzioni per adesso, il problema è che il telefono si connette col ESP32 ma l'esecuzione non passa alla routine del bluetooth.
Cosa sbaglio?

Direi che è necessario vedere lo sketch completo per capirci qualcosa in più.

Non serve vedere l'intero codice, funziona e non c'entra con i menù perchè fa altro. Se premo il pulsante dell'encoder entra nel menù con LCD, quindi funziona. Chiedo se è corretto il controllo messo all'inizio del loop per richiamare funzione del bluetooth.

Servirebbe per capire come stai usando la funzionalità Bluetooth dell'ESP32 perché lo usi come si fa con i moduli con profilo SPP (tipo HC-05 per capirci) e dallo spezzone di codice che hai messo non si capisce.

//   ------------  Definizioni per il Bluetooth Seriale   -------------------

#include "BluetoothSerial.h"
//#define USE_PIN // Usa questa definizione se vuoi usare il pin durante il  pairing. Il pin è specificato nella linea seguente
const char *pin = "1234"; // Change this to more secure PIN.

String device_name = "BT-Presepe";

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

// Il mac address di questa scheda è: B8:D6:1A:5E:FA:92

//   ----------- Fine definizione Bluetooth Seriale  --------------

Questa è la definizione del Bluetooth

SerialBT.available()
Si utilizza questa funzione per verificare se ci sono dati disponibili per la lettura dalla porta seriale Bluetooth. Quindi, nel momento in cui mando la lettera 'Z', vede che c'è un dato disponibile e accede alla routine del bluetooth, almeno è quello che dovrebbe fare

... semplicemente NON la sta usando, usa un HC-05 esterno.

Sta usando una libreria che usa il bluetooth classico (v2.x), disponibile su ESP, con profilo SPP.

Guglielmo

In che senso non la usa.
Il codice è lo stesso che ho usato in una prova che ho fatto per accendere e spegnere un led collegato all'ESP32.

//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial

#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 message = "";
char incomingChar;

BluetoothSerial SerialBT;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  // Bluetooth device name
  SerialBT.begin("ESP32");
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {

  if (SerialBT.available())
  {
    char incomingChar = SerialBT.read();
    if (incomingChar != '\n'){
      message += String(incomingChar);
    }
    else{
      message = "";
    }
    Serial.write(incomingChar);  
  }


 if (message =="led_on")
  {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else if (message =="led_off")
  {
    digitalWrite(LED_BUILTIN, LOW);
  }
  
  delay(20);
  
}

poi in setup ho aggiunto:

 // Inizializza Bluetooth
  Serial.begin(115200);
  SerialBT.begin(device_name); //Bluetooth device nome

Credevo stessi usando, come avevi detto che averti fatto, un classico HC-05 esterno per semplificare il tutto ... invece, guardando meglio, vedo che usi QUESTA libreria che, praticamente, "dovrebbe" usare il Bluetooth classico (v2.x con profilo SPP) che è disponibile su ESP32. Errore mio.

Ho corretto il mio post precedente.

Guglielmo

Esatto, sto usando il bluetooth SPP dell'ESP32, lo avevo specificato all'inizio.
sto usando Kodular per creare l'app.


Questi sono i blocchi usati per inizializzare il bluetooth

blocks (2)

questo è il blocco usato per mandare il comando all'ESP32.
Al posto del "\n" usato per capire quando finisce il comando, ho usato il carattere "#". Ho modificato anche nel codice di arduino che ho postato sopra.

Dopo due giorni di inutilizzo, stasera ho acceso l'esp32 per risolvere il problema e ha funzionato al primo colpo, senza aver modificato nessun codice, sia su Arduino che su kodular, boh.
Mo è sorto un altro problema. Se scollego il bluetooth con l'apposito tasto da me creato, il circuito riprende le sue normali funzioni, invece se stacco il bluetooth quando sono collegato col telefono, l'esp32 non torna ad eseguire le proprie funzioni ma sta in attesa di un comando inviato dal bluetooth. Come faccio a farlo uscire dal ciclo While quando si scollega il bluetooth?

Nel ciclo while fai un test per sapere se il BT è ancora attivo, se non lo è forzi uscita da quel while

Grazie, ho fatto e funziona. Solo una domanda, ho usato questa istruzione:

if (SerialBT.connected()!=1) legge_carattere='*';

All'inizio avevo messo:

if (SerialBT.connected()!=1) legge_carattere="*";

però mi dava errore . Che differenza passa tra '' e "" ?

Altra domanda, fin'ora ho letto dal bluetooth, ora devo mandare dei numeri da visualizzare sul telefono, in seguito dovrò anche riceverli, come si fa? So che c'è la funzione SerialBT.write per scrivere sulla seriale del bluetooth, come si fa a mandare numeri o stringhe?

Apici singoli per singoli caratteri, doppi apici per stringhe (frasi)

Dovrebbe anche esserci SerialBT.print più semplice di write

Per essere precisi ... 'A' (con singoli apici) è un tipo char ed in memoria occupa un byte (valore 0x41), se invece scrivi "A" (con doppi apici) ai una stringa classica del C, ovvero un char array ... "A" occupa 2 bytes, il primo per il carattere A ed il secondo per il terminatore di stringa (valori 0x41 0x00).

Guglielmo

Con i numeri come funziona? Per mandare il numero 35 scrivo SerialBT.write (35)?
Che differenza c'è tra write e print?

Studiare il reference ...

  • write() ... "Writes binary data to the serial port."
  • print() ... "Prints data to the serial port as human-readable ASCII text."

Guglielmo