Switch case e seriale

Ciao ho un problema con lo switch case qui sotto,in poche parole quando ricevo i dati da 0 a 9 tutto ok, quando arriva 10 mi esegue ancora l'1 e lo 0, come posso risolvere? mi servono + o - 100 case. Garzie

void loop(){

    if ( Serial.available()){
    int lettura = Serial.read();
    switch (lettura){
      
    case '0' :
     out_sala1(MUTE); 
     Serial.println("SALA 1 MUTE ");
     break;
     
    case '1' :
     out_sala1(VOL1); 
     break;
     
    case '2' :
     out_sala1(VOL2); 
     break;  
     
    case '3' :
     out_sala1(VOL3); 
     break;
     
    case '4' :
     out_sala1(VOL4); 
     break;
     
    case '5' :
     out_sala1(VOL5); 
     break;
     
    case '6' :
     out_sala1(VOL6); 
     break;
     
    case '7' :
     out_sala1(VOL7); 
     break;
     
    case '8' :
     out_sala1(VOL8); 
     break;
     
    case '9' :
     out_sala1(VOL9); 
     break;

    case '10' :
     out_sala1(VOL10); 
     break;

chiaro...alla seriale arrivano sequenze di caratteri che tu giustamente hai interpretato con gli apici nei vari case. Ma leggendo sempre solo il primo byte (=primo carattere) quando arrivi a 10 leggi leggi 1 finchè non arrivi a 20, dopodichè leggerai 2 per 10 volte ecc...

se vuoi arrivare fino a 100 leggiti i primi 3 byte sulla seriale, sempre per ogni caso.
Poi puoi fare una cosa del genere:

switch(byte1 + byte2 + byte3){
case '0'+'0'+'1':
break;
...
case '0'+'5'+'0':
break;
...
case '1'+'0'+'0':
break;
}

oppure fare una conversione del tipo:

int pippo = (byte1 - 48)*100 + (byte2 -48)*10 +(byte3 -48);

switch(pippo){
case 1: //nota senza gli apici perchè è un numero
break;
...
}

Ti esegue nuovamente il caso 0 ed il caso 1 perché tu stai facendo il confronto con '1', che è la stringa "1", non il valore 1.
Ricorda inoltre che Serial.read legge 1 byte alla volta, per cui se mandi "10" tu in realtà leggi "1" e "0" per cui esegue quei casi.

La soluzione è quella di inviare un byte, ossia 1,2,3,.... 100 e non una stringa.
Così quando leggerai il byte 56, anche se il carattere sarà senza senso, tu avrai il valore 56 semplicemente facendo switch (byte(lettura)), ossia convertendo il carattere ricevuto nel suo valore.

esatto, terza opzione, quella intelligente, fare come dice leo72, non usi la seriale come ASCII ma ci guadagni in minor sbattimenti nelle conversioni!

Come giá proposto trasmetti sulla seriale non una stringa ma una variabile.
alternativa:
E se converti i caratteri del numero ricevuto dalla seriale in un int e fai un switch case normale da 1 a 100?

unsigned int incomingByte;   
char Data[4];
int i;
unsigned long Tempo;

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

void loop(){
 
   do {
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Tempo = millis(); 
     } while (i<4&&(millis()-Tempo) < 500);
  
   Data[i] = 0;    
   incomingByte = atof(Data);  
   i=0;
   Serial.print(incomingByte);
}

Riceve una stringa di 3 caratteri oppure aspetta 0,5 secondi dal primo carattere spedito sulla seriale e trasforma la stringa in un numero.

Dopo un semplice switch case.

Ciao Uwe

Grazie a tutti stassera quando torno a casa provo le varie soluzioni. :smiley:

Ciao rieccomi dopo varie prove con le soluzioni da voi proposte ( che non ho compreso al 100% :~ ) sto provando con il codice di Uwe, visto che devo ricevere delle stringhe,in poche parole in questo mio primo progetto controllo 5 ds1802 che sono dei potenziometri audio a registri,a ogni ds a ho "associato" 16 case,
ora quando invio da 1 a 16 il controllo del primo è tutto ok ma quando arrivo a 17 mi controlla il secondo ma mi cambia anche il volume nel primo

//----------------------------------> CONTROLLO VOLUME 5 STANZE CON DS1802

int rstPin = 8; // pin rst sul chip pin 5
int clockPin = 12; // pin clock sul chip pin 3

int sala1 = 3; // pin dati Sala 1
int sala2 = 4; // pin dati Sala 2
int sala3 = 5; // pin dati Sala 3
int sala4 = 6; // pin dati Sala 4
int sala5 = 7; // pin dati Sala 5

#define VOL1 0x40 // MUTE
#define VOL2 0x2A
#define VOL3 0x27
#define VOL4 0x24
#define VOL5 0x21
#define VOL6 0x1E
#define VOL7 0x1B
#define VOL8 0x18
#define VOL9 0x15
#define VOL10 0x12
#define VOL11 0x0F
#define VOL12 0x0C
#define VOL13 0x09
#define VOL14 0x06
#define VOL15 0x03
#define VOL16 0x00 // VOLUME MASSIMO

unsigned int incomingByte;
char Data[4];
int i;
unsigned long Tempo;

//----------------------------------> CONTROLLO ACCENSIONE TELERUTTORE

int ledPin = 13; // PIN USCITA LED
int inPin = 9; // CONTATTO TELERUTTORE
int val = 0;

//----------------------------------> DEFINISCO GLI I/O

void setup() {

pinMode(rstPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(sala1, OUTPUT);
pinMode(sala2, OUTPUT);
pinMode(sala3, OUTPUT);
pinMode(sala4, OUTPUT);
pinMode(sala5, OUTPUT);

pinMode(ledPin, OUTPUT);
pinMode(inPin, INPUT);

Serial.begin(9600);
Serial.println("attendo comando");
}

//----------------------------------> FUNZIONI DATI SALE

void out_sala1(int volume){
digitalWrite(rstPin, HIGH);
shiftOut(sala1,clockPin,LSBFIRST,volume); // POT-0
shiftOut(sala1,clockPin,LSBFIRST,volume); // POT-1
digitalWrite(rstPin, LOW);
}

void out_sala2(int volume2){
digitalWrite(rstPin, HIGH);
shiftOut(sala2,clockPin,LSBFIRST,volume2);
shiftOut(sala2,clockPin,LSBFIRST,volume2);
digitalWrite(rstPin, LOW);
}

void out_sala3(int volume3){
digitalWrite(rstPin, HIGH);
shiftOut(sala3,clockPin,LSBFIRST,volume3);
shiftOut(sala3,clockPin,LSBFIRST,volume3);
digitalWrite(rstPin, LOW);
}

void out_sala4(int volume4){
digitalWrite(rstPin, HIGH);
shiftOut(sala4,clockPin,LSBFIRST,volume4);
shiftOut(sala4,clockPin,LSBFIRST,volume4);
digitalWrite(rstPin, LOW);
}

void out_sala5(int volume5){
digitalWrite(rstPin, HIGH);
shiftOut(sala5,clockPin,LSBFIRST,volume5);
shiftOut(sala5,clockPin,LSBFIRST,volume5);
digitalWrite(rstPin, LOW);
}

//----------------------------------> LOOP

void loop(){

do {
if (Serial.available()) {
Data = Serial.read();

  • i++;*
  • } *
  • if(i<1)Tempo = millis();*
  • } while (i<4&&(millis()-Tempo) < 500);*

_ Data = 0; _
_
incomingByte = atof(Data); _
_
i=0;
_

* switch (incomingByte){*
* case 1 :*
* out_sala1(VOL1);
_
break;*_

* case 2 :*
* out_sala1(VOL2);
_
break; *_

* case 3 :*
* out_sala1(VOL3);
_
break;*_

* case 4 :*
* out_sala1(VOL4);
_
break;*_

* case 5 :*
* out_sala1(VOL5);
_
break;*_

* case 6 :*
* out_sala1(VOL6);
_
break;*_

* case 7 :*
* out_sala1(VOL7);
_
break;*_

* case 8 :*
* out_sala1(VOL8);
_
break;*_

* case 9 :*
* out_sala1(VOL9);
_
break;*_

* case 10 :*
* out_sala1(VOL10);
_
break;*_

* case 11 :*
* out_sala1(VOL11);
_
break;*_

* case 12 :*
* out_sala1(VOL12);
_
break;*_

* case 13 :*
* out_sala1(VOL13);
_
break;*_

* case 14 :*
* out_sala1(VOL14);
_
break;*_

* case 15 :*
* out_sala1(VOL15);
_
break;*_

* case 16 :*
* out_sala1(VOL16);
_
Serial.print("SEDICI");_
_
break;*_

*//----------------------------------> SALA 2 *

* case 17 :*
* out_sala2(VOL1);
_
Serial.print("DICIASSETTE");_
_
break;*_

* case 18 :*
* out_sala2(VOL2);
_
break; *_

* case 19 :*
* out_sala2(VOL3);
_
break;*_

* case 20 :*
* out_sala2(VOL4);
_
break;*_

* case 21 :*
* out_sala2(VOL5);
_
break;*_

* case 22 :*
* out_sala2(VOL6);
_
break;*_

* case 23 :*
* out_sala2(VOL7);
_
break;*_

* case 24 :*
* out_sala2(VOL8);
_
break;*_

* case 25 :*
* out_sala2(VOL9);
_
break;*_

* case 26 :*
* out_sala2(VOL10);
_
break;*_

* case 27 :*
* out_sala2(VOL11);
_
break;*_

* case 28 :*
* out_sala2(VOL12);
_
break;*_

* case 29 :*
* out_sala2(VOL13);
_
break;*_

* case 30 :*
* out_sala2(VOL14);
_
break;*_

* case 31 :*
* out_sala2(VOL15);
_
break;*_

* case 32 :*
* out_sala2(VOL16);
_
break;_
_
//----------------------------------> SALA 3 *_

* case 33 :*
* out_sala3(VOL1);
_
break;*_

* case 34 :*
* out_sala3(VOL2);
_
break; *_

* case 35 :*
* out_sala3(VOL3);
_
break;*_

* case 36 :*
* out_sala3(VOL4);
_
break;*_

* case 37 :*
* out_sala3(VOL5);
_
break;*_

* case 38 :*
* out_sala3(VOL6);
_
break;*_

* case 39 :*
* out_sala3(VOL7);
_
break;*_

* case 40 :*
* out_sala3(VOL8);
_
break;*_

* case 41 :*
* out_sala3(VOL9);
_
break;*_

* case 42 :*
* out_sala3(VOL10);
_
break;*_

* case 43 :*
* out_sala3(VOL11);
_
break;*_

* case 44 :*
* out_sala3(VOL12);
_
break;*_

* case 45 :*
* out_sala3(VOL13);
_
break;*_

* case 46 :*
* out_sala3(VOL14);
_
break;*_

* case 47 :*
* out_sala3(VOL15);
_
break;*_

* case 48 :*
* out_sala3(VOL16);
_
break;*_

*//----------------------------------> SALA 4 *

* case 49 :*
* out_sala4(VOL1);
_
break;*_

* case 50 :*
* out_sala4(VOL2);
_
break;*_

* case 51 :*
* out_sala4(VOL3);
_
break;*_

* case 52 :*
* out_sala4(VOL4);
_
break;*_

* case 53 :*
* out_sala4(VOL5);
_
break;*_

* case 54 :*
* out_sala4(VOL6);
_
break;*_

* case 55 :*
* out_sala4(VOL7);
_
break;*_

* case 56 :*
* out_sala4(VOL8);
_
break;*_

* case 57 :*
* out_sala4(VOL9);
_
break;*_

* case 58 :*
* out_sala4(VOL10);
_
break;*_

* case 59 :*
* out_sala4(VOL11);
_
break;*_

* case 60 :*
* out_sala4(VOL12);
_
break;*_

* case 61 :*
* out_sala4(VOL13);
_
break;*_

* case 62 :*
* out_sala4(VOL14);
_
break;*_

* case 63 :*
* out_sala4(VOL15);
_
break;*_

* case 64 :*
* out_sala4(VOL16);
_
break; _
_
//----------------------------------> SALA 5 *_

* case 65 :*
* out_sala5(VOL1);
_
break;*_

* case 66 :*
* out_sala5(VOL2);
_
break; *_

* case 67 :*
* out_sala5(VOL3);
_
break;*_

* case 68 :*
* out_sala5(VOL4);
_
break;*_

* case 69 :*
* out_sala5(VOL5);
_
break;*_

* case 70 :*
* out_sala5(VOL6);
_
break;*_

* case 71 :*
* out_sala5(VOL7);
_
break;*_

* case 72 :*
* out_sala5(VOL8);
_
break;*_

* case 73 :*
* out_sala5(VOL9);
_
break;*_

* case 74 :*
* out_sala5(VOL10);
_
break;*_

* case 75 :*
* out_sala5(VOL11);
_
break;*_

* case 76 :*
* out_sala5(VOL12);
_
break;*_

* case 77 :*
* out_sala5(VOL13);
_
break;*_

* case 78 :*
* out_sala5(VOL14);
_
break;*_

* case 79 :*
* out_sala5(VOL15);
_
break;*_

* case 80 :*
* out_sala5(VOL16);
_
break;_
_
}}_
_
[/quote]*_

Tu fai:

Data = Serial.read();

invece dovresti:

Data[i] = Serial.read();

è un array!

se hai problemi sulla comprensione di ciò che ha scritto Uwe, prova a usare il secondo esempio che ti ho fatto. Trasforma i 3 byte che leggi dalla seriale in un numero intero, sottraggo 48 perchè il numero che invii sulla seriale è un carattere ASCII quindi il carattere '0' corrisponde a 48 in decimale.

Grazie ho sbagliato funzione per inserire il codice sul forum si è mangiata le parentesi e la i non so come...comunque il codice i Uwe funziona.
Ho risolto separando i pin del Clock evidentemente uno solo per 5 ds1802 creava casini, cmq ora provo anche con la tua conversione cosi imparo XD. Grazie

void out_sala1(int volume){  
     digitalWrite(rstPin, HIGH);
     shiftOut(sala1,clockPin,LSBFIRST,volume); // POT-0
     shiftOut(sala1,clockPin,LSBFIRST,volume); // POT-1
     digitalWrite(rstPin, LOW);
}

void out_sala2(int volume2){  
     digitalWrite(rstPin, HIGH);
     shiftOut(sala2,clockPin2,LSBFIRST,volume2); 
     shiftOut(sala2,clockPin2,LSBFIRST,volume2); 
     digitalWrite(rstPin, LOW);
}

void out_sala3(int volume3){  
     digitalWrite(rstPin, HIGH);
     shiftOut(sala3,clockPin3,LSBFIRST,volume3); 
     shiftOut(sala3,clockPin3,LSBFIRST,volume3);
     digitalWrite(rstPin, LOW);
}

void out_sala4(int volume4){  
     digitalWrite(rstPin, HIGH);
     shiftOut(sala4,clockPin4,LSBFIRST,volume4); 
     shiftOut(sala4,clockPin4,LSBFIRST,volume4);
     digitalWrite(rstPin, LOW);
}

void out_sala5(int volume5){  
     digitalWrite(rstPin, HIGH);
     shiftOut(sala5,clockPin5,LSBFIRST,volume5); 
     shiftOut(sala5,clockPin5,LSBFIRST,volume5);
     digitalWrite(rstPin, LOW);
}