ciclo if che si interrompe in switch/case

Buongiorno, volevo approfondire il discorso dei cicli.
Per la mia conoscenza il ciclo IF, inizia e arriva sempre al termine se una determinata condizione si avvera.
Nel realizzare un programma con SWITCH, nei vari casi ho inserito dei if che hanno una serie di comandi per accendere e spegnere qualcosa attraverso dei relè. Ho un comportamento anomalo che accade casualmente dove il ciclo IF non viene completato rispettando la sequenza DigitalWrite(RELE,HIGH/LOW);e piccoli delay(es. 100/600/60). I vari casi sono identici, variano solo i relè/pin collegati.
La domande sono:
è possibile uscire dal ciclo IF prima che questo termini (ELSE non presente)?
è possibile che in switch un CASE si interrompa prima dell'istruzione BREAK?
Grazie in anticipo.

Comincia a postare il programma, clsì si vede.
Se non lo hai ancora fatto presentati sul topic corretto.
Poi per interrompere qualunque cosa c'é la "funzione" (é una funzione anche se non richiede le tonde?) return, e nulla ti vieta di mettere più break in giro (differenza: break fa uscire dal blocco di codice in cui é ma non dalla funzione, return fa uscire direttamente dalla funzione)
If non é un ciclo

nel caso 3 ogni 4-6 volte si blocca dopo digitalWrite(motorcart,HIGH); e mi esce dal caso specifico, ritornando al caso 0(standard), nel caso 2 succede molto meno spesso.
questo:

p1=digitalRead(puls1);
p2=digitalRead(puls2);
p3=digitalRead(puls3);
p4=digitalRead(puls4);
srot=digitalRead(sensrot);
 
  if (p1==HIGH) {
  puls=1;   Serial.println("premuto1");    
  }  
  else   { 
  if (p2==HIGH) {
  puls=2;   Serial.println("premuto2");   
  }
  else   { 
  if (p3==HIGH) {
  puls=3;   Serial.println("premuto3");       
  }
  else   { 
  if (p4==HIGH) {
  puls=4;   Serial.println("premuto4");      
  }
  }                                 
  if (srot==0){ 
  puls=5; // delay(10);   
  }
  else {
    srot=1; // delay(10);
  }

  if ((p1==LOW)&&(p2==LOW)&&(p3==LOW)&&(p4==LOW)&&(srot==1)){ //&&(scart==1)) {
  (puls=0); }
  }
  }

