Go Down

Topic: Istruzioni "simultanee" (Read 961 times) previous topic - next topic

Appia

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.

pitusso

Ciao,
invece di usare delay, utilizza millis:
http://www.arduino.cc/en/Reference/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


Appia

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

Appia

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.

lesto

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  ;)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Appia

#5
Jul 27, 2010, 11:56 pm Last Edit: Jul 28, 2010, 12:02 am by Appia Reason: 1
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.

lesto

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?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BrainBooster

#7
Jul 28, 2010, 07:05 am Last Edit: Jul 28, 2010, 07:06 am by brainbooster Reason: 1
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. ;)

lesto

mi spieghi sta cosa della millis disturbabile & interrupt?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BrainBooster

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

Go Up