Problemi con if e else

Buongiorno a tutti, dopo molto tempo passato tra varie vicende ho di nuovo finalmente tempo di tornare su questo meraviglioso forum con altre domande. Nello specifico questa volta ho un problema con le istruzioni if, else. Per un progetto (cnc), ho necessità di accendere e spegnere 3 relè che comandano la lampada di segnalazione (funzionante a 24 vdc). Ho scritto un semplice programma che, in base alla lettura di 3 pin analogici trasformati in digitali accende e spegne i corrispondenti relè (pin 14 high= relè 1 high e cosi via...) e scrive su un display a 7 segmenti quale uscita è attiva. Il problema è che le uscite non funzionano. Anche se non collego nulla ai pin di rilevamento (14, 15, 16) le uscite rimangono attive e il display impazzisce. Ho pensato ad un errore hardware sulla schedina costruita, ma se uplodo questo codice
centralina_comando_lampada_sicurezza_cnc_test_3.ino (5.5 KB)
funziona tutto perfettamente (questo codice è senza if, else, era solo una prova per verificare l'effettivo funzionamento hardware).
mentre se uplodo questo: (che è quello che effettivamente devo usare);
centralina_comando_lampada_sicurezza_cnc.ino (4.6 KB)
non funziona più nulla e sul void loop va in crash :rage:
Questa è la foto della scheda (uso un arduino nano):


Ringrazio anticipatamente chiunque vorrà aiutarmi (ci sto uscendo pazzo oramai :grin:), e vi auguro buona giornata.

if (letturastatoa == HIGH) {
    (rele1, HIGH);  **questo non fa niente, deve essere digitalWrite(rele1,HIGH); cosi per tutti gli if**
    richiamofunzione1();
  }
  else {
    (rele1, LOW);
    richiamofunzione0();}
    
  if (letturastatoa == HIGH) {
    (rele2, HIGH);
    richiamofunzione1();
  }
  else {
    (rele2, LOW);
    richiamofunzione0();}
    
  if (letturastatoa == HIGH) {
    (rele3, HIGH);
    richiamofunzione1();
  }
  else {
    (rele3, LOW);
    richiamofunzione0();}

Allora, innanzitutto grazie per l’aiuto, ho inserito i digitalWrite come andavano messi, ed effettivamente qualcosa è cambiato, ma in peggio :face_with_raised_eyebrow: . Ebbene, la prima uscita ora funziona bene e il rele scatta, ma le istruzioni a partire dal secondo if non vengono eseguite (non scattano i rele 2 e 3 se i rispettivi pin di 15, e 16 sono allo stato high). Forse non posso mettere più if in serie? Non credo però a sto punto non so che pensare. Grazie per l’aiuto.

Tutti e tre gli if testano la stessa variabile 'letturastatoa', mi aspetto quindi che i relé si comportino uguali in base alla lettura dell'ingresso 'letturastato1'.

come detto da claudio, valuti una sola variabile, ma leggi tre pin.
Allora metti in ciascun if la giusta variabile...

Allora, ho inserito le variabili nel modo corretto, ma per qualche motivo a me ignoto, ora le uscite non funzionano più proprio del tutto, e il rele numero 1 vibra (si accende e spegne molto velocemente e senza comandi), il display visualizza solo 0 e a volte 1. Posto il codice corretto. Ma la vera domanda è: perchè con un if funziona, mentre con 3 no? Boh :roll_eyes: Intanto grazie dell'aiuto.
centralina_comando_lampada_sicurezza_cnc.ino (4.6 KB)

Hai messo le resistenze di pull-down sugli ingressi? Se no, è normale che leggano random quando non collegati a niente (questo spiega il relé che vibra).

Hai messo i diodi anti extratensione sulle bobine dei relé? Se no è possibile che due transistor siano bruciati, facile verificarlo: togli Arduino e comandi le resistenze di base manualmente, se i relé non scattano o sono sbagliati i collegamenti, o sono bruciati i transistor.

Per quanto riguarda il display è normale che se ad ogni ciclo di programma chiami più volte le funzioni 1 e 0 vedi tutto sovrapposto. La logica di gestione del display sarà da ripensare in funzione di tre ingressi e non più uno solo.

Che pirla che sono :upside_down_face: , ecco cosa dimenticavo, le resistenze di pull down. Infatti ho messo quelle e magicamente funziona senza impazzire o fare cose strane. Si i diodi ai rele ci sono. Grazie mille :smiley: Ora però devo sistemare il problema del display che non fa quello che dico io, ovvero segnalare quale uscita è attiva. Per ovviare al problema delle variabili che si sovrappongono (quella dello zero), pensavo di creare 3 variabili di nomi diversi, che generino lo zero, in modo da evitare conflitti. Può funzionare o sto sparando min… ci siamo capiti :grinning_face_with_smiling_eyes:

Buonasera a tutti, ora che i rele funzionano come devono sto sistemando il problema del display che sovrappone i numeri. Ho risolto per il rele 1 e 2 con un'altra variabile a porta and, in modo che lo zero non sovrapponga i caratteri. Ecco lo sketch modificato: centralina_comando_lampada_sicurezza_cnc.ino (4.8 KB)
Però cè un problema con la porta 3. Nella variabile and ho inserito le porte 1 e 2 e quelle funzionano, ma quando inserisco la porta 3 da errore di compilazione, da qui mi nasce la domanda: non si possono fare porte logiche a più di 2 variabili? Comunque grazie per l'aiuto finora dimostratomi, se non era per voi a quest'ora sarei ancora dietro a capire il problema del circuito :laughing: Buona serata.

Puoi scrivere espressioni logiche arbitrariamente complesse, perciò deve esserci un banale errore di sintassi.

Confermo che era banalmente un piccolo errore di scrittura. Ora il progetto funziona e il codice è completo, per correttezza lo allego (magari potrà tornare utile a qualcuno). centralina_comando_lampada_sicurezza_cnc.ino (4.8 KB)
Ringrazio tutti coloro che mi hanno aiutato e vi auguro buona serata. Ancora grazie :smiley: