Conteggio attivazione di un ingresso digitale

Ciao Daddi,

in generale credo che il modo migliore per imparare a scrivere codice è quello di... scriverlo!!! Poi ci si rompe la testa per capire perchè non funziona. Soltanto così alla fine ci rimane impresso nella mente quello che abbiamo imparato.

Ciò premesso, mi rendo conto che magari, all'inizio, non si sa proprio da dove cominciare. Per venirti incontro provo a postarti un esempio di codice che "dovrebbe" fare quello che ti serve. Non l'ho provato quindi è possibile che vada rivisto. Nel caso parliamone.

int button = 4;
int buttonState;
int oldButtonState;
int counter;
unsigned long startTime;
unsigned long delay = 1000;
bool firstClick;

void setup() 
{                
	Serial.begin(9600);
	pinMode(button, INPUT);     

	firstClick = true;

	oldButtonState = LOW;
	counter = 0;
}

void loop() 
{
	buttonState = digitalRead(button);
	
	if (buttonState == HIGH)
	{
		// ho premuto il pulsante
		
		if (oldButtonState == LOW)
		{
			oldButtonState = HIGH;

			if (firstClick)
			{
				startTime = millis();
				firstClick = false;
			}
			
			counter++;
		}
	}
	else oldButtonState = buttonState;
	
	unsigned long elapsedTime =  millis() - startTime;
	if (elapsedTime	> delay)
	{
		firstClick = true;
		Serial.print("Impulsi contati: ");
		Serial.println(counter, DEC);
		counter = 0;
	}
}

In pratica la variabile buttonState contiene lo stato attuale del pulsante, mentre oldButtonState mantiene lo stato precedente. Questo serve perchè, data la velocità alla quale viene eseguito il loop, non è sufficiente incrementare il contatore (la variabile counter) quando buttonState=HIGH perchè sicuramente durante ogni pressione passeresti n volte nel ciclo.

Pertanto counter viene incrementata ogni volta che buttonState è HIGH e oldButtonState è LOW.

Al primo click (indicato da firstClick) viene anche impostato il valore di startTime. Poi ad ogni ciclo viene controllato quanto tempo è passato da startTime (elapsedTime = millis() - startTime). Quando questo valore diventa maggiore di delay (1000 ms = 1 s come richiesto), il valore di counter viene inviato alla seriale e resettato.

Se hai bisogno di altre informazioni, chiedi pure.

Ciao.
Vittorio.