problemino con ciclo if

Salve ragazzi problema con il ciclo if. sostanzialmente devo far agire delle uscite dei rele solo se è soddisfatta una condizione ma succede che dopo il promo if (vero) lo sketch procede analizzando gli altri else e quindi non attiva correttamente l'uscita del primo if. come si puo' non far leggere al loop solo il primo if che diventa vero e non gli altri e nemmeno gli else??

void setup() {
  pinMode ( 2, INPUT_PULLUP ); //Pulsante salita P1
  pinMode ( 3, INPUT_PULLUP ); //Pulsante stazionamento P2
  pinMode ( 4, INPUT_PULLUP ); //Pulsante sblocco P3
  pinMode (5, INPUT_PULLUP ) ; // Pulsante discesa P4
  pinMode (6, INPUT_PULLUP );// fotocellula FTC1
  pinMode (7, INPUT_PULLUP ); // finecorsa paratia sx FCP1
  pinMode (8, INPUT_PULLUP ); // finecorsa paratia dx FCP2
  pinMode (9, INPUT_PULLUP ); // finecorsa rifasamento sx FCR1
  pinMode (10, INPUT_PULLUP ); // finecorsa rifasamento dx FCR2
   pinMode (11, INPUT_PULLUP ); // pressostato alto PR1
   
  pinMode (14, OUTPUT ); // teleruttore salita K1
  pinMode (15, OUTPUT ); // ev aria EV2
   pinMode (16, OUTPUT ); // ev olio discesa EV3
    pinMode (17, OUTPUT ); // ev rifasamento EV4
     pinMode (18, OUTPUT ); // spia anomalia
     
digitalWrite(14, HIGH );
digitalWrite(15,HIGH);
digitalWrite(16, HIGH );
digitalWrite(17,HIGH);
digitalWrite(18,HIGH);

  
}

void loop() {
  // codice salita
  
  int p1 = digitalRead (2);
  if (( p1 == LOW  )&& (digitalRead(5)==HIGH)&& (digitalRead(10)==HIGH)&&(digitalRead(6)==HIGH)){
    delay (200);
    digitalWrite(14, LOW );//teleruttore
    digitalWrite(15, LOW); //valvola aria
    } 
    else {
    digitalWrite(14, HIGH );
    digitalWrite(15,HIGH);
    delay(200);
}

    
//codice discesa
  int p4= digitalRead (5);
  if (( p4 == LOW  )&& (digitalRead(7)==LOW)&& (digitalRead(8)==LOW)&&(digitalRead(6)==LOW))
  {
    delay (200);
    digitalWrite(15, LOW ); //aria
    digitalWrite(16, LOW);} // discesa olio
    else {
   digitalWrite(15, HIGH );
    digitalWrite(16,HIGH);
    delay(200);

    // codice rifasamento
    if ((digitalRead(3)==LOW) &&(digitalRead(6)==LOW) && (digitalRead(9)==LOW)&& (digitalRead(10)==LOW)){
      delay (200);
    digitalWrite(15, LOW ); //aria
    digitalWrite(16, LOW);} // discesa olio
    else {
    digitalWrite(15, HIGH );
    digitalWrite(16,HIGH);
    delay(200);
    }
    }
}

aggiungendo una flag e includendola come condizione nei vari if :)

per cui nel primo if in cui entra la flag viene settata ed esclude la possibilità di entrare negli altri (gli else ovviamente devono essere else if...)

così come li hai scritti tu... gli else sono sempre e tutti eseguibili quando la condizione dell'if risulta falsa

... oppure, semplicemente, NON usando gli else ;)

else e' "altrimenti" ... se valida la condizione, esegui i comandi nell'if, altrimenti esegui gli altri ... se invece ti limiti a fare una serie di if uno dietro l'altro senza usare l'else, ognuno degli if controllera' le proprie condizioni, se vere il contenuto verra' eseguito, se false verra' semplicemente ignorato ... ;)

Tento ti spiegartela meglio...in pratica no esegue gli else perche sta eseguendo gli if.

Inoltre a grandi linee mi sembra che il primo if lo esegue solo perche hai dichiarato i pin accesi nel setup.

E non hai neppure mai detto al pin(6) ad es. di essere low.

Quando si vogliono delle condizioni mutuamente esclusive (viene eseguita solo la prima trovata vera) si usa la forma:

if
else if
else if
else if
else

E if non è un ciclo, ma una ramificazione/selezione/decisione :roll_eyes:

Quello che intendevo io era un'altra cosa ... se usi "else", hai un certo tipo di funzionamento che non hai se non lo usi, e che puo essere utile, ma dipende dalle condizioni ... ad esempio ...

Se hai una variabile, chiamala A, che puo avere qualsiasi valore intero fra 0 e 10, e ti serve solo che se A assume uno o piu valori (diciamo ad esempio 3 e 5) l'if faccia una cosa, altrimenti faccia l'altra, con l'else e' semplice ... (pseudo-codice)

if a=3 oppure a=5
   fai questo
else
   fai quest'altro

una cosa cosi fara' "questo" solo se A diventa 3 oppure 5, e fara' "quest'altro" in tutti gli altri casi ... ma se ti serve che per diverse condizioni, mutualmente escludibili, vengano compiute diverse azioni, ALTRIMENTI non venga fatto nulla, l'else non ha molto senso ... ad esempio, metti di avere tre variabili, A, B e C, e di dover compiere alcune operazioni diverse, ma SOLO con determinate combinazioni delle tre variabili "true" (sempre ad esempio, "questo" se A e C true e b false, "quello" se solo C true con A e B false, "quest'altro" solo se A false indiferentemente da B e C ... in questo caso l'else non ha senso, e' molto piu semplice usare tre if uno dietro l'altro, indipendenti ...

if (A && !B && C)
   questo

if (!A && !B && C)
   quello

if (!A)
   quest'altro

Ecco, in un caso del genere, verrebbe di nuovo utile un'else SOLO se dopo aver eseguito il secondo if, si volesse EVITARE che il terzo venga anch'esso eseguito (perche' altrimenti, se e' vera la seconda condizione, e' automaticamente vera anche la terza, e verrebbero eseguite entrambe) ... cioe' se si volesse che la terza condizione venisse eseguita SOLO se NON viene eseguita la seconda ... in questo caso l'else puo venire utile per alzare o abbassare una flag che dica al terzo if che il secondo NON e' stato eseguito, tipo cosi ...

if (A && !B && C)
   questo

if (!A && !B && C)
   quello
   flag false
else
   flag true

if (!A && flag)
   quest'altro

In questo caso, la seconda condizione se viene eseguita mette una flag a 0, ALTRIMENTI la mette ad 1, cosi la terza NON viene eseguita se la seconda lo e' stata, e viene eseguita se non lo e' stata la seconda ... da notare che in quest'ultimo caso, si puo usare "else if (!A)" direttamente nella seconda if, per eseguire "quest'altro" se NON viene eseguito "quello" ed A e' comunque false ;)

Si tratta solo di decidere quale sia la forma migliore in base a quello che vuoi che faccia il programma ;)

grazie mille...procedo con la sperimentazione!

scusa ma per flag cosa intendi?

ais26: scusa ma per flag cosa intendi?

Una variabile segnalatrice di uno stato raggiunto:

https://it.wikipedia.org/wiki/Flag

ok ho provato a fare alcune modifiche e il compilatore mi da errore...ma non capisco allego la porzione incriminata

// codice salita
 int ftcrit;
 unsigned long previousMillis = 0; 
 const long interval = 1000; 
unsigned long currentMillis = millis();  

 if((salita=LOW)  &&  (ftc==LOW)){
  (currentMillis - previousMillis >= interval);
  ftcrit = 0;}
  else{
  ftcrit = 1;
 }
if (( salita == LOW  )&& (discesa == HIGH)&&  (paratiaSx == LOW) && (paratiaDx == LOW) && (pressostato == LOW) && (ftc == LOW || ftcrit = 0)){
  
    delay (200);
 condizione=1;

    }

Se non ci dici che errore ti da…
Comunque hai due errori nelle condizioni
Un singolo uguale è assegnazione
Test è due segni di uguale

l'errore è: value required as left operand of assignment

if ( ... ftcrit = 0 ...) if((salita=LOW)

Conosci la differenza di = e ==?

Sì Ma l'errore non è li L'assegnazione vale come test Chiaro che lo Opnon intendeva quello, ma li il compilatore non da errore Sembra che ci sia un'assegnazione mal scritta Anche questo pezzo è strano:

(currentMillis - previousMillis >= interval);

Una condizione terminata da un semicolon senza un test associato...