Multitasking con Arduino

Ciao a tutti ragazzi e grazie in anticipo per gli aiuti che mi date.... sono partito da 0 e sono già al mio primo progetto un pò più complesso :wink:

Sono arrivato davanti ad un muro che non riesco a superare, ora vi spiego in poche parole di cosa si tratta...

Il mio progetto prevede un countdown (stile 00:01:59) visualizzato a schermo che sono riuscito a realizzare tramite la sottrazione ogni 60 secondi di 1 minuto ed ogni 60 minuti di un ora con la funzione delay(1000).... il mio problema nasce quando durante questo countdown devo svolgere altre funzioni, nel senso... ricevere tramite keypad il codice pin di sblocco countdown... ovviamente usando la funzione delay l'arduino non riesce a fare nient'altro finchè non è trascorso il tempo indicato... come posso durante il countdown svolgere altre funzioni?

un'altra cosa che non riesco a fare... restare in attesa dell'inserimento di una sequenza di numeri ed una volta premuto x esempio il tasto 1 deve eseguire un'azione....
X esempio in un menù.... Selezionare 1 per questo selezionare 2 per quello

Grazie mille per tutto!

Non usare delay, ma millis().... delay interrompe l'esecuzione di qualsiasi cosa, mentre millis è un contatore in millisecondi che va continuamente! Ci sono un sacco di esempi ovunque!

ivan64:
Non usare delay, ma millis().... delay interrompe l'esecuzione di qualsiasi cosa, mentre millis è un contatore in millisecondi che va continuamente! Ci sono un sacco di esempi ovunque!

Grazie intanto della dritta, però millis mi dice nella documentazione "Returns the number of milliseconds since the Arduino board began running the current program." come posso sfruttare il numero dei millisecondi dalla partenza di arduino per fare quello che mi serve? :frowning:

Esempio di counter con millis

unsigned long tempo;
byte secondi=60;

void setup(){
tempo=millis();
}

void loop(){
if(millis()>=tempo+1000){
secondi--; //decremento i secondi
tempo=millis();
}

ogni 1000 mSec la variabile secondi si decrementa, ma se di seguito al if metti altro codice, verrà eseguito.
E' solo un esempio, non c'è nessun controllo... se secondi arriva a zero, poi va in negativo....

ivan64:
Esempio di counter con millis

unsigned long tempo;
byte secondi=60;

void setup(){
tempo=millis();
}

void loop(){
if(millis()>=tempo+1000){
secondi--; //decremento i secondi
tempo=millis();
}

ogni 1000 mSec la variabile secondi si decrementa, ma se di seguito al if metti altro codice, verrà eseguito.
E' solo un esempio, non c'è nessun controllo... se secondi arriva a zero, poi va in negativo....

ora ho capito. GRAZIE MILLE :wink: è tutto chiaro adesso! Grazie ancora!

un'altra cosa che non mi spiego, per quale motivo al conto alla rovescia quando arriva a 9-8-7-6 visualizza sul display 90 80 70 60 ??? GRazie!

d3xt3r84:
un'altra cosa che non mi spiego, per quale motivo al conto alla rovescia quando arriva a 9-8-7-6 visualizza sul display 90 80 70 60 ??? GRazie!

Stai usando un LCD? Cancella lo zero finale, che è rimasto lì probabilmente dal "10" che precedeva :stuck_out_tongue:

leo72:

d3xt3r84:
un'altra cosa che non mi spiego, per quale motivo al conto alla rovescia quando arriva a 9-8-7-6 visualizza sul display 90 80 70 60 ??? GRazie!

Stai usando un LCD? Cancella lo zero finale, che è rimasto lì probabilmente dal "10" che precedeva :stuck_out_tongue:

quindi devo fare un lcd.clear() ? ci ho provato però mi cancella tutto... e se metto un delay di 1000ms siamo punto e da capo... che comunque mi blocca l'esecuzione di codice ;(

Stampa uno spazio dopo l'ultima cifra se il numero è minore di 10 (quindi corto solo 1 cifra).zero

leo72:
Stampa uno spazio dopo l'ultima cifra se il numero è minore di 10 (quindi corto solo 1 cifra).zero

SEI un grande! Ti ringrazio veramente tantissimo :wink:

devo cercare di eliminare tutti i delay in quanto voglio che venga fatto tutto in realtime :wink:

se ti posso chiedere un'altra cosa....

ho fatto si che ogni secondo venga eseguito un tono sul buzzer con la funzione tone(pin, nota, durata);
quando però sullo stesso pin del buzzer usato per il tone voglio metterlo al livello HIGH quindi digitalWrite(pin, HIGH); non mi funziona e mi rimane a livello basso....

come posso risolvere questa cosa? Grazie mille :smiley:

La tone usa i timer per pilotare un'onda quadra su uno specifico pin. Quando tone imposta quel pin, il pin è pilotato dal timer. Lo stato che imposti viene poi modificato dalla libreria stessa.

leo72:
La tone usa i timer per pilotare un'onda quadra su uno specifico pin. Quando tone imposta quel pin, il pin è pilotato dal timer. Lo stato che imposti viene poi modificato dalla libreria stessa.

quindi per far suonare forte il buzzer devo collegarlo sia al pin che imposto per TONE che ad un'altro pin che andrò ad impostare il digitalWrite?

poi un'altra domanda... xkè quando faccio tone si sente bassissimo il buzzer?

GRAZIE MILLEEEEEEEEEEEEEEEEEEEEE :smiley:

C'è la "fiera del millis" sta settimana?? :slight_smile:

d3xt3r84:

leo72:
La tone usa i timer per pilotare un'onda quadra su uno specifico pin. Quando tone imposta quel pin, il pin è pilotato dal timer. Lo stato che imposti viene poi modificato dalla libreria stessa.

quindi per far suonare forte il buzzer devo collegarlo sia al pin che imposto per TONE che ad un'altro pin che andrò ad impostare il digitalWrite?

No...

poi un'altra domanda... xkè quando faccio tone si sente bassissimo il buzzer?

Forse dipende dai collegamenti. O dal tipo di buzzer, se è pilotabile a 5V da un pin dell'Arduino (con R) oppure se necessita di transistor pilota perché lavora ad una tensione maggiore (es 12V).

leo72:
Forse dipende dai collegamenti. O dal tipo di buzzer, se è pilotabile a 5V da un pin dell'Arduino (con R) oppure se necessita di transistor pilota perché lavora ad una tensione maggiore (es 12V).

Forse il buzzer e' fatto per buzzare di suo e non con il tone
Il tone lo vedo meglio con un altoparlantino

Come sempre ragazzi vi ringrazio tantissimo per le vostre risposte.... che per chi come me è agli inizi sono fondamentali ed utilissime :wink:

Il buzzer è in questione è il seguente

http://www.anteipaolucci.it/buzzer/450-buzzer-piezoceramico-con-circuito-oscillatore.html

Alimentazione: 3 ÷ 24 V
Ovviamente ho messo una resistenza i 1K in serie limitando la corrente in transito e per proteggere le porte di Arduino....
Quando lancio un DigitalWrite si sente bello forte.... però io dovrei farlo suonare tipo allarme con vari toni.... cercando in giro non ho trovato risposta oltre alla libreria Tone per generare dei segnali a varie frequenze....

Intanto vi segnalo anche il sito dal quale acquisto: http://www.anteipaolucci.it

ha tutto per i nostri progetti è fornitissimo! se qualcosa non c'è in inventario te la ordina ed in poco tempo arriva :wink:

d3xt3r84:
Il buzzer è in questione è il seguente
http://www.anteipaolucci.it/buzzer/450-buzzer-piezoceramico-con-circuito-oscillatore.html

Mi pare che ci sia scritto ben chiaro che ha il suo oscillatore
Quindi e' fatto per essere alimentato e basta , emettendo pertanto un suono in base al suo oscillatore interno

Sicuramente per fare quello che vuoi tu non va bene
Ci vuole un altoparlante o trasduttore similare
In vari kit di arduino e' presente un altoparlante , tipo questo http://www.robot-domestici.it/joomla/categories/Arduino/arduino-kit/arduino-uno-starter-kit
Li e' indicato 2W 8ohm
A naso non credo sia collegabile direttamente ad una uscita ma sicuramente cercando trovi tutte le info del caso
Per esempio qui http://arduino.cc/en/Tutorial/tone

brunol949:

d3xt3r84:
Il buzzer è in questione è il seguente
http://www.anteipaolucci.it/buzzer/450-buzzer-piezoceramico-con-circuito-oscillatore.html

Mi pare che ci sia scritto ben chiaro che ha il suo oscillatore
Quindi e' fatto per essere alimentato e basta , emettendo pertanto un suono in base al suo oscillatore interno

Sicuramente per fare quello che vuoi tu non va bene
Ci vuole un altoparlante o trasduttore similare
In vari kit di arduino e' presente un altoparlante , tipo questo http://www.robot-domestici.it/joomla/categories/Arduino/arduino-kit/arduino-uno-starter-kit
Li e' indicato 2W 8ohm
A naso non credo sia collegabile direttamente ad una uscita ma sicuramente cercando trovi tutte le info del caso
Per esempio qui http://arduino.cc/en/Tutorial/tone

Grazie mille della risposta :wink:

Ovviamente per ogni funzione ci vuole il componente adatto :wink: xkè comunque io sentivo quelle musichette dei buzzer e pensavo andasse bene qualsiasi componente :smiley: Grazie ancora!!!

pablos:
C'è la "fiera del millis" sta settimana?? :slight_smile:

quoto, tra l'altro tutti della serie "multitasking" :grin: