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?
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.
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?
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
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?