Lettura di un array + AND logico

Ciao!

Vorrei leggere 10 valori di un pin digitale e solo se tutti i valori sono LOW eseguire qualcosa.

Questo perchè al pin in questione ho collegato un interruttore galleggiante e vorrei evitare “false” segnalazioni. quindi ho pensato di leggere più volte “l’apertura” del sensore e solo dopo 10 letture “vere” eseguire qualcosa.

ho iniziato con questo codice ma non so come fare l’and tra le 10 letture.

#define led 13
#define sens_livello 12
int livello [10];  // array di 10 elementi con lo stesso nome ma distinti dal'indice:


void setup() {
pinMode (led,OUTPUT);
pinMode (sens_livello,INPUT);
Serial.begin(9600);

}


void loop() {
for(int a=0; a < 10 ; a ++) { 
 
    livello [a] = (digitalRead (sens_livello));
    delay(500); 
    Serial.println (livello[a]);
  }
}

non vorrei creare 10 variabili e in ogni variabile leggere un valore ma se possibile fare l’and in qualche modo risparmiando altre variabili… è possibile?

inoltre se volessi usare questo codice in un altro sketch come posso far si che non sia “bloccante” e che il resto del codice prosegua?

Grazie per l’attenzione

Usa una variabile con valore 0 o 1, falso o vero.
La inizializzi a falso o 0. Leggi il pin 10 volte, se anche solo una volta è HIGH allora la variabile è true o 1 quindi esci dal for. All'uscita se la variabile è falso hai fatto 10 cicli senza mai sentire un HIGH.

Somma i 10 valori

void loop() {


byte total = 0;

for(byte a=0; a < 10 ; a ++) { 
 
   total  += (digitalRead (sens_livello));
    delay(500); 
    Serial.println (livello[a]);
  }

       if (total  == 0) {        
        
           //fai qualcosa
       }   

}

inoltre se volessi usare questo codice in un altro sketch come posso far si che non sia “bloccante” e che il resto del codice prosegua?

invece del for usi la funzione Millis() impostato a 500ms

Grazie per le risposte.

Faccio un passo indietro,
A questo punto, ditemi se sbaglio, dato che con millis() questa parte non blocca altre parti del codice, converrebbe fare letture in continuo e solo quando tot di queste letture sono uguali fare qualcosa.
non sarebbe meglio?

Sono andato in palla con questo problema che dovrebbe essere facile da risolvere...

1-quindi dovrei fare un array di byte con dimensione 30. è come avere 30 variabili byte giusto?
2-queste 30 variabili byte sono aggiornate ogni 0ms quindi sempre aggiornate leggendo il pin del sensore.
3-Alla fine delle 30 letture devo confrontarle per vedere se sono tutte uguali.
4-infine se tutte uguali eseguirò qualcosa. altrimenti prosegue.

Logica giusta?

i punti 2 e 3 sono quelli più critici.

per il 2 potrebbe funzionare una cosa del genere dove interval = 0 in modo che sia sempre verificato?

if(millis > interval) {
array[0] == digitalRead(pin);
....
array[10] == digitalRead(pin);
....
array[29] == digitalRead(pin);
}

mentre per il punto 3 non so come confrontare tutte le variabili che compongono l'array, cioè prendere tutte e 30 le singole "variabili" e verificare che sia tutti 0 o tutti 1.
Forse così?

if(array[0]=1 &&array[1]=1 &&.....array[29]=1)
{}

Chiedo già scusa perchè so di aver detto qualche stupidata, qualcuno può chiarirmi le idee?
Grazie!

lucadh:
mentre per il punto 3 non so come confrontare tutte le variabili che compongono l'array, cioè prendere tutte e 30 le singole "variabili" e verificare che sia tutti 0 o tutti 1.
Forse così?

if(array[0]=1 &&array[1]=1 &&.....array[29]=1)

{}




Chiedo già scusa perchè so di aver detto qualche stupidata, qualcuno può chiarirmi le idee?
Grazie!

Puoi anche sfruttare la matematica e sommare i valori nell'array usando un for. Se il totale =30 allora tutti contengono 1, se totale=0 tutti contengono 0

quindi dovrei fare un array di byte con dimensione 30. è come avere 30 variabili byte giusto?

vedo che non hai letto il mio post o non l'hai capito.

Volendo puoi memorizzare 30 posizioni, sommarle, dopo fare radice quadra e rimoltiplicare per se stesso, infine togli 1000 e poi aggingi di nuovo 1000, vedrai che il risultato non cambia, solo che avrai utilizzato più risorse del dovuto.

  • Memorizzare su array 30 valori
  • Fare un ciclo for di 30 letture
  • fare una somma di 30 valori
  • fare un confronto dopo la somma

è uno spreco di memoria e risorse, perdita di tempo a scrivere il codice e perdita di cicli macchina quando con una sola variabile puoi fare tutto.

converrebbe fare letture in continuo e solo quando tot di queste letture sono uguali fare qualcosa.
non sarebbe meglio?

quello che ti ho detto nel post precedente.

total  += (digitalRead (sens_livello));

puoi togliere il for e mettere un flag magari a 1000 (1000 letture anche 5000 o + puoi arrivare a 65xxx con un solo INT)
intanto che passa da loop per fare altre cose prelevi il segnale e lo sommi eviti anche l'uso del millis
ciao

Ok, sto provando tutti i consigli.
mi sono accorto di questo: il sensore a livello in questione è praticamente un reed. quindi aperto oppure chiuso. se faccio un semplice sketch tipo questo

#define sens_livello 12
#define led 13

void setup(){
pinMode (sens_livello,INPUT);

Serial.begin(9600);
}


void loop() {

Serial.println(digitalRead (sens_livello));

}

nelle 2 posizioni in cui può essere il sensore da monitor seriale vedo in una tutti 0 (00000000000) mentre nell'altra vedo 111000111000.
non dovrei vedere o degli 0 o 1?