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?
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 --------------
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
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);
}
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.
Questi sono i blocchi usati per inizializzare il bluetooth
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?
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?
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).