variazione delay con un pulsante
ciao tutti, sono un bel pò ignorante in tutto quello che riguarda l'elettronica e ho un problema con lo sketch del progettino che sto provando portare termine.
in sostanza vorrei fare accendere 32 led consecutivamente alla pressione di un tasto o comunque sia un input e poterne variare la durata. per 32 led da collegare ad arduino ho usato due integrati tlc5940 collegati in serie tra loro e modificando lo sketch basic della libreria per il tlc5940 riesco comandarli alla pressione del tasto, in sostanza mi parte la sequenza dei 32 led. parte che l'ultimo dei 32 led mi rimane acceso fine sequenza e non capisco il perchè mi son reso conto che avevo la necessità di qualcos'altro per variare il delay tra l'accensione di un led e l'altro.
allora ho optato per un secondo pulsante con un display 7 segmenti che mi dovrebbe far variare il tempo variando anche la numerazione sul 7 segmenti, solo che dopo aver scritto lo sketch che ora vi allego il risultato è che alla pressione del pulsante per variare il tempo sul display compare la numerazione ma parte automaticamente la sequenza, per fortuna variando tempi come voluto, ma non capisco perchè non aspetti l'input per far partire la sequenza...
questo è lo sketch:
per favore aiutatemi capire in cosa sbaglio o se ho bisogno di usare altre funzioni per avere due azioni distinte e separate
edit mod: per favore includi il codice usando gli appositi tag
in sostanza vorrei fare accendere 32 led consecutivamente alla pressione di un tasto o comunque sia un input e poterne variare la durata. per 32 led da collegare ad arduino ho usato due integrati tlc5940 collegati in serie tra loro e modificando lo sketch basic della libreria per il tlc5940 riesco comandarli alla pressione del tasto, in sostanza mi parte la sequenza dei 32 led. parte che l'ultimo dei 32 led mi rimane acceso fine sequenza e non capisco il perchè mi son reso conto che avevo la necessità di qualcos'altro per variare il delay tra l'accensione di un led e l'altro.
allora ho optato per un secondo pulsante con un display 7 segmenti che mi dovrebbe far variare il tempo variando anche la numerazione sul 7 segmenti, solo che dopo aver scritto lo sketch che ora vi allego il risultato è che alla pressione del pulsante per variare il tempo sul display compare la numerazione ma parte automaticamente la sequenza, per fortuna variando tempi come voluto, ma non capisco perchè non aspetti l'input per far partire la sequenza...
questo è lo sketch:
code: [select]
#include "tlc5940.h"
int pinbutton = 0; //input partenza
int pintimer = 1; //input regolazione timer
int counter = 0; //variabile stato pulsante timer
int laststate = 0; //stato pulsante timer
int timerstate = 0; //stato del timer
int stato = 0; //stato input partenza
int ultimo = 0;
int = 4; //pin 7 segmenti
int b = 5;
int c = 7;
int d = 8;
int e = 12;
int f = 2;
int g = 6;
int timer; //variabile per il delay
void setup()
{
pinmode(a, output);
pinmode(b, output);
pinmode(c, output);
pinmode(d, output);
pinmode(e, output);
pinmode(f, output);
pinmode(g, output);
pinmode(pinbutton, input);
pinmode(pintimer, input);
/* call tlc.init() setup tlc.
can optionally pass initial pwm value (0 - 4095) channels.*/
tlc.init();
}
/* loop create knight rider-like effect if have leds plugged
tlc outputs. num_tlcs defined in "tlc_config.h" in the
library folder. after editing tlc_config.h setup, delete the
tlc5940.o file save changes. */
void loop(){
//lettura pulsante per timer
timerstate =digitalread(pintimer);
delay(50);
if(timerstate != laststate) {
if(timerstate = high) {
if(counter<=9) counter++; //contatore da 0 9
else {counter=0;}
switch (counter){ //risultato alla pressione del tasto
case 0:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, high);
break;
case 1:
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(a, high);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, high);
digitalwrite(g, high);
timer = 100;
break;
case 2:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(g, low);
digitalwrite(e, low);
digitalwrite(d, low);
digitalwrite(c, high);
digitalwrite(f, high);
timer = 200;
break;
case 3:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(g, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, high);
digitalwrite(f, high);
timer = 300;
break;
case 4:
digitalwrite(a, high);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, low);
digitalwrite(g, low);
timer = 400;
break;
case 5:
digitalwrite(a, low);
digitalwrite(b, high);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, high);
digitalwrite(f, low);
digitalwrite(g, low);
timer = 500;
break;
case 6:
digitalwrite(a, low);
digitalwrite(b, high);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
timer = 600;
break;
case 7:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, high);
digitalwrite(g, high);
timer = 700;
break;
case 8:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
timer = 800;
break;
case 9:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, high);
digitalwrite(f, low);
digitalwrite(g, low);
timer = 900;
break;
case 10:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
break;
}
}
stato = digitalread(pinbutton);{
delay(200);
if(stato != ultimo){
if (stato==high)
{
int direction = 1;
for (int channel = 0; channel < num_tlcs * 16; channel ++) {
/* tlc.clear() sets grayscale values zero, not send
them tlcs. to send data, call tlc.update() */
tlc.clear();
/* tlc.set(channel (0-15), value (0-4095)) sets grayscale value for
1 channel (15 out15 on first tlc, if multiple tlcs daisy-
chained, channel = 16 out0 of second tlc, etc.).
value goes off (0) on (4095).
tlc.clear(), function sets data, tlc.update()
send data. */
if (channel == 0) {
direction = 1;
} else {
tlc.set(channel - 1, 0);
}
tlc.set(channel, 4095);
/* tlc.update() sends data tlcs. this when leds will
change. */
tlc.update();
delay(timer);
}}}}}}
per favore aiutatemi capire in cosa sbaglio o se ho bisogno di usare altre funzioni per avere due azioni distinte e separate
edit mod: per favore includi il codice usando gli appositi tag
il "case = 10" non imposta la variabile timer come nel caso di case 9 e gli altri, questo è voluto o no?
dovresti usare delay() solo in caso di ritardi di tempo ridotti, perchè la chiamate delay impegna il microcontroller ad eseguire null'altro che il codice presente nell funzione delay, allo scadere del termnine la torna ad eseguire la riga successiva alla chiamata.
per evitare questo spreco di risorse esiste la funzione millis() o micros(), questa ritorna un valore long che contiene il tempo espresso in millesimi di secondo conteggiato dal momento in cui la scheda viene alimentata al momento in cui avviene la chimata funzione millis(). in sostanza ogni millesimo di secondo questa la variabile ritornata da millis() contiene una unità in più, se salvi il valore e poi fai dei confronti puoi stabilire se è o meno passato x millessimi.
nell'ide c'è l'esempio blink senza delay dove viene mostrato il pattern comune di millis().
ciao.
dovresti usare delay() solo in caso di ritardi di tempo ridotti, perchè la chiamate delay impegna il microcontroller ad eseguire null'altro che il codice presente nell funzione delay, allo scadere del termnine la torna ad eseguire la riga successiva alla chiamata.
per evitare questo spreco di risorse esiste la funzione millis() o micros(), questa ritorna un valore long che contiene il tempo espresso in millesimi di secondo conteggiato dal momento in cui la scheda viene alimentata al momento in cui avviene la chimata funzione millis(). in sostanza ogni millesimo di secondo questa la variabile ritornata da millis() contiene una unità in più, se salvi il valore e poi fai dei confronti puoi stabilire se è o meno passato x millessimi.
nell'ide c'è l'esempio blink senza delay dove viene mostrato il pattern comune di millis().
ciao.
Arduino Forum > International > Italiano > Software (Moderator: leo72) > variazione delay con un pulsante
arduino
Comments
Post a Comment