Comunicaione seriale

Salve dopo aver scritto il seguente sketch mi salta fuori un problema a cui non trovo l’errore…
ho due casi:
nel primo caso mi stampa i valori a tutti e due i servo (mentre io ne volevo utillizare uno per ogni CASE nello sketch), mentre nel secondo fa ciò che voglio ovvero stampare valori a un servo solo…non capisco dove sia l’errore :-\ qualcuno può aiutarmi?
Grazie!

void loop() {
 if (digitalRead(blu)==HIGH){
  delay(100);
  valore++;
  Serial.print("Caso:" );
  Serial.println(valore);
  if (valore==3){
    valore=0;
  }
 }
switch(valore){
  case 1:
  if(digitalRead(giallo)==HIGH){
    delay(10);
    angolo++;
    Serial.print("angolo 1 valore: ");
    Serial.println(angolo);
    servo1.write(angolo);
    }if(digitalRead(rosso)==HIGH){
    delay(10);
    angolo--;
    Serial.print("angolo 2 valore: ");
    Serial.println(angolo);
    servo1.write(angolo);
    break;
}

case 2:
if(digitalRead(giallo)==HIGH){
    delay(10);
    angolo2++;
      Serial.print("angolo 3 valore: ");
    Serial.println(angolo2);
    servo2.write(angolo2);
    }if(digitalRead(rosso)==HIGH){
    delay(10);
    angolo2--;
    Serial.print("angolo 4 valore: ");
    Serial.println(angolo2);
    servo2.write(angolo2);
    break;
    
    }
}
}

Potrebbe darsi che la pausa che metti dopo la pressione del pulsante blu

if (digitalRead(blu)==HIGH){
delay(100);

Non sia sufficiente a farti sollevare il dito e dare un unico impulso, POTREBBE, funzionare cosi tu premi il pulsante incrementi la variabile valore++ ed esegue il movimento del servo, ma avendo ancora il pulsante premuto la variabile valore++ incrementa di nuovo e esegue il movimento dell’altro servo.

Siccome il movimento del servo è indipendente, non esiste nessuna pausa nel codice richiamando il metodo

Servo.write(valore), avviene tutto estremamente rapidamente, in millesimi di secondo.

Se la mia ipotesi è giusta, usa un delay(300);

Poi sarebbe bene incrementare la variabile angolo fuori dallo switch,

togli le letture pulsante all’interno dello switch() e nel loop metti.

if(digitalRead(giallo)==HIGH)
angolo++;
else if(digitalRead(rosso)==HIGH)
angolo–;

if(angolo<0) angolo=0;
delay(200);// o la pausa minore se vuoi un incremento veloce e continuo

Ti ringrazio per la risposta, dunque nel CASE 1 e 2 ci entro senza problemi anche con 100 di delay...ho provato come mi avevi detto tu a impostare 300, e faceva la stessa identica cosa. invece con i due pulsanti impostati nel ciclo loop funziona solamente che se ritorno a un CASE precedente il servo mi acquista il valore del servo a cui ho appena dato l'angolo, per via che angolo++ è fuori dal case e di conseguenza me lo aumenta anche all'altro servo..un'altra cosa non so se hai notato, ma la variabile valore l'ho usata per entrare nel ciclo SWITCH, mentre per muovere i servo ho usato la variabile angolo/angolo2! per questo mi sembrava più opportune inserire i due pulsanti nel ciclo SWITCH

se usi due variabili angolo1 e angolo2, metti due controlli nel loop

Forse dovresti usare un altro pulsante, in modo simile al pulsante blu, ma che serve per decidere selezionare se incrementare la variabile angolo1 o angolo2

Esempio

int  SelettoreAngolo=1;

void loop()
{   
        
  
        if (digitalRead(blu)==HIGH){
  
                valore++;
                Serial.print("Caso:" );
                Serial.println(valore);
                if (valore==3){
                valore=0;
         }//end if


         if(digitalRead(ALTROPULSANTE)==HIGH){
         
                  SelettoreAngolo++
                  if(SelettoreAngolo>2)SelettoreAngolo=1;

         }end if
 
         if(digitalRead(giallo)==HIGH && SelettoreAngolo==1)
                angolo1++;
         else if(digitalRead(giallo)==HIGH  && SelettoreAngolo==2)
                 angolo2++;
         if(digitalRead(rosso)==HIGH && SelettoreAngolo==1)
                angolo1--;
         else if(digitalRead(rosso)==HIGH  && SelettoreAngolo==2)
                 angolo2--;

         if(angolo1<0) angolo1=0;
         if(angolo2<0) angolo2=0;

   

}//end loop()