funzione Timeout

salve

parliamo di arduino mega e scheda a quattro relè che mi comandano dei led tramite app fatta con blynk .
funziona tutto perfettamente ma quello che vorrei fare e premere un bottone del relè 1 per esempio e dopo 1 secondo in automatico lo dovrebbe spegnere , (cambiare stato da HIGH a LOW), quindi pensavo di integrare la funzione timeout per cambiare lo stato.....

Mi potete indicare un metodo o una guida per imparare questo comando

grazie

Ciao! Non ho mai sentito la funzione Timeout su arduino????
Quello che vorresti fare si fa con la funzione millis()

byte stato=0;
unsigned long tempo=0;
void loop(){

    if(digitalRead(pulsante)==LOW){// Quando si preme il pulsante

        digitalWrite(LED,HIGH); // Accendo il led
        tempo=millis(); // Acquisto il tempo
        stato=1;

    }

    if(stato==1 && millis()-tempo >=1000){//se è passato un secondo

          stato=0;// Questo if non verrà più eseguito fino  a quando non si preme il pulsante
          digitalWrite(LED,LOW);
    }
}

io sto usando i rele di arduino come dei pulsanti io aziono il rele dell'arduino e mi attiva un ulteriore rele , ma se lo faccio con blynk il problema non c'è , perche posso impostare il bottone come pulsante , ma se lo faccio con ifttt, non riesco a fare comportare il rele di arduino come pulsante, ma si comporta come un interruttore.
quindi pensavo di farlo fare tramite software tu accendi il relè 1 e lui dopo tot tempo cambia stato ....
Ho provato senza successo con
timer.setTimeout(500L,

ma senza successo .....

ho un deja vu :frowning:

vediamo se ci prendo

leggendo questo " timer.setTimeout(500L, " deduco che stai usando una libreria (SimpleTimer.h?)
se si, la domanda corretta è:

Come funziona setTimeout della libreria SimpleTimer?
(visto che in Arduino non mi pare esista una funzione timeout)

a questo punto la risposta potrebbe essere:

come specificato nel reference della libreria

void callMeLater() {
    // do something
}

timerId = timer.setTimeout(1000, callMeLater)

che però, quasi sicuramente, puoi usare cosi:

digitalWrite(13, HIGH);
timer.setTimeout(1000, []() {  //dopo 1 secondo spegni
  digitalWrite(13, LOW);
});

ma come giustamente ti ha spiegato torn24, non è necessario scomodare una libreria, lo puoi fare molto semplicemente con la funzione millis()in modo da risparmiare risorse.

ci ho preso o non ho capito nulla?

Federico

Il codice che ti ho postato è lato arduino, non importa quale interfaccia grafica usi, se arduino legge il segnale come se fosse un pin "dall'interfaccia grafica riconosco la pressione del pulsante", poi il codice è identico.

Non so come ricevi un segnale ma al massimo dovrai sostituire if(digitalRead(pulsante)==LOW), con quello per percepire l'interfaccia grafica...

grazie mille ho risolto con la funzione mills :slight_smile:

devilx:
grazie mille ho risolto con la funzione mills :slight_smile:

Benissimo, grazie per il feedback :wink:

Federico