Contatore

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:

int i=0;
void setup(){
  Serial.begin(115200);
  pinMode(2, INPUT);
}
void loop(){
  if(digitalRead(2)==HIGH){
    i=i+1;
  }
  delay(1);
}

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):

int i=0;
void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
}
void loop(){
  if(digitalRead(2)==HIGH){
  i=i+1;
  }
delay(1);
   Serial.println(i);
   delay(1000);
   i=0;
}

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?

Questo articolo ti spiega un pò di cose:
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Se vuoi usare uno scheduler basato su millis c'è sempre il mio looper:
http://www.leonardomiliani.com/2012/looper-uno-schedulatore-software-per-arduino/