Ciao a 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 a portare a 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 i 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 a comandarli alla pressione del tasto, in sostanza mi parte la sequenza dei 32 led. A parte che l'ultimo dei 32 led mi rimane acceso a 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 i tempi come voluto, ma non capisco perchè non aspetti l'input per far partire la sequenza...
questo è lo sketch:
#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 a = 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() to setup the tlc.
You can optionally pass an initial PWM value (0 - 4095) for all channels.*/
Tlc.init();
}
/* This loop will create a Knight Rider-like effect if you have LEDs plugged
into all the TLC outputs. NUM_TLCS is defined in "tlc_config.h" in the
library folder. After editing tlc_config.h for your setup, delete the
Tlc5940.o file to save the 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 a 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 all the grayscale values to zero, but does not send
them to the TLCs. To actually send the data, call Tlc.update() */
Tlc.clear();
/* Tlc.set(channel (0-15), value (0-4095)) sets the grayscale value for
one channel (15 is OUT15 on the first TLC, if multiple TLCs are daisy-
chained, then channel = 16 would be OUT0 of the second TLC, etc.).
value goes from off (0) to always on (4095).
Like Tlc.clear(), this function only sets up the data, Tlc.update()
will send the data. */
if (channel == 0) {
direction = 1;
} else {
Tlc.set(channel - 1, 0);
}
Tlc.set(channel, 4095);
/* Tlc.update() sends the data to the TLCs. This is when the LEDs will
actually change. */
Tlc.update();
delay(timer);
}}}}}}
per favore aiutatemi a capire in cosa sbaglio o se ho bisogno di usare altre funzioni per avere due azioni distinte e separate
edit by mod: per favore includi il codice usando gli appositi tag