switch(puls){
  case 0:
     g1 = digitalRead(gal1);
     if (digitalRead(gal1) == HIGH) {

          digitalWrite(ledV1, HIGH);
          digitalWrite(ledR1, LOW);
                                    
     g1=0;
                                   
     }
     else {
     digitalWrite(ledV1, LOW);
     digitalWrite(ledR1, HIGH);
     g1=1;
     }

     g2 = digitalRead(gal2);
     if (digitalRead(gal2) == HIGH) {
     digitalWrite(ledV2, HIGH);
     digitalWrite(ledR2, LOW);
     g2=0;
     }
     else {
     digitalWrite(ledV2, LOW);
     digitalWrite(ledR2, HIGH);
     g2=1;
     }

     g3 = digitalRead(gal3);
     if (digitalRead(gal3) == HIGH) {
     digitalWrite(ledV3, HIGH);
     digitalWrite(ledR3, LOW);
     g3=0;
     }
     else {
     digitalWrite(ledV3, LOW);
     digitalWrite(ledR3, HIGH);
     g3=1;
     }

    digitalWrite(ledV4, HIGH);
    digitalWrite(motortagl, LOW);
    digitalWrite(motorcart, LOW);
    digitalWrite(pomp1, LOW);
    digitalWrite(pomp2, LOW);
    digitalWrite(pomp3, LOW);
    
  delay(5);
   
  break;

  case 1: 
  g1 = digitalRead(gal1);
       if ((digitalRead(gal1) == HIGH)&&(monetaok==0)) {
       digitalWrite(motorcart,HIGH);
       delay(60);
       digitalWrite(pomp1,HIGH);
       delay(500);
       digitalWrite(pomp1,LOW);
       delay(60);
       digitalWrite(motorcart,LOW);
       delay(100);
       taglierina();
       g1=0;
       digitalWrite(getinib,LOW);  
       delay(30);
       }

  break;
  
   case 2: 
  g2 = digitalRead(gal2);
       if ((digitalRead(gal2) == HIGH)&&(monetaok==0)) {
       digitalWrite(motorcart,HIGH); // Accende motore carta
       delay(60);
       digitalWrite(pomp2,HIGH);// Poi spritz
       delay(500);
       digitalWrite(pomp2,LOW);// Ferma Spritz
       delay(60);
       digitalWrite(motorcart,LOW);// Ferma carta
       delay(100);
       taglierina();
       g2=0;
       digitalWrite(getinib,LOW);  
       delay(30);
       }

  break;
  
  case 3:
  g3 = digitalRead(gal3);
       if ((digitalRead(gal3) == HIGH)&&(monetaok==0)) {
       digitalWrite(motorcart,HIGH); 
       delay(60);
       digitalWrite(pomp3,HIGH);
       delay(500);
       digitalWrite(pomp3,LOW);
       delay(60);
       digitalWrite(motorcart,LOW);
       delay(100);
       taglierina();
       g3=0;
       digitalWrite(getinib,LOW);  
       delay(30);
       }

  break;
  
  case 4:
       if (monetaok==0) {
       digitalWrite(motorcart,HIGH); 
       delay(620);
       digitalWrite(motorcart,LOW);
       delay(100);
       taglierina();
       digitalWrite(getinib,LOW);  
       delay(30);
       }
  break;

  case 5: 
     if (srot==1) {
      monetaok=1;
      }
     else { 
      int blok=1;
      if (srot==0) { blok=0;}
 while (blok==0){
       digitalWrite(getinib,HIGH);
       delay(700);
       Serial.println("ALLARME");
       digitalWrite(baz,LOW);
       digitalWrite (ledV1, LOW);
       digitalWrite (ledV2, LOW);
       digitalWrite (ledV3, LOW);
       digitalWrite (ledV4, LOW);
       digitalWrite (ledR1, HIGH);
       digitalWrite (ledR2, HIGH);
       digitalWrite (ledR3, HIGH);
       digitalWrite (ledR4, HIGH);
       delay(2000);
       digitalWrite(baz,HIGH);
       digitalWrite (ledV1, HIGH);
       digitalWrite (ledV2, HIGH);
       digitalWrite (ledV3, HIGH);
       digitalWrite (ledV4, HIGH);
       digitalWrite (ledR1, LOW);
       digitalWrite (ledR2, LOW);
       digitalWrite (ledR3, LOW);
       digitalWrite (ledR4, LOW);
       delay(200);
       blok=1;

       } 
     }
 
  break;

}      
int conta=1; 
if (digitalRead(getto>100)){conta=0;}
  digitalWrite(coin,LOW); 
 if (conta==0){
  digitalWrite(coin,HIGH);
  delay(50);}
  else { digitalWrite(coin,LOW);}
}

void taglierina(){

       while (digitalRead(stag)==LOW){
       digitalWrite(motortagl,HIGH);}
       digitalWrite(motortagl,LOW);
       delay(10);
       monetaok = 1;
      }

Leggi le quattro frasi che ho nella mia firma? Applica la seconda e riposta il codice

Inoltre, qualche consiglio

  1. praticamente devi dare un numero da 1 a 4 ad una variabile a seconda di quale pulsante é premuto
    Metti i pulsanti in un array pulsanti[4]
    Il tutto diventa (scritto da scocciofono)
var=0
for (byte i=0;i<4;i++)
{
if (digitalRead (pulsanti[i]))
{
var=++i;
break;
}
}
  1. ecco la seconda parte accorciata
