ciao a tutti, possiedo arduino 1, sto realizzando una piccola centralina per dei semafori, l idea e quella di fare in modo che arduino esegua una riga di codice solo se le fotocellule ( o pulsante), e rimasto premuto per piu di 3 secondi, non so propio come fare il conto allarovescia,gentilmente mi potreste aiutate?
grazie a tutti
il codice che ho realizzato e il seguente: #define verde1 13 #define rosso1 12 #define verde2 11 #define rosso2 10 #define pulsante 7
int val = 0; // conserva lo stato del pin di input
Devi usare la funzione millis, che restituisce il numero di millisecondi dall'avvio di Arduino.
Quando rilevi il passaggio dalla fotocellula (o la pressione del pulsante), imposti una variabile con il contenuto di millis sommato all'intervallo che vuoi misurare, metti una variabile booleana a trueed entri in un ciclo while. All'interno del ciclo devi leggere costantemente il pin a cui hai collegato il sensore/pulsante. Nel momento in cui cambia di stato, esci dal while con break.
Altrimenti la condizione di chiusura del ciclo while è che millis sia maggiore del valore di millis sommato all'intervallo. Al di fuori del while controlli la variabile booleana: se è false, allora sei uscito dal ciclo per disattivazione della lettura (vuol dire che l'utente ha tolto il dito dal pulsante), se è true, significa che il sensore/pulsante è rimasto attivato per più dell'intervallo.
In pseudocodice:
uscita_programmata = millis + intervallo
pressione_continua = true
do
if (lettura_sensora != stato_programmato)
pressione_continua = false
break
endif
while (millis <= uscita_programmata)
if (pressione_continua == true)
....sensore interrotto per tutto l'intervallo
else
....dito staccato prima del tempo
endif
Te l'ho messo in pseudo codice perché devi essere tu a riportarlo in linguaggio Arduino, altrimenti non impari
Il controllo lo devi inserire nel loop al posto del tuo attuale check dello stato del pin collegato al sensore/pulsante. Poi la logica di lampeggio la metti successivamente.
void loop() {
unsigned long uscita_programmata = millis() + 3000; //3 secondi
boolean pressione_continua = true;
do {
if (digitalRead(pulsante) == HIGH) { //oppure LOW, dipende dalla logica di funzionamento del tuo pulsante
pressione_continua = false;
break;
}
} while (millis() <= uscita_programmata);
if (pressione_continua == true) {
// ....sensore premuto per tutto l'intervallo
} else {{
// ....dito staccato prima del tempo
}
Ti chiedo però di editare il tuo messaggio e racchiudere il codice all'interno degli appositi tag CODE che compaiono cliccando sull'icona "#" sopra alle faccine, almeno è più leggibile.