Menù sul cellulare tramite Bluetooth

Salve, sto facendo varie prove per capire ed imparare il funzionamento di Arduino, ho creato un menù su LCD che funziona con dei tasti. Ho messo nel Loop un IF che controlla quando un determinato tasto viene premuto per entrare nella sezione menù in cui si può variare il valore di alcune variabili, quando si esce dal menù il tutto riprende con i nuovi valori.
Ho pensato di eliminare tasti e display e di creare il menù sul telefono, ho creato la parte grafica e il tasto per collegarsi ad arduino col bluetooth, ora mi chiedo: prima, per entrare nel menù, controllavo la pressione di un tasto, col Bluetooth, Arduino, cosa deve controllare per sapere quando il telefono si connette e come trasferisco i valori cambiati dal menù sul telefono per usarli su Arduino? Dovrei immettere quei valori nelle stesse variabili che ho usato prima col menù LCD

ciao
http://appinventor.mit.edu/
questo ti permette di creare app

Ti ringrazio per l'aiuto ma il mio problema non è app inventor (uso Kodular).
Ho fatto così: quando il telefono si collega al bluetooth di arduino, manda la lettera "m". Nel loop principale ho messo:

 if (BtSerial.available()) {
   get = BtSerial.read();  
   if (get == "m") menu();
   Serial.print(get);
 }

Il serial print l'ho messo per vedere cosa legge, mi funziona. Quando chiama la procedura menu sta in attesa fino a quando sul cellulare clicco sul menù che voglio modificare. Ho fatto che quando clicco sul menù che voglio modificare, oltre ad apparire la grafica sul telefono, mando una lettera ad arduino col bluetooth, ogni menù ha la sua lettera per cui trami if chiamo la funzione appropriata. Il problema è che la lettera viene inviata e letta (ho controllato tramite un serial print, ma la procedura non viene chiamata.


void menu(){ 
 char menu1;
 while (menu1 != "l") {
   if (BtSerial.available()) {
     menu1 = BtSerial.read();
     Serial.print(menu1);
     if (menu1 == "f") procedura1();
     if (menu1 == "u") procedura2();
     if (menu1 == "s") procedura3();
    }
  }
}

Occhio che stai paragonando un char (1 byte) con uno char array (di 2 bytes) dato che hai usato i doppi apici (identificativi di una stringa classica del C) ... se vuoi comparare un sigolo carattere con un singolo carattere devi usare i singoli apici, es. '1'.

Guglielmo

Non lo sapevo, allora perchè nel loop principale mi funziona? Fa il confronto con m e va alla procedura menu, mo provo.

Sicuro che funziona? O sembra funzionare ... :roll_eyes:

Perché un char è un singolo carattere ('a' -> 0x61), una string è un array di char ("a" -> 0x61 0x00).

Guglielmo

Non lo so perchè funzionava e gli altri no ma seguendo le tue indicazioni i caratteri vengono riconosciuti. Grazie.
Funzionando, mi sono accorto che ho un problema nel software, in pratica anzichè usare un pulsante per accendere e uno per spegnere, ho usato lo strumento switch, più professionale, solo che come clicco clicco fa sempre la stessa cosa, vuol dire che non ho capito come si programma, mica mi potresi dare una delucidazione, sempre che sai come funziona. Ho visto nel help ma è tutto inglese.

Penso perché la variabile "get", della quale non hai indicato la definizione, era/è di tipo "String" (classe da evitare).

Posta qui il tuo codice (tutto, e mettendolo sempre tra tag "CODE/"), altrimenti non ti si può rispondere in modo coerente.

#include <AltSoftSerial.h> // Libreria per utilizzare la seriale sui pin 46=TX e 48=RX di Arduino Mega

AltSoftSerial BtSerial;

int prova[4];
char get;

void setup() {
  Serial.begin(9600);
  BtSerial.begin(9600);
}

void loop() {

/* Scrive dal PC al Bluetooth
  if (Serial.available()) {
    c = Serial.read();
    BtSerial.print(c);
  }
*/

 if (BtSerial.available()) {
   get = BtSerial.read(); 
    Serial.print(get); 
   if (get == 'm') menu();
  
 }
}

void menu(){ 
 char menu1;
 while (menu1 != 'u') {
   if (BtSerial.available()) {
     menu1 = BtSerial.read();
     Serial.print(menu1);
     if (menu1 == 'a') procedura1();
     if (menu1 == 'b') procedura2();
     if (menu1 == 'c') procedura3();
    }
  }
}

void procedura1(){
 int inc=0;
 while (inc==4){
   if (BtSerial.available()) {
     tempo[inc] = BtSerial.read();
     inc++;
   }
 }
}

void procedura2(){
  int menu;
 if (BtSerial.available()) {
   menu = BtSerial.read();
 }
}

void procedura3(){
 char val;
 Serial.println("sei nel menu manuale");
 while (val != 'm'){
   if (BtSerial.available()) {
     val = BtSerial.read();
     Serial.println(val);
     if (val == 'a') {
       Serial.print("Il led è =");
     } 
     if (val == 'e') {
       Serial.print("acceso");
     } else Serial.println("spento");
   }
 }
}

Per il confronto avevo preso l'opzione Enable, invece mettendo l'opzione "is Checked" mi riconosce il cambiamento

Vedo nel tuo codice un pò di errori:

void procedura1(){
 int inc=0;
 while (inc==4){     // entro e ciclo finché inc è uguale a 4
   if (BtSerial.available()) {
     tempo[inc] = BtSerial.read();
     inc++;
   }
 }
}

non può entrare nel while visto che inc inizia a 0

void menu(){ 
 char menu1;
 while (menu1 != 'u') {  // entro e ciclo finché menu1 è diverso da 'u'

Le variabili locali ad una funzione non vengono inizializzate, hanno un valore a casaccio.
Qui sarebbe meglio inizializzarlo a qualcosa di diverso da 'u', meglio 0 char menu1=0;
Ne hai alcuni come questo.

Inoltre il codice non compila, esempio tempo non è dichiarata da nessuna parte.

Eh, già. Oltre al fatto che sarebbe meglio che avesse implementato una macchina a stati finiti per gestire le sequenze, ma per ora per evvitargli confusione soprassiederei :wink:

Hai ragione, è una procedura che ancora devo provare, l'ho scritta veloce per non dimenticare cosa volevo fare :smiley:

Che intendi con "hanno un valore a casaccio"?

Anche qui hai ragione, all'inizio era prova, poi ho cambiato in tempo, dato che stavo andando avanti col codice, volevo dare nomi con un significato, però non ho cambiato prova in tempo.

La lettera u verrà mandata tramite bluetooth quando premo sul pulsante per uscire dal menù.
Perchè mettere menu1=0? zero è un numero mentre quella è una variabile che contiene caratteri.

Per macchina a stati finiti intendi questo:

switch(stato) { 
case 1:
codice;
break;
}

Anche i caratteri sono numeri, secondo la codifica ASCII dei caratteri.

Per macchina a stati finiti intendi questo

La struttura di selezione switch è solo un modo comodo per scegliere tra diverse alternative (si può fare anche con if/else if/else). La macchina a stati è un metodo di programmazione, che risulta pratico da scrivere con una struttura switch.

Lo so, però pensavo che era corretto fare così: menu1="0"
Che cambia tra menu1=0 e menu1="0"?

Che:
0 = 0
'0' = 48