if (!srot) var=5;
else srot=1;
  1. così facendo l'if lungo lo puoi cancellare. Il resto lo guarderò quando avrai formattato

meglio ragionare su tutto il codice, questo è tutto...

int getto;//analog version 11; // getto digital
int mok = 1;
//int scart = 1; //valsenscart non in uso
int srot = 1; //valsenrot 
int g1 = 1; //valgal1
int g2 = 1; //valgal2
int g3 = 1; //valgal3
int puls = 0;
int p1 = 0; //ve
int p2 = 0; //cru
int p3 = 0; //fas
int p4 = 0; //s ca
int taglio = 1;
//int valtg=1;

void setup() {
  delay (100);
  Serial.begin(9600);
  delay (500);
  pinMode (stag, INPUT);
  //pinMode (getto, INPUT); digital version, non necessario nella versione analogica
  pinMode (getinib, OUTPUT);
  pinMode (baz, OUTPUT);
  pinMode (sensrot, INPUT);
  pinMode (senscart, INPUT);
  pinMode (gal1, INPUT);
  pinMode (gal2, INPUT);
  pinMode (gal3, INPUT);
  pinMode (puls1, INPUT);
  pinMode (puls2, INPUT);
  pinMode (puls3, INPUT);
  pinMode (puls4, INPUT);
  pinMode (motorcart, OUTPUT);
  pinMode (motortagl, OUTPUT);
  pinMode (pomp1, OUTPUT);
  pinMode (pomp2, OUTPUT);
  pinMode (pomp3, OUTPUT);
  pinMode (ledV1, OUTPUT);
  pinMode (ledV2, OUTPUT);
  pinMode (ledV3, OUTPUT);
  pinMode (ledV4, OUTPUT);
  pinMode (ledR1, OUTPUT);
  pinMode (ledR2, OUTPUT);
  pinMode (ledR3, OUTPUT);
  pinMode (ledR4, OUTPUT);

  //digitalWrite (baz, LOW); analog version????
  digitalWrite (stag, HIGH);//attiva resistenza pull-up
  digitalWrite (puls1, HIGH);//attiva resistenza pull-up
  digitalWrite (puls2, HIGH);//attiva resistenza pull-up
  digitalWrite (puls3, HIGH);//attiva resistenza pull-up
  digitalWrite (puls4, HIGH);//attiva resistenza pull-up
  //digitalWrite(getto, HIGH);//attiva resistenza pull-up
  //  digitalWrite(sensrot, HIGH);//attiva resistenza pull-up
  digitalWrite(senscart, HIGH);//attiva resistenza pull-up
  digitalWrite(gal1, HIGH); //attiva resistenza pull-up
  digitalWrite(gal2, HIGH); //attiva resistenza pull-up
  digitalWrite(gal3, HIGH); //attiva resistenza pull-up
  //  digitalWrite(pomp1, HIGH); //attiva resistenza pull-up
  //  digitalWrite(pomp2, HIGH); //attiva resistenza pull-up
  //  digitalWrite(pomp3, HIGH); //attiva resistenza pull-up
  delay(100);

}
void loop() {
  delay(5);
  digitalWrite(ledV4, HIGH);
  digitalWrite(motortagl, LOW);
  digitalWrite(motorcart, LOW);
  digitalWrite(pomp1, LOW);
  digitalWrite(pomp2, LOW);
  digitalWrite(pomp3, LOW);

  // analog version valore ad alto >130
  // if (digitalRead(getto) == HIGH) { mok = 0; } digital version, omesso se pin analogico
  getto = analogRead(A10);
  // Serial.print("valore "); Serial.println(getto);
  // delay(10);
  if (getto > 100) {
    mok = 0;
  } //if (digitalRead(getto==HIGH)){mok=0} digital version
  digitalWrite(getinib, LOW);   //Serial.print("valore ");Serial.println(getto);
  if (mok == 0) {
    digitalWrite (getinib, HIGH); 
  }
  else
  {
    digitalWrite(getinib, LOW);
  }
  //Serial.println(mok);
  p1 = digitalRead(puls1);
  p2 = digitalRead(puls2);
  p3 = digitalRead(puls3);
  p4 = digitalRead(puls4);
  srot = digitalRead(sensrot);
// ***** per silente ***** non credo di aver interpretato bene!!
//    for (byte i = 0; i < 4; i++)  {
//    if (digitalRead (puls1)) 
//      {puls = ++i;
//      break;
//    }
//    if (digitalRead (puls2)) 
//      {puls = ++i;
//      break;
//    }
//    if (digitalRead (puls3)) 
//      {puls = ++i;
//      break;
//    }
//    if (digitalRead (puls4)) 
//      {puls = ++i;
//      break;
//    }
//    }
//  if (!srot) {puls = 5;}
//  else {srot = 1;}

    if (p1==HIGH) {
    puls=1;   Serial.println("premuto1");    //delay(30);
    }
    else   {
    if (p2==HIGH) {
    puls=2;   Serial.println("premuto2");    //delay(30);
    }
    else   {
    if (p3==HIGH) {
    puls=3;   Serial.println("premuto3");    //delay(30);
    }
    else   {
    if (p4==HIGH) {
    puls=4;   Serial.println("premuto4");    //delay(30);
    }
    }                                  //else   {
    if (srot==0){
    puls=5; // delay(10);
    }
    else {
      srot=1; // delay(10);
    }
  //  if (scart==0){puls=6;
  //  delay(100); }
  //  else {srot=1;}
  if ((p1 == LOW) && (p2 == LOW) && (p3 == LOW) && (p4 == LOW) && (srot == 1)) { //&&(scart==1)) {
    (puls = 0);
  }
}
}
// //}
// Serial.print(p1); Serial.println("è puls1 1");
// Serial.print(puls);Serial.println("caso");
delay(5);
switch (puls) {
case 0:
  g1 = digitalRead(gal1);
  //Serial.print("g1 "); Serial.println(g1);
  if (digitalRead(gal1) == HIGH) {
    digitalWrite(ledV1, HIGH);
    digitalWrite(ledR1, LOW);
    g1 = 0;

  }
  else {
    digitalWrite(ledV1, LOW);
    digitalWrite(ledR1, HIGH);
    g1 = 1;
  }

  g2 = digitalRead(gal2);
  //Serial.print("g2 "); Serial.println(g2);
  if (digitalRead(gal2) == HIGH) {
    digitalWrite(ledV2, HIGH);
    digitalWrite(ledR2, LOW);
    g2 = 0;
  }
  else {
    digitalWrite(ledV2, LOW);
    digitalWrite(ledR2, HIGH);
    g2 = 1;
  }

  g3 = digitalRead(gal3);
  if (digitalRead(gal3) == HIGH) {
    digitalWrite(ledV3, HIGH);
    digitalWrite(ledR3, LOW);
    g3 = 0;
  }
  else {
    digitalWrite(ledV3, LOW);
    digitalWrite(ledR3, HIGH);
    g3 = 1;
  }

  digitalWrite(ledV4, HIGH);
  digitalWrite(motortagl, LOW);
  digitalWrite(motorcart, LOW);
  digitalWrite(pomp1, LOW);
  digitalWrite(pomp2, LOW);
  digitalWrite(pomp3, LOW);
  //Serial.println("caso0");
  //delay(1000);
  delay(5);
  //Serial.print(puls);Serial.println(" caso");

  break;

case 1:
  g1 = digitalRead(gal1);
  if ((digitalRead(gal1) == HIGH) && (mok == 0)) {
    digitalWrite(motorcart, HIGH); // Accende motore carta
    delay(60);
    digitalWrite(pomp1, HIGH); // Poi spritz
    delay(500);
    digitalWrite(pomp1, LOW); // Ferma Spritz
    delay(60);
    digitalWrite(motorcart, LOW); // Ferma carta
    delay(5);
    tag();
    g1 = 0;
    mok = 1;
    digitalWrite(getinib, LOW);
    delay(30);
  }
  break;

case 2:
  g2 = digitalRead(gal2);
  if ((digitalRead(gal2) == HIGH) && (mok == 0)) {
    digitalWrite(motorcart, HIGH); // Accende motore carta
    delay(60);
    digitalWrite(pomp2, HIGH); // Poi spritz
    delay(500);
    digitalWrite(pomp2, LOW); // Ferma Spritz
    delay(60);
    digitalWrite(motorcart, LOW); // Ferma carta
    delay(100);
    tag();
    g2 = 0;
    mok = 1;
    digitalWrite(getinib, LOW);
    delay(30);
  }
  break;

case 3:
  g3 = digitalRead(gal3);
  if ((digitalRead(gal3) == HIGH) && (mok == 0)) {
    digitalWrite(motorcart, HIGH); // Accende motore carta
    delay(60);
    digitalWrite(pomp3, HIGH); // Poi spritz
    delay(500);
    digitalWrite(pomp3, LOW); // Ferma Spritz
    delay(60);
    digitalWrite(motorcart, LOW); // Ferma carta
    delay(100);
    tag();
    g3 = 0;
    mok = 1;
    digitalWrite(getinib, LOW);
    delay(30);
  }
  break;

case 4:
  if (mok == 0) {
    digitalWrite(motorcart, HIGH); // Accende motore carta
    delay(620);
    digitalWrite(motorcart, LOW); // Ferma carta
    delay(100);
    tag();
    mok = 1;
    digitalWrite(getinib, LOW);
    delay(30);
  }
  break;

case 5: //carta non presente
  if (srot == 1) {
    mok = 1;
  }
  else {
    int blok = 1;
    if (srot == 0) {
      blok = 0;
    }
    //else { blok=1;}
    while (blok == 0) {
      digitalWrite(getinib, HIGH);
      delay(700);
      Serial.println("ALLARME");
      digitalWrite(baz, LOW);
      digitalWrite (ledV1, LOW);
      digitalWrite (ledV2, LOW);
      digitalWrite (ledV3, LOW);
      digitalWrite (ledV4, LOW);
      digitalWrite (ledR1, HIGH);
      digitalWrite (ledR2, HIGH);
      digitalWrite (ledR3, HIGH);
      digitalWrite (ledR4, HIGH);
      delay(2000);
      digitalWrite(baz, HIGH);
      digitalWrite (ledV1, HIGH);
      digitalWrite (ledV2, HIGH);
      digitalWrite (ledV3, HIGH);
      digitalWrite (ledV4, HIGH);
      digitalWrite (ledR1, LOW);
      digitalWrite (ledR2, LOW);
      digitalWrite (ledR3, LOW);
      digitalWrite (ledR4, LOW);
      delay(200);
      blok = 1;
    } 
  }

  break;

}
int conta = 1; // conta operazioni analogico
if (digitalRead(getto > 100)) {
  conta = 0;
}
digitalWrite(coin, LOW); //fissa stato "non conto"
if (conta == 0) {
  digitalWrite(coin, HIGH); //conta "+ 1"
  Serial.print(conta); Serial.println("scono su conta");
  delay(50);
}
else {
  digitalWrite(coin, LOW); //resta "non conto"
}
}

