Problema con condizione multipla di IF - AIUTO !

Buona sera a tutti Signori.
Sto riscontrando un problema con il codice che vi linko qui sotto. Ho necessità di ricevere un messaggio nella comunicazione Seriale in base a quali LED ho accesi.

#define LED1 53               // LED1 collegato al pin digitale 53
#define LED2 51               // LED2 collegato al pin digitale 51  
#define LED3 49               // LED3 collegato al pin digitale 49
#define BUTTON 7              // pin di input dove è collegato il pulsante  
int  val = 0;                 // si userà val per conservare lo stato del pin di input

void setup() {
  Serial.begin(9600);          //inizializza la porta seriale
  pinMode(LED1, OUTPUT);       // imposta il pin digitale come output
  pinMode(LED2, OUTPUT);       // imposta il pin digitale come output
  pinMode(LED3, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
  pinMode(LED2,HIGH);
  pinMode(LED1,HIGH);
  pinMode(LED3, LOW);
}

void loop() {
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva


  if ((val) == HIGH && digitalRead(LED1) == HIGH && digitalRead(LED2) == LOW  && digitalRead(LED3) == LOW) {
    Serial.println("aiuto1");    //scrive l'aiuto 1
   
 
  }
  if ((val) == HIGH && digitalRead(LED1) == HIGH && digitalRead(LED2) == HIGH  && digitalRead(LED3) == LOW) {
    Serial.println("aiuto2");   //scrive l'aiuto 2
  
  
  }
  if ((val) == HIGH && digitalRead(LED1) == HIGH && digitalRead(LED2) == HIGH && digitalRead(LED3) == HIGH) {
    Serial.println("aiuto3");   //scrive l'aiuto 3
  
  }
}

Con questa logica di funzionamento io dovrei quindi ricevere la scritta "aiuto2" perché ho lasciato i LED2 e LED3 spenti tuttavia il Seriale non mi fornisce nessuna comunicazione. Se invece scrivo il codice in questo modo:

#define LED1 53               // LED1 collegato al pin digitale 53
#define LED2 51               // LED2 collegato al pin digitale 51  
#define LED3 49               // LED3 collegato al pin digitale 49
#define BUTTON 7              // pin di input dove è collegato il pulsante  
int  val = 0;                 // si userà val per conservare lo stato del pin di input

void setup() {
  Serial.begin(9600);          //inizializza la porta seriale
  pinMode(LED1, OUTPUT);       // imposta il pin digitale come output
  pinMode(LED2, OUTPUT);       // imposta il pin digitale come output
  pinMode(LED3, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
  pinMode(LED2,HIGH);
  pinMode(LED1,HIGH);
  pinMode(LED3, LOW);
}

void loop() {
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva


  if ((val == HIGH) && digitalRead(LED1 == HIGH) && digitalRead(LED2 == LOW)  && digitalRead(LED3 == LOW)) {
    Serial.println("aiuto1");    //scrive l'aiuto 1
   
 
  }
  if ((val == HIGH) && digitalRead(LED1 == HIGH) && digitalRead(LED2 == HIGH)  && digitalRead(LED3 == LOW)) {
    Serial.println("aiuto2");   //scrive l'aiuto 2
  
  
  }
  if ((val == HIGH) && digitalRead(LED1 == HIGH) && digitalRead(LED2 == HIGH) && digitalRead(LED3 == HIGH)) {
    Serial.println("aiuto3");   //scrive l'aiuto 3
  
  }
}

Così da cambiare la condizione dal tipo:

if ((LED1) == HIGH)) a ------------> if ((LED1 == HIGH))

allora mi parte la comunicazione ma invece che darmi scritto solo "aiuto2" mi manda in Seriale tutte e tre le scritte in successione "aiuto1 aiuto2 aiuto2"

Come c**** è possibile!?

GRAZIE.

L'ERRORE è nella setup:
pinMode(LED2,HIGH); non esiste, devi scrivere digitalWrite(LED2,HIGH) !!!!!!!!

Poi, questo è inutile:
if( (val == HIGH) ) come anche anche if( (val)==HIGH )
basta
if( val == HIGH )

E questo è errato:
if( digitalRead(LED1 == HIGH) )
Devi chiamare una funzione di nome digitalRead e tra parentesi gli passi 1 parametro che è il pin, poi fai il test.
if( digitalRead(LED1)==HIGH )

Come scrivi sopra tu chiami la digitalRead passandogli NON il pin ma il confronto tra LED1 e HIGH, dove LED1 è 53 e HIGH è 1 (sono costanti) perciò gli passi la domanda 53==1 ? no, quindi falso e per il C falso è 0 quindi stai passando il pin 0
Quindi, prima di tutto LASCIA perdere il secondo codice. E' un rimedio peggiore del male.

Inizia con il semplificare quegli if, il test su val è uguale per tutti:

if( val==HIGH )
{ if( digitalRead(LED1)==HIGH && digitalRead(LED2)==LOW && digitalRead(LED3)==LOW ) 
 { Serial.println("aiuto1");    //scrive l'aiuto 1
  }
 if( digitalRead(LED1)==HIGH && digitalRead(LED2)==HIGH  && digitalRead(LED3)==LOW ) 
 { Serial.println("aiuto2");   //scrive l'aiuto 2
 }
 if( digitalRead(LED1)==HIGH && digitalRead(LED2)==HIGH && digitalRead(LED3)==HIGH ) 
 { Serial.println("aiuto3");   //scrive l'aiuto 3
 }
}
delay(50);

E metti come ultima cosa quel piccolo delay(50) come antirimbalzo del pulsante.

Intanto vi ringrazio per aver risposto e per le spiegazioni che mi avete dato anche se ero al corrente di un paio di cose ma forse mi sono spiegato male.
Del digitalWrite non ci avevo proprio fatto caso, solo che anche utilizzando l’ultimo codice che mi avete spiegato e postato…ahimé il risultato non cambia. Quando premo il mio bottone collegato al Pin7…mi legge il valore HIGH ma la comunicazione non parte quindi deve esserci qualcosa nelle condizioni dei Pin che non mi fanno partire il messaggio…e non riesco ancora a capire cosa sia.

Vi può aiutare se vi mostro i collegamenti che ho fatto sull’ARDUINO e la breadboard ?

GRAZIE ancora…

Salve,
Mettendo insieme un po di roba qua e la ho tentato di scrivere questo pseudo coso.
So che non è un aiuto (almeno non come dovrei darlo), ma credo possa essere abbastanza comprensibile. Non so se ho capito bene il suo scopo, ma per quanto ho capito eccolo. ATTENZIONE, da solo non funziona, ha bisogno di un sistema accensione/spegnimento led (ammesso che con esso funzioni)

const byte NUMEROLED = 4;
const byte LED [NUMEROLED] = {2, 3, 4, 5};
int led_accesi = 0;
const byte PINTASTO = 6;
byte pressione;
void setup()
{
  Serial.begin (9600);
  Serial.println F("H. W.");
  for (byte i = 0; i < NUMEROLED; i++)
  {
    pinMode (LED [i], OUTPUT);
  }
  pinMode (13, OUTPUT);
  //Primo test led, non facciamoci mancare nulla
  for (byte i = 0; i < NUMEROLED; i++)
  {
    digitalWrite  (LED [i], HIGH);
  }
  delay (1000);
  for (byte i = 0; i < NUMEROLED; i++)
  {
    digitalWrite  (LED [i], LOW);
  }
  pinMode (PINTASTO, INPUT_PULLUP);
  //Controllo tasto
  Serial.println F("Premere tasto e vedere se si accende il pin 13");
  unsigned long aspetta=millis();
  while (millis()-aspetta<10000)
  {
    if (LeggoTasto (PINTASTO))
    {
      digitalWrite (13, HIGH);
    }
  }
  digitalWrite (13, LOW);
  Serial.println F("Controlli cessati, inizio loop");
}

void loop()
{
  if (! digitalRead (PINTASTO))
  {
    pressione = LeggoTasto (PINTASTO);
    //La funzione LeggoTasto fa un debounce software. è eliminabile inserendo in questa if {} il contenuto della successiva.
    //Per eliminarla è necessario O un debounce (anti rimbalzo) hardwere (che non so fare) O accettare i rimbalzi
  }
  if (pressione)
  {
    //Sottinteso !=0
    pressione = 2; //Per non dimenticarcelo, tanto il controllo if() viene eseguito solo all0inizio
    led_accesi = 0;
    for (byte i = 0; i < NUMEROLED; i++)
    {
      led_accesi = led_accesi * 10 + digitalRead (LED [i]);
      //Numero massimo led =5.
    }
    Conseguenza (led_accesi);
    led_accesi = 0;
    if (pressione == 2)
    {
      pressione = AttesaRilascio (PINTASTO);
    }
  }
}
byte LeggoTasto (byte pin)
{
  unsigned long partenza = millis();
  while (millis() - partenza < 40)
  {
    if (digitalRead (pin))
    {
      return (0);
    }
  }
  return (1);
}
void Conseguenza (int causa)
{
  Serial.println (causa);
  //Riempire con quello che serve fare.
  //causa in questo caso è porta scritti gli stati dei led.
  //Si comincia da primo pin dell'array LED al posto più a sinistra per andare in ordine.
  //Le cifre sono 0 se spento e 1 se acceso.
  //Si può quindi qui usare una switch case su causa, terminando ogni chase con return; e ricordandoci che la funzione è void
  return;
}
byte AttesaRilascio (byte pin)
{
  while (!digitalRead (pin))
  {

  }
  return (0);
}

docsavage:
Se non parte la comunicazione, come fai a sapere che legge il pin 7?

mostra pure

Perché ho provato a usare la stringa

Serial.println(digitalRead(BUTTON));

ed effettivamente quando premo il pulsante sul seriale mi esce 1 invece che 0…quindi so che la lettura del pulsante( pin 7 è corretta).

docsavage:
hai qualcosa sul 13?

se non hai nulla potresti aggiungere alla loop questa semplice riga

digitalWrite(13,digitalRead(BUTTON));

che ti mostra accendendo il led del 13 se il pulsante è premuto

e nella setup, dopo averla inizializzata, stampa un messaggio di benvenuto sulla seriale
così si vede che la comunicazione serial è OK

alemno ci togliamo il dubbio che sia un probelma HW

…il led si accende e spenge in maniera corretta seguendo il pulsante!

giovepluvio:
Salve,
Mettendo insieme un po di roba qua e la ho tentato di scrivere questo pseudo coso.
So che non è un aiuto (almeno non come dovrei darlo), ma credo possa essere abbastanza comprensibile. Non so se ho capito bene il suo scopo, ma per quanto ho capito eccolo. ATTENZIONE, da solo non funziona, ha bisogno di un sistema accensione/spegnimento led (ammesso che con esso funzioni)

const byte NUMEROLED = 4;

const byte LED [NUMEROLED] = {2, 3, 4, 5};
int led_accesi = 0;
const byte PINTASTO = 6;
byte pressione;
void setup()
{
 Serial.begin (9600);
 Serial.println F(“H. W.”);
 for (byte i = 0; i < NUMEROLED; i++)
 {
   pinMode (LED [i], OUTPUT);
 }
 pinMode (13, OUTPUT);
 //Primo test led, non facciamoci mancare nulla
 for (byte i = 0; i < NUMEROLED; i++)
 {
   digitalWrite  (LED [i], HIGH);
 }
 delay (1000);
 for (byte i = 0; i < NUMEROLED; i++)
 {
   digitalWrite  (LED [i], LOW);
 }
 pinMode (PINTASTO, INPUT_PULLUP);
 //Controllo tasto
 Serial.println F(“Premere tasto e vedere se si accende il pin 13”);
 unsigned long aspetta=millis();
 while (millis()-aspetta<10000)
 {
   if (LeggoTasto (PINTASTO))
   {
     digitalWrite (13, HIGH);
   }
 }
 digitalWrite (13, LOW);
 Serial.println F(“Controlli cessati, inizio loop”);
}

void loop()
{
 if (! digitalRead (PINTASTO))
 {
   pressione = LeggoTasto (PINTASTO);
   //La funzione LeggoTasto fa un debounce software. è eliminabile inserendo in questa if {} il contenuto della successiva.
   //Per eliminarla è necessario O un debounce (anti rimbalzo) hardwere (che non so fare) O accettare i rimbalzi
 }
 if (pressione)
 {
   //Sottinteso !=0
   pressione = 2; //Per non dimenticarcelo, tanto il controllo if() viene eseguito solo all0inizio
   led_accesi = 0;
   for (byte i = 0; i < NUMEROLED; i++)
   {
     led_accesi = led_accesi * 10 + digitalRead (LED [i]);
     //Numero massimo led =5.
   }
   Conseguenza (led_accesi);
   led_accesi = 0;
   if (pressione == 2)
   {
     pressione = AttesaRilascio (PINTASTO);
   }
 }
}
byte LeggoTasto (byte pin)
{
 unsigned long partenza = millis();
 while (millis() - partenza < 40)
 {
   if (digitalRead (pin))
   {
     return (0);
   }
 }
 return (1);
}
void Conseguenza (int causa)
{
 Serial.println (causa);
 //Riempire con quello che serve fare.
 //causa in questo caso è porta scritti gli stati dei led.
 //Si comincia da primo pin dell’array LED al posto più a sinistra per andare in ordine.
 //Le cifre sono 0 se spento e 1 se acceso.
 //Si può quindi qui usare una switch case su causa, terminando ogni chase con return; e ricordandoci che la funzione è void
 return;
}
byte AttesaRilascio (byte pin)
{
 while (!digitalRead (pin))
 {

}
 return (0);
}

Buonasera,
innanzitutto la ringrazio per il tanto tempo speso per la mia causa.
Il mio scopo è questo:
ho una serie di Led… (misurano il completamento di alcune commissioni durante la giornata)
in base a quanti Led ho acceso (ovvero quanti compiti ho già svolto durante la giornata) ho bisogno di ricevere un messaggio specifico che mi indichi ad esempio quale sarà il prossimo lavoro da svolgere…

Quindi devo avere per ogni numero di LED accesi un testo specifico da leggere.

Purtroppo sono abbastanza neofita di Arduino e di programmazione in generale infatti alcuni passaggi li perdo del codice che mi ha scritto. Cosa intende per sistema di accensione/spegnimento led?

Grazie ancora a tutti…

Sistema di accensione/spegnimento significa che il mio programma non acce de i led, si limita a controllarne lo stato, che poi traduce in un numero, molto più pratico da maneggiare.
Manca completamente la "Conseguenza", il testo da scrivere, che può essere inserito in varie switch case (una sorta di if (n==... )in cui viene dichiarato n nella switch e ... nelle case. Mettere sempre break; alla fine di ogni case prima della successiva), ma credo sia fattibile. Oggi pomeriggio ci penso, ora scuola