Problema funzione switch

Salve a tutti, ho un grosso problema con la funzione switch. In poche parole, cerco di inviare dei comandi ad arduino (delle stringhe contenenti delle parole), e vorrei fare in modo che arduino le interpreti.
Il problema è che se 2 parole terminano con la stessa lettera, mi da errore (“duplicate case value”) come se tiene in considerazione solo una lettera/numero.

Come posso fare per inviare stringhe ad arduino, e inserirle nella funzione switch?

questo è il mio codice…

#define BAUD_RATE 9600
#define ledPin13    13


char incomingChar;

void setup()
{
      pinMode(ledPin13, OUTPUT);


      // serial communication
      Serial.begin(BAUD_RATE);
}

void loop()
{
      if(Serial.available() > 0)
      {

            incomingChar = Serial.read();

            //your protocol goes here
            switch(incomingChar)
            {
                  case 'acceso':
                         // led is ON
                         digitalWrite(ledPin13, HIGH);
                         break;

                  case 'spento':
                         // led is OFF
                         digitalWrite(ledPin13, LOW);
                         break;


            }
      }
}

incomingChar è un carattere; di conseguenza i case dello switch devono riferirsi ad un carattere.
la scrittura “case ‘acceso’” non ha senso perché ‘acceso’ non è un carattere (lo stesso dicasi per ‘spento’).

Prova con questo:

#define BAUD_RATE 9600
#define ledPin13    13


char incomingChar;

void setup()
{
      pinMode(ledPin13, OUTPUT);


      // serial communication
      Serial.begin(BAUD_RATE);
}

void loop()
{
      if(Serial.available() > 0)
      {

            incomingChar = Serial.read();

            //your protocol goes here
            switch(incomingChar)
            {
                  case 'a':
                         // led is ON
                         digitalWrite(ledPin13, HIGH);
                         break;

                  case 's':
                         // led is OFF
                         digitalWrite(ledPin13, LOW);
                         break;


            }
      }
}

Per quanto riguarda la questione di usare stringhe nei case dello switch non è possibile. I case possono riferirsi solo a tipi primitivi (int, char, double, long,…).
Per confrontare due oggetti di tipo String puoi usare il metodo: equals().
In tal caso dovresti usare degli if, ad esempio, invece del costrutto switch e verificare le condizioni (con equals()) solo dopo aver letto una stringa intera dalla seriale.

ah...ok ho capito, non riusciresti a farmi un piccolo esempio di come usare equals per il mio scopo? grazie mille

Certo ;) anche se non lo testo... quindi attenzione :)

Supposto che hai due stringhe chiamate str1 ed str2 che vuoi confrontare... questa porzione di codice "stampa su serial" il risultato del confronto (tralasciando le inizializzazioni...):

...
if (str1.equals(str2))
 Serial.println("uguali");
else
 Serial.println("diverse");
...

In alternativa puoi usare anche l'operatore == che produce lo stesso risultato:

...
if (str1 == str2)
 Serial.println("uguali");
else
 Serial.println("diverse");
...

Per quanto riguarda il tuo codice potresti fare qualcosa del genere:

#define BAUD_RATE 9600
#define ledPin13    13

char   incomingChar;             //Carattere letto appena disponibile su serial
String incomingString;           //Stringa rappresentante il "comando"

void setup(){

      pinMode(ledPin13, OUTPUT);

      // serial communication
      Serial.begin(BAUD_RATE);
}

void loop(){

      if (Serial.available() > 0){
           incomingChar = Serial.read();          //Lettura di un carattere
         incomingString += incomingChar;     //Aggiunge il carattere alla stringa
      }
      
      if (incomingChar == '\0'){                           //Se è stata letta una stringa intera ('\0' è il carattere di fine stringa)...
         if (incomingString.equals("acceso")                 //Se la stringa ricevuta è "acceso"...
            digitalWrite(ledPin13, HIGH);                       //Accende il led
         else
            if (incomingString.equals("spento")           //Se la stringa ricevuta è "spento"...
              digitalWrite(ledPin13, LOW);                  //Spegne il led
          incomingString = "";                            //Qualsiasi era la stringa l'"azzera" per riceverne una nuova
      }
}

Bisognerebbe vedere come invii la stringa ad Arduino... solitamente le stringhe terminano con il carattere '\0' ma poichè invii un carattere alla volta potresti terminare le stringhe con un altro carattere; ad esempio potresti usare il carattere di "a capo": '\n'. Ovviamente è da testare :)

Ah volevo giusto aggiungere che puoi comunque provare il codice del secondo post che dovrebbe essere ok... In quel caso però il comando che invii e che viene interpretato è un carattere e non una stringa. In particolare, quando invii 'a' si accende il led, quando invii 's' si spegne. Bye