Primi e piccoli passi con Galileo e programmazione

Ciao a tutti :grinning:
Sono un assoluto new entry in Arduino e nella sua programmazione. Come se non bastasse non ho Arduino ma la Intel Galileo, che però usa più o meno gli stessi sketch e lo stesso IDE.
Ma veniamo al problema:
vorrei scrivere un codice che mi dica a quale tonalità appartenga la variazione in chiave che inserisco.
Ad esempio, se io inserisco 2 diesis, la tonalità da riportare è re maggiore e si minore (tonalità maggiore e minore). Questo però non basta, cioè, al programma io devo dire che tipo di variazione vado a inserire, se diesis o bemolle.
A seconda di questo e del numero di variazioni mi deve dare comunque la tonalità.
Ora, il codice che ho scritto è questo:

int die=-1;    //-1 perch potrebbe anche essere una variazione con 0 diesis e bemolle
int bem=-1;
char v;        //se il carattere che inserisco è d (diesis) mi darà la variazione con diesis, altrimenti b (bemolle)
void setup() {
  Serial.begin(9600);
  delay(5000);        //qui ho messo questo ritardo sennò a volte non mi stampa la riga di cui sotto
  Serial.println("Indica D se vuoi variare con i diesis. B per i bemolle");
}

void loop() {
    if (Serial.available()>0){
    v=Serial.read();                                                //inserisco d oppure b
    if(v=='d'){
      Serial.println("Inserisci il numero di diesis");
      die=Serial.read();                                           //indico il numero di diesis
      Serial.print("hai inserito ");
      Serial.write(die);
      Serial.println(" diesis");
      }
    }
}

il codice non è finito perché già qui ho problemi.
Dopo 5 secondi di ritardo (da me impostati) sul monitor seriale mi dice:

Indica V se vuoi variare con i diesi. B per i bemolle

e fin qui ok. Ma appena inserisco la d mi esce scritto

Inserisci il numero di diesis
hai inserito ÿ diesis

senza permettermi di indicare il numero di diesis.

Dove sbaglio? Sicuramente c'è qualche cosa che non so riguardo Serial.read() che trascuro e che invece è ovviamente importante :slightly_frowning_face:

Mi potete aiutare, per favore?

Quella y particolare è il valore 255, ovvero -1.
La seconda read() ha letto... nulla.
Devi sempre usare Serial.available() prima di una read() per sapere se c'e' qualcosa sulla seriale. La read() non attende nulla.
Quindi:

...
Serial.println("Inserisci il numero di diesis");
while( ! Serial.available() )  ;     // attende qualcosa da seriale
die=Serial.read();
...

oh ecco! :smiley: sapevo che mancava qualcosa ma pensavo che avendo messo il
Serial.available()
all'inizio fosse sufficiente.
OK! Ora, sono andato avanti. Come dicevo, a seconda del numero di diesis o bemolle che inserisco, a schermo mi deve apparire una cosa diversa. Ho pensato di utilizzare Switch...Case invece di una cascata if-else.
Ho scritto questo:

.....
Serial.println(" diesis");
 switch (die){
        case 0:
          Serial.println("La tonalità può essere DO Maggiore o LA Minore");
          break;          
        case 1:
          Serial.println("La tonalità può essere SOL Maggiore o MI Minore");
          break;        
        case 2:
          Serial.println("La tonalità può essere RE Maggiore o SI Minore");
          break;        
        case 3:
          Serial.println("La tonalità può essere LA Maggiore o FA# Minore");
          break;        
        case 4:
          Serial.println("La tonalità può essere MI Maggiore o DO# Minore");
          break;        
        case 5:
          Serial.println("La tonalità può essere SI Maggiore o SOL# Minore");
          break;        
        case 6:
          Serial.println("La tonalità può essere FA# Maggiore o RE# Minore");
          break;
        case 7:
          Serial.println("La tonalità può essere DO# Maggiore o LA# Minore");
          break;        
      }

ma a schermo non mi viene stampato nulla....perchè? Eppure la sintassi dovrebbe essere giusta. Che ho dimenticato? :relaxed:

Forse confondi il carattere "5" con il numero 5... e così via

Prova invece di

case 1

a mettere

case '1'

lo stesso per gli altri numeri

Dimmi se così fa qualcosa...

Funziona! :smiley:
però non ho capito il problema :-/ cioè, la variabile "die" è un int, no? Quindi a seconda del suo valore (cioè del "case" numerato) quando al numero corrisponde il valore dell'int dovrebbe funzionare, no?
Mettendo gli apici in cosa lo trasformo?

ciao
La seriale trasmette caratteri quindi quando scrivi

...
die=Serial.read();
...

assegni a die il valore ASCII del carattere trasmesso.
Se da seriale trasmetti in carattere 1 il valore di die è 49.
Nello Switch case mettendo gli apici gli dici di confrontare non il valore 1 ma il carattere 1 (ASCII 49).

ciao
pippo72

E aggiungiamo che se da seriale e quindi serial monitor dell'ide spedisci 123 NO stai spedendo il numero 123, ma del testo, quindi la frase "123" e quindi 3 caratteri uno dietro l'altro e la read leggerà 3 caratteri '1' '2' e poi '3'.

nid69ita:
E aggiungiamo che se da seriale e quindi serial monitor dell'ide spedisci 123 NO stai spedendo il numero 123, ma del testo, quindi la frase "123" e quindi 3 caratteri uno dietro l'altro e la read leggerà 3 caratteri '1' '2' e poi '3'.

ho capito. E se io volessi invece che la read legga 123, tutto insieme come unico numero?

ciao
puoi prendere spunto da articolo di Leo72.

ciao
pippo72

Oppure