Accendere pin dopo tot secondi di un evento

Ciao a tutti.

Forse ho inteso male la richiesta ma io ho capito che alla prima pressione di un pulsante comincio a contare un tempo. Se trascorso un certo ritardo non ricevo una seconda pressione, accendo il led. Se invece ricevo una seconda pressione entro il ritardo prefissato, non succede nulla e si riparte da zero.

In generale non condivido dei cicli che bloccano il loop principale. Questo perchè impedirebbero l'esecuzione di altre funzioni in contemporanea. Magari non è questo il caso ma lo dico solo per esprimere un concetto generale.

Io farei così:

int led = 13;
int button = 12;
unsigned long startTime;
unsigned long delay = 5000;
bool firstClick;

void setup() 
{                
	firstClick = true;
	pinMode(button, INPUT);     
	pinMode(led, OUTPUT);     
}

void loop() 
{
	if (digitalRead(button) == HIGH)
	{
		if (firstClick) startTime = millis();
		
		firstClick = !firstClick;
	}
	
	if (!firstClick)
	{
		unsigned long elapsedTime =  millis() - startTime
		if (elapsedTime > delay)
		{
			firstClick = true;
			digitalWrite(led, HIGH);
		}
	}

              // qui posso inserire altro codice che viene comunque eseguito ad ogni ciclo
}

All'inizio firstClick vale true e sono in attesa della prima pressione. Se il pin va HIGH e sono in attesa della prima pressione (firstClick=true), faccio partire il tempo impostando startTime al valore attuale di millis(). In ogni caso cambio il valore di firstClick. In questo modo se era true parte il tempo, altrimenti vuol dire che ho ricevuto la seconda pressione e devo ripartire da zero.

Poi controllo se firstClick è false (vuol dire che sono in attesa della seconda pressione). In questo caso vedo quanto tempo è trascorso (millis() - startTime). Se il tempo trascorso è maggiore del ritardo richiesto (delay = 5000, 5 secondi perchè espresso in millisecondi), accendo il led e rimetto firstClick a true per ripartire da capo.

Come dicevo, dove ho inserito il commento è possibile inserire altro codice che viene eseguito ad ogni ciclo dato che il loop principale gira sempre.

A proposito, non ho capito chi spegne il led...

Non ho provato il codice e magari mi è sfuggito qualcosa. Nel caso, parliamone.

Ciao.
Vittorio.