Concatenazione IF con ARRAY

Allego subilto la parte di sketch interessata:

 requestFrom(2,8);
  for(ia=0;ia<8;ia++){
    stanza2[ia]=Wire.read();
    if(stanza2[ia]=1){
      digitalWrite(allarmestanza2,HIGH);
    }
    else{
      digitalWrite(allarmestanza2,LOW);
  }
}

Domanda: la luce si accenderà se almeno uno dei valori di array sara uguale ad 1 o se tutti i valori dell'array devono essere uguali ad 1?

Stai usando male il confronto. In C si usando due segni di uguale, non uno :wink:

if(stanza2[ia]=1)

è sbagliato. Questo è giusto:

if(stanza2[ia]==1)

nibbio99:
Domanda: la luce si accenderà se almeno uno dei valori di array sara uguale ad 1 o se tutti i valori dell'array devono essere uguali ad 1?

Dipende da come vuoi farlo tu, il check. Attualmente si accende quando trova un valore a 1 e si spenge nell'altro caso ma la luce resterà accesa solo se l'ultimo valore è pari a 1. :wink:

nibbio99:
Allego subilto la parte di sketch interessata:

Domanda: la luce si accenderà se almeno uno dei valori di array sara uguale ad 1 o se tutti i valori dell'array devono essere uguali ad 1?

La if agisce solo sull'elemento selezionato dal valore di "ia" quindi se è 1 si accende la luce, se è zero si spegne.
Attenzione che l'eguaglianza nella if si fa con "==" e non con "=".

un po OT:
Vince Leo perché era prima e ha scritto di piú. astrobeed, ritenta e sarai piú fortunato :wink: :wink: :wink: :wink: :wink: :wink: :wink:
Ciao Uwe

uwefed:
un po OT:
Vince Leo perché era prima e ha scritto di piú. astrobeed, ritenta e sarai piú fortunato :wink: :wink: :wink: :wink: :wink: :wink: :wink:
Ciao Uwe

L'orario è identico, in realtà abbiamo risposto assieme, solo che lui mi bruciato di qualche secondo sull'invio :slight_smile:

Quindi se ho capito bene (e tralasciando l'errore del confronto) basta che un valore qualunque di array sia uguale a uno per accendere il led, mentre per spegnerlo devono essere tutti diversi da uno.
@ leo 72
potresti essere + chiaro non capisco il motivo di questa affermazione:

ma la luce resterà accesa solo se l'ultimo valore è pari a 1. smiley-wink

Per come l'hai scritto, and ogni giro del for testerà un elemento e accenderà e spegnerà il led a seconda di come troverà il valore nell'array (quindi il led si accedenderà e spegnerà mano mano che il for gira), dopo di che, in uscita dal for, manterrà l'ultimo valore incontrato ....

Spiega quello che tu vorresti e vediamo di correggere quel ciclo ...

Guglielmo

Quello che vorrei è che sia sufficiente anche un solo valore dell'array uguale ad 1 per accendere il led, mentre per spegnerlo tutti i valori dell'array devono essere uguali a 0.

nibbio99:
Quello che vorrei è che sia sufficiente anche un solo valore dell'array uguale ad 1 per accendere il led, mentre per spegnerlo tutti i valori dell'array devono essere uguali a 0.

se ho capito bene....

...potresti spezzare il codice in 2 parti:

1. ciclo for per recuperare le informazioni dall'array e aggiornare 1-2 variabili (una per identificare la condizione "almeno un elemento==1"; l'altra per la condizione "tutti gli elementi == 0")
2. fuori dal ciclo esegui l'istruzione/le istruzioni conseguenti

Siccome non ti interessa quale elemento è eventualmente == 1, nell'ipotesi che gli elementi abbiano valori 1/0, le 2 condizioni potrebbero essere rappresentate da una sola variabile "somma" di tutti i valori degli elementi:
---> se la somma è zero allora "tutti gli elementi == 0" --> LOW
---> se la somma è > 0 allora "almeno un elemento == 1" --> HIGH

... oppure, altra soluzione, se non vuoi fare l'addizione ( ... che comunque è la strada più veloce perché si evita un if a ogni ciclo) :

  1. metti una variabile che chiamiamo "accendi" a LOW
byte accendi = LOW;
  1. fai il tuo ciclo di for nel quale, se, e solo se, l'elemento dell'array è uguale 1 metti la variabile "accendi" a HIGH (così basta che uno solo sia diverso da 0 e la variabile di appoggio diventa HIGH)
for(ia=0; ia<8; ia++){
  stanza2[ia]=Wire.read();
  if (stanza2[ia] == 1) accendi = HIGH;
}
  1. alla fine del for, quando esci non fai altro che fare una :
digitalWrite(allarmestanza2, accendi);

accendi sarà HIGH solo se avrai incontrato almeno un elemento a 1, altrimenti rimarrà LOW :wink:

Guglielmo

Forse si può fare anche con un ciclo while, con 2 controlli (contatore e variabile "accendi") in modo che si esca subito appena si incontra un elemento == 1

Così che il confronto lo fa while, senza if e for.

Il numero di cicli sarebbe uguale o inferiore ai cicli di un for.

Oppure dopo

digitalWrite(allarmestanza2,HIGH);

metti un

ia = 8;

così al primo 1 che trova accende ed esce dal ciclo, se invece trova tutti 0 spegne.

andreino:
Forse si può fare anche con un ciclo while, con 2 controlli (contatore e variabile "accendi") in modo che si esca subito appena si incontra un elemento == 1

Per quello non serve un ciclo while ... basta usare la break appena si incontra un elemento == 1 ... ma così però non riempie più l'array e magari ... a lui i valori nell'array servono (... altrimenti .. che lo crea a fare ??? :roll_eyes: )

Guglielmo

gpb01:
Per quello non serve un ciclo while ... basta usare la break appena si incontra un elemento == 1 ... ma così però non riempie più l'array e magari ... a lui i valori nell'array servono (... altrimenti .. che lo crea a fare ??? :roll_eyes: )

Guglielmo

Si è vero, avevo ignorato la necessità di riempire l'array, sicuramente per un uso successivo esterno al ciclo for :slight_smile:

Ok grazie a tutti, ma penso che la soluzione della somma sia la più semplice e veloce.
Effettivamente solo l'ultimo valore dell'array era decisivo per l'accensione del led.
Io immaginavo tutti i valori concatenati tra loro con un or o un and, invece di una lista di if else collegati tutti allo stesso led, di cui solo l'ultimo lo comandava