Ciao a tutti! Anche se è un po' che non mi faccio vivo, continuo ad arduinare, e, con l'estate, ricominciamo i miei quesiti. Oggi mi sono imbattuto in uno sketch nel quale devo creare un timer che si azzeri ogni secondo e scriva, prima di azzerarsi, il numero di volte che è stato premuto un pulsante.
Il codice che ho usato è il seguente:
Per contare conta, ma non so come scrivere che si deve azzerare ogni secondo scrivendo prima il numero a cui era arrivato.
Sarà anche banale, ma non è la prima volta che mi imbatto in un problema del genere e questa volta ci voglio andare in fondo!!! XD
Grazie in anticipo!
Devi usare il millis.
Registri il millis attuale in una variabile, quanto millis() - il tempo attuale è maggiore di 1000 stampi il contatore, lo azzeri e aggiorni il tempo attuale.
in modo banale ti basta azzerare la variabile dopo il delay, no?
int i=0;
void setup(){
Serial.begin(115200);
pinMode(2, INPUT);
}
void loop(){
if(digitalRead(2)==HIGH){
i=i+1;
}
delay(1);
i = 0;
}
EDIT: ho scritto una fesseria, pensando al delay(1) come ad un secondo invece di 1ms, ovviamente il suggerimento di cyb è eccellente, restando nel banale basterebbe racchiudere tutto in un ciclo for 0-999 e poi fare i=0.....
devo creare un timer che si azzeri ogni secondo e scriva, prima di azzerarsi, il numero di volte che è stato premuto un pulsante.
Cosi dovrebbe andare:
int i = 0;
unsigned long T = 0;
void setup(){
Serial.begin(115200);
pinMode(2, INPUT);
T = millis();
}
void loop(){
while (millis() - T < 1000) { // è passato un secondo ?
if(digitalRead(2)==HIGH){
i=i+1;
delay(20); // ritardo anti rimbalzo (debounce)
}
}
Serial.println(i)
i = 0;
T = millis(); // reset timer
}
Intanto, grazie delle risposte! Sapevo della funzione millis(), ma non sapevo che si potesse azzerare... Pensavo che se anche si riportasse a 0 il millisecondo dopo restituisse sempre da quanto tempo era accesa la scheda. Più tardi proverò lo sketch di cyb, ma vorrei capire se è possibile fare due delay nello stesso loop. Mi spiego meglio, fare fare ad arduino due cose separatamente, tipo questo (ovviamente non funzionante):
mi servirebbe che ogni millisecondo controllasse, e ogni secondo invece scriva e subito dopo aver scritto cancelli.
EDIT: Avete parlato anche dell'istruzione for, utilizzandola cosa si riuscirebbe a fare?