void tag() {

  while (digitalRead(stag) == LOW) {
    digitalWrite(motortagl, HIGH);
  }
  digitalWrite(motortagl, LOW);
  delay(10);

  Serial.println("end tag");
}

ltsrl:
nel caso 3 ogni 4-6 volte si blocca dopo digitalWrite(motorcart,HIGH); e mi esce dal caso specifico, ritornando al caso 0(standard), nel caso 2 succede molto meno spesso

Sentito così mi sembra un reset dovuto a disturbi elettrici del relé motore carta... (che nel caso 3 viene spento e acceso una volta di più del caso 2. A che serve il "ferma carta" seguito immediatamente dopo da "accende motore carta"? Meccanicamente in quei 5µs il relé non fa in tempo a commutare, mentre elettricamente si creano 5µs di picco di assorbimento sull'alimentazione. Noi ovviamente non sappiamo nulla di come è cablato "geometricamente" il tutto, ma se ad esempio le correnti di ritorno dell'alimentazione dei relé passassero attraverso Arduino sarebbe davvero no buono...

Buongiorno, volevo approfondire il discorso dei cicli.

Cioè le strutture di controllo che permettono di ripetere più volte delle istruzioni.

Per la mia conoscenza il ciclo IF

Ma IF non ripete nulla, effettua solo una scelta.

è possibile uscire dal ciclo IF prima che questo termini (ELSE non presente)?

Normalmente da un ramo IF non si può uscire, ma se l'IF si trova all'interno di un'altra struttura che ammette la terminazione con break o return, allora con queste può essere interrotto (ma l'interruzione si riferisce alla struttura esterna)

