rilevare pressione tasto prolungato

Ciao ragazzi,
ho cercato nel forum ma non sono riuscito a trovare una soluzione.
Vi espongo:
Ho un telecomando a 2 tasti che pilota 2 relè di un ricevitore,ma non fa quello che mi aspettavo.
Ho deciso di utilizzarlo in parallelo ad un arduino,l'idea era di collegare il com a 5v,norm chiuso a niente,norm aperto su arduino(replicato per entrambi i relè)
Quindi magari li mando sui pin 2,3 che uso come input e 4,5 come output.
In output ci saranno altri 2 rele che stavolta sono pilotati da arduino che a loro volta piloteranno due luci indipendenti.
L'idea era: ogni volta che premo il tasto,arduino accende la lampada corrispondente per 5 sec ,questo intervallo di tempo è incrementale rispetto al numero di volte che lo premo,se invece lo tengo premuto,me la tiene sempre accesa.
In pseudocodice sarebbe:

int x=0;
int y=0;
Bool luce1 = false;
Bool luce2 = false;
LuceIn1 = Pin2
LuceIn2 = Pin3
LuceOut1 = Pin4
LuceOut2 = Pin5

ControllaInLoop(){
if(LuceIn1 = High){ //Tasto premuto
	if(LuceIn1 = High per piu' di 2 secondi){
		if(Luce1 = false){ // Se la lampada è spenta
			Luce1 = true;
			Accendi luce per x = infinito;
		}
		if(Luce1= true){ // La luce è gia accesa,allora la devo spegnere
			Luce1 = false;
			LuceOut1 = Low //spengo la luce
			x = 0; //reinizializzo il contatore
		}
	}//Chiuso il caso del tasto prolungato
	//Inizio caso tasto premuto brevemente;
	x += 5 //incrementa x di 5 secondi
    if(luce1 ==false){ //Luce spenta
        Luce1 = true; //Ora è accesa
        Accendi LuceOut1 per x secondi
    }
    if(luce1 == true) //Luce accesa
       Non fare niente
 }

Ovviamente c'è la parte praticamente identica che gestisce il tasto b,ovvero Lucein2

Il problema è che non sò come gestire il tasto prolungato ne l'accensione temporizzata,in quanto se per quest'ultimo facessi ad esempio:
LuceOut1 = high;
delay(5000);

Arduino va in sleep e si perderebbe tutto quello che succede in quei 5 secondi,esempio ripremo due volte il tasto a,oppure premo il tasto b. Come posso quindi gestire in parallelo queste richieste?
Grazie mille a chi mi aiuterà.

Ciao, al posto del delay devi usare la funzione millis() in modo opportuno. Guarda l'esempio BlinkWithoutDelay presente nell'ide.
In alternativa è possibile utilizzare leOS http://www.leonardomiliani.com/2012/leos-un-semplice-so-per-arduino/

Mi lascia un po' perplesso collegare direttamente un relè alle porte I/O.
Ci sarà qualche lievissimo effetto di rimbalzo ?

@fabPollis
Grazie ora do un'occhiata.. ma invece per catturare il tasto prolungato?
@paulus1969
Lo sò.. anche a me,ma purtroppo è l'unico modo di riutilizzare questo apparecchio.
Io pensavo che premendo un pulsante commutasse all'altra posizione e rimanesse fisso finchè il tasto non venisse ripremuto,in realtà la bobina rimane eccitata in base alla pressione del tasto.
Magari invece di collegare direttamente alle porte di I/O dell'arduino,potrei fare un circuitino per filtrare il segnale,che ne pensi? Qualche suggerimento?

Per leggere la pressione prolungata di un pulsante ti servono alcune variabili.
Leggi lo stato, controlli se c'è la pressione, se sì, entri in un ciclo in cui controlli che il pulsante non venga rilasciato prima di un certo periodo di timeout, passato il quale esce confermando la pressione prolungata. Se invece la pressione è inferiore al timeout, hai la pressione semplice.

Nel mio Micrologio puoi trovare la lettura breve e la lettura prolungata di un pulsante. All'interno del ciclo del while che attende il rilascio del pulsante puoi eseguire altri calcoli.

Grazie mille,ho capito come funziona millis() e letto il tuo codice,ma non riesco ancora a venirne a capo:

#define BUTTON 4
#define Luce_1 7
#define interval 2000

int value = LOW;
long previousMills = 0;

void setup(){
  pinMode(Luce_1,OUTPUT); 
  pinMode(BUTTON,INPUT);
}

void loop() {

  //if (millis() - previousMills > interval){
   //previousMills = millis() // Salvo ultima accensione 
  //}
   unsigned long tempMillis;
   boolean over;
   boolean Luce1_Accesa;
   int x = 0;
   //neverending loop
    do {
        //button pressed? 
        if (digitalRead(BUTTON)==HIGH) { 
            delay(50); //Pressione breve
            if (digitalRead(BUTTON)==HIGH) { //forse è una pressione lunga
                tempMillis=millis()+2000; //Vediamo se è premuto per piu' di 2 sec
                over=false;
                while (digitalRead(BUTTON)==HIGH) {
                    if (millis()>tempMillis) { //the user has pressed the button for more than a specific time
                        over=true;
                        break;
                    }
                    
                }
            }
            if (over == true) { //the user has pressed the button for more than 1 second so he wants to enter into programming mode
              if(Luce1_accesa == true)
                  digitalWrite(Luce_1, LOW);
              else
                  digitalWrite(Luce_1,HIGH);                   
       
}

Non riesco a capire come fare per l'accensione temporizzata
Se la metto nel while magari io volevo in realtà accenderla definitivamente,se invece metto fuori dal while devo comunque aspettare minimo 2 secondi che il while vada in break.
Grazie mille

Nessuno?

La lettura del pulsante e l'attivazione della luce sono 2 operazioni differenti, e come tali ti servono altre 3 variabili. Una che ti dica se la luce deve stare accesa o spenta, una che ti dica se la luce è accesa o spenta, ed una che, in caso di luce accesa, controlli con un altro check con millis se è passato il tempo ON previsto.

Sul mio sito cerca l'articolo correlato in cui faccio vedere come eseguire 2 compiti contemporaneamente con millis, quello ti darà senz'altro una mano.

In pratica, il "pezzo" di codice che legge la pressione del pulsante sta prima di quello che controlla l'accensione. Se devi accendere la luce, controlli se non sia già accesa, se non lo è la accendi e registri il tempo di accensione. Al prossimo passaggio dal check, controlli se è terminato il tempo di accensione.