Istruzioni "simultanee"

Buongiorno a tutti,
nuovo del forum ho iniziato ad utilizzare Arduino da qualche mese.
Devo fare innanzitutto i complimenti a tutti coloro che partecipano, è davvero un grande progetto!
Sono ora alle prese con un LCD, qualche tasto e un sensore di temperatura ma mi servirebbero alcune indicazioni.

Utilizzo un analog input con un partitore di tensione per acquisire la temperatura da un NTC e lo visualizzo sull'LCD. In contemporanea vorrei però riuscire ad eccitare un relay per 30 secondi in seguito alla pressione di un tasto.
Se utilizzo la funzione Delay() dopo aver acquisito lo stato del tasto mi si ferma chiaramente l'acquisizione mentre io vorrei che continuasse.
Cosa consigliate? Quale struttura adottare?

Grazie a tutti.

Ciao,
invece di usare delay, utilizza millis:

Qui trovi un thread dedicato aperto da nathanvi, che linka pure una guida ad hoc:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1265304289

Grazie mille, letto tutto, oggi mi applico!
Gentilissimo.

Testato, spettacolo!
Ho però un problema, come faccio a lasciare acceso un led (per semplificare) per 30 secondi all'interno di questa struttura?
Deve essere abbastanza preciso e non dipendere da nulla (altro codice che aggiungerò più avanti).

Grazie ancora a tutti.

salvi il niumero ritornato da millis() quando accendi il led, e lo spegni quando il valore ritornato da millis super quello salvato + numero di millisecondi da lasciare il led acceso :wink:

Non la vedo così facile:
leggo lo stato del tasto, se premuto accendo il led, se no lo spengo.
Dove metti il contatore? Dove metti le istruzioni per lo spegnimento?
Potresti farmi un esempio?
Grazie mille.

inizializzo una variabile globale millisPartenza=0 e msCheDeveRimanereAcceso=30000(30 secondi)
loop(){
leggo lo stato del tasto; se premuto accendo il led e salvo il valore millis() in millisPartenza; se millisPartenza+msCheDeveRimanereAcceso < millis() allora spengo il led;
}

facile no?

in generale la programmazione con "delay" permette di creare dei loop dal tempo più o meno definito e quindi il nostro programma sembra lavorare con cadenza ciclica, ma a volte alcuni eventi all'interno del loop possono rallentarne l'esecuzione mandando all'aria la sincronizzazione di quelli successivi con risultati inpredicibili, in questi casi la funzione "mills", ci permette di avere una "precisa" linea temporale alla quale appendere i nostri eventi che verranno eseguiti allo scadere del tempo che abbiamo programmato.
Ho messo precisa fra virgolette perchè in verità anche la funzione mills sarebbe "disturbabile" ma se usata in congiunzione con gli interrupt diventa inflessibile. :wink:

mi spieghi sta cosa della millis disturbabile & interrupt?

date un'occhiata a questa discussione:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1237130632