Go Down

Topic: funzione Timeout (Read 158 times) previous topic - next topic

devilx

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

 

torn24

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



Code: [Select]


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);
    }
}






devilx

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 .....



Federico66


ho un deja vu :(

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
Code: [Select]

void callMeLater() {
    // do something
}

timerId = timer.setTimeout(1000, callMeLater)


che però, quasi sicuramente, puoi usare cosi:
Code: [Select]

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
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

torn24

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...

devilx

grazie mille ho risolto con la funzione mills :-)

Federico66

grazie mille ho risolto con la funzione mills :-)
Benissimo, grazie per il feedback ;)


Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Go Up