è possibile che in switch un CASE si interrompa prima dell'istruzione BREAK?

Anche qui no, a meno che il case non sia contenuto in una funzione e allora si può interrompere con return (si interrompe la funzione in cui lo switch/case è contenuto).

Grazie... SILENTE, CLAUDIO_FF e chiunque intenda aiutarmi.
Claudio, in effetti c'è stato un errore di copia incolla, pertanto ho corretto il codice postato in precedenza per evitare errori.
Hai ragione Claudio IF non è un CICLO!!!
IF è un'istruzione di controllo che esegue qualcosa SE una condizione (controllata/esaminata) è soddisfatta.
Quando questo accade, l'istruzione fa partire il codice nelle nelle parentesi graffe.
CLAUDIO
Hai risposto alle mie domande :o ,GRAZIE.

Ora, analizzando il problema, alcuni CASE (2 e 3 in particolare) a volte escono qui
es.

case 3:
  g3 = digitalRead(gal3);
  if ((digitalRead(gal3) == HIGH) && (mok == 0)) {
    digitalWrite(motorcart, HIGH); // Accende motore carta
    delay(60);

altre volte prima del delay, cioè si sente il motore che becca l'impulso, ma si muove meno dei 0,060 secondi.
Se fosse un problema elettrico, dovrei attendere un tempo di circa 2 secondi (incluso VOID TAG), invece esce subito (posso capirlo cronometrandolo con gli altri casi).
Ho pensato che la variabile Gx avesse colpa (qualche interferenza), ma durante il CASEx la faccio cambiare con un'operazione manuale, ma non fa accadere nulla.
In oltre noto che all'uscita dal CASE cioè dopo il BREAK, c'è un tempo di circa 2 secondi in cui i 4 led si spengono tutti (verdi e rossi) dopo di che si accende il LEDV4 e poi gli altri 3 (verde o rosso che sia).
Che ne pensate? (ps. la scheda 8relè è alimentata a parte con un alimentatore 5v e le masse non sono in comune in alimentazione, perché alla partenza della macchina, per un attimo, tutti i relè andavano alti.)
GRAZIE in anticipo.)

Il tuo provlema é quindi inverso, non vuoi sapere come fermare uno switch case prima del break, ma vuoi sapere perché questo avviene, e come impedirlo.
Il problema non può essere di codice, perché, senza un break, un return o un goto (da NON USARE MAI, ma mi pareva giusto citarlo) uno switch case non dovrebbe terminare. Il problema deve essere quindi hardware, ma scoprire quale esula dalle mie capacità attuali

Esatto SILENTE! Il punto è fare un debug che dia risposte.
E' sicuro che il programma, quando succede l'anomalia, si interrompe. Questo posso affermarlo perché si interrompe il "motore carta" CIOè SI SPEGNE, qui

case 3:
  g3 = digitalRead(gal3);
  if ((digitalRead(gal3) == HIGH) && (mok == 0)) {
    digitalWrite(motorcart, HIGH); // Accende motore carta

e poi salta direttamente alle variabili

g3 = 0;
    mok = 1;
    digitalWrite(getinib, LOW);
    delay(30);
  }
  break;

infatti la macchina ritorna nel CASE 0, posso affermarlo perché ho messo dei Serial.print per conosce il CASE in cui si trova la macchina.
Poi però ho un altro dubbio, è possibile che ARDUINO si resetti?
Lo dico perchè il tempo successivo a ogni CASE e di circa 2 secondi, in cui si spengono tutti i led. Se resetto la macchina accade la stessa cosa, cioè ci vogliono circa 2 secondi prima che i led si accendano.
Come posso verificare questa cosa? Arduino sulla seriale mi potrebbe inviare qualche messaggio se avviene un reset? Avete altri consigli?

Guardando qui Problema reset Arduino Mega + schede relé 8ch - Generale - Arduino Forum abbiamo risolto il problema del reset della scheda arduino, cioè aggiungendo un diodo 1N4007 al rele del contapezzi elettromeccanico.
Quindi sono molto contento, però il problema resta comunque, anche se non si resetta più la scheda.
Sto facendo indagini dal punto di vista elettrico.
Avete qualche consiglio? devo aggiungere altri componenti alla scheda rele? come posso individuare il problema all'uscita dei rele?
Grazie.

Praticamente mi sono reso conto di avere un modulo rele di bassa qualità!!!
I rele sono collegati con n. 2 motorini dei tergicristalli e 3 motorini di piccola taglia tutti alimentati con alimentatore con trasformatore toroidale 18v, poi il comando a cui è collegato il contatore elettromeccanico.
Chi sarà il colpevole?
Devo aggiungere 1N4007 qua e la come se non ci fosse un domani?


questo è quello che possiedo.
Allego zoom.
Accetto consigli anche per acquistare una nuova scheda relé diciamo "fatta come si deve".
Grazie.

ltsrl:
abbiamo risolto il problema del reset della scheda arduino [...] però il problema resta comunque

Queste frasi sfidano il mio senso della logica :drooling_face:

Se il problema era il reset della scheda, e il reset è stato risolto, allora il problema è stato risolto, e se è stato risolto come può esserci comunque? Non è che si sta parlando di due cose diverse?

Se la sorgente dei disturbi è la scintillazione dei contatti dei relé allora:

Se vuoi eliminare le extratensioni di apertura sui carichi induttivi in corrente continua (motori, bobine ecc) va messo il diodo in antiparallelo a ciascun carico.

Se vuoi eliminare la scintillazione dei contatti striscianti dei motori DC va messo anche un condensatore da almeno 100nF in parallelo ai terminali del motore.

Se invece la sorgente dei disturbi riguarda la sezione di alimentazione della logica allora bisogna rivedere l'alimentazione e le masse.

Domanda importante: se sulle uscite dei relé non colleghi nulla, il problema si manifesta lo stesso?

CLAUDIO__FF grazie!, riguardo il reset RISOLTO, direi "un problema in meno" ma i CASE si interrompono ancora e in modo del tutto casuale. Nel frattempo ho anche sostituito la scheda arduino mega r3, perché non potevo usare la porta seriale.
Quando scollego motori sembra funzionare correttamente.
Domani proverò a seguire i tuoi consigli

Per come hai scritto il programma questo pezzo di codice:

  g3 = digitalRead(gal3);
 if ((digitalRead(gal3) == HIGH) && (mok == 0)) {

Lo puoi scrivere e migliorare cosi:

 g3 = digitalRead(gal3);
 if ((g3 == HIGH) && (mok == 0)) {

Altrimenti fai inutilmente due digitalRead su stesso pin (la funzione impiega un pò di tempo ogni volta)

ltsrl:
Come posso verificare questa cosa? Arduino sulla seriale mi potrebbe inviare qualche messaggio se avviene un reset?

Per capire se avvengono ancora reset, basta mettere un serial print nel void setup che viene eseguito una sola volta dopo il reset. O, ancora più efficace, se hai dei LED falli lampeggiare tutti alcune volte nel void setup così saprai se si è resettato o comunque che si sta avviando.