ciao a tutti e la prima volta che scrivo su questo forum e che uso arduino.
ho provato a fare un progetto che ho visto su un libbro 6 led che si accendono come la macchina di super car la sequenza era questa
si accende il primo led
pausa di 30 millisecondi
si accende il secondo
pausa di 30
si spegne il primo
pausa di 30
si accende il terzo
e cosi fino al 6 led poi lo faceva al contrario.
ho voluto modificare il codice usando il pwm fa la stessa cosa solo che al posto di spegnere il led si attenua fino a spegnersi
funziona solo che ho due problemi uno non riesco a farli andare al cotrario dal 6 al 1
e probabilmente il codice si potrebbe migliorare.
il codice e questo
define pot 0
define attesa 30
int ledPIN[]= {
2,3,4,5,6,7};
int valorePOT = 0;
int livelloLED = 0;
int led= 0;
int x= 0;
void setup()
{
for (int led= 0; led < 6; led++)
{
pinMode(ledPIN[led],OUTPUT);
}
}
void loop()
{
for (led =0;led< 6; led++)
{
analogWrite(ledPIN[led],255);
delay(10);
analogWrite(ledPIN[led +1],255);
delay(10);
for (x=255-1; x >0; x--)
{
analogWrite(ledPIN[led],x);
delayMicroseconds (500);
}
}
}
volevo chiedervi se cosi sono sulla buona strada
grazzie a tutti
Ciao baciocco, benvenuto
per farlo andare al contrario non devi far altro che aggiungere il codice con un ciclo di For con conteggio decrescente
Ma c'e' una cosa che non capisco ....
.......come fa' a funzionarti, visto che il PWM non e' su tutti i pin dell'Atmega ?
Si, i led si accendono in sequenza, ma lo spegnimento dei led sui pin 2 e 4 non puo' essere graduale, visto che non sono gestibili in PWM
i pin PWM sono quelli in cui accanto al numero del pin c'e' il simbolo ~
ciao grazie per la risposta.
ho l'arduino mega che ha 12 pwm
Perchè devi usare il PWM?
int ledPins[] = {40,41,42,43,44,45,46,47,48,49};
void setup()
{
for(int i = 0; i < 10; i++)
pinMode(ledPins[i],OUTPUT);
}
void loop()
{
int tempo= 50;
for(int i = 0; i <= 9; i++)
{
digitalWrite(ledPins[i], HIGH);
delay(tempo);
digitalWrite(ledPins[i], LOW);
}
for(int i = 9; i >= 0; i--)
{
digitalWrite(ledPins[i], HIGH);
delay(tempo);
digitalWrite(ledPins[i], LOW);
}
}
perche il codice che mi mostri e come era nel libbro
io volevo modificarlo per prendere confidenza col codice di arduino
e da una settimana che ci sto "giocando" prima usavo picaxe o basicx
e poi devo dire che con l'attenuazione del led e molto piu bello ho aggiunto altri 6 led
adesso sto provando con 3 led che si spengono sempre piu. sembra che lasciano una scia di luce "e piu bello"
questo "progetto" e solo per scopi di apprendimento per imparare i vari cicli di controllo (if,for,while, ecc.)
una cosa volevo chiedere a voi esperti.
perche molti usano delle variabili int (che occupano spazio in memoria) solo per dichiarare un pin es. int led = 2;
e non usano #define led 2 che al contrario se o capito bene non occupa memoria
per adesso con arduino sto rimanendo impressionato
a delle funzioni che ti semplificano la vita come la: map(val, vMIN, vMAX, sMIN, sMAX) per scalare valori che e una bomba
detto questo volevo approfittare per fare i complimenti a massimo banzi e al suo team , e a tutti voi sia principianti che esperti ai principianti perche con i loro problemi aiutano
a risolvere anche i miei e agli esperti perche risolvono problemi "e un po vi invidio"
ciao
io farei così:
byte ledPIN[]= {2,3,4,5,6,7};
void setup()
{
for (byte led= 0; led < 6; led++)
{
pinMode(ledPIN[led],OUTPUT);
}
}
void loop()
{
for (char led=0; led<6; led++) //ciclo for che viene ripetuto 6 volte, da 0 a 5
{
digitalWrite(ledPIN[led],HIGH); //led del pin riferito alla variabile ledPIN[led] acceso fisso
for (int fade=0; fade<256; fade++) //ciclo for che viene ripetuto 256 volte
{
if(led!=0) //controllo che il led acceso fisso non sia il primo se no andrei fuori dal vettore ledPIN
{
analogWrite(ledPIN[led-1],255-fade); //pwm calante sul led precedente al led acceso fisso
}
if(led!=5) //controllo che il led acceso fisso non sia l'ultimo se no andrei fuori dal vettore ledPIN
{
analogWrite(ledPIN[led+1],fade); // pwm crescente sul led sucessivo al led acceso fisso
}
delay(1); //aspetta 1ms, quindi la durata di questo ciclo è di circa 256ms
}
}
for (char led=5; led>=0; led--) //ciclo for che viene ripetuto 6 volte, da 5 a 0
{
digitalWrite(ledPIN[led],HIGH); //led del pin riferito alla variabile ledPIN[led] acceso fisso
for (int fade=0; fade<256; fade++) //ciclo for che viene ripetuto 256 volte
{
if(led!=0) //controllo che il led acceso fisso non sia il primo se no andrei fuori dal vettore ledPIN
{
analogWrite(ledPIN[led-1],fade);// pwm crescente sul led sucessivo al led acceso fisso
}
if(led!=5) //controllo che il led acceso fisso non sia l'ultimo se no andrei fuori dal vettore ledPIN
{
analogWrite(ledPIN[led+1],255-fade); //pwm calante sul led precedente al led acceso fisso
}
delay(1); //aspetta 1ms, quindi la durata di questo ciclo è di circa 256ms
}
}
}
dovrebbe fare un che c'è sempre un led acceso e i 2 led attorno che fanno si accendono e spengono gradualmente
se c'è qualcosa che non va o che non capisci nel programma basta che chiedi 
baciocco:
una cosa volevo chiedere a voi esperti.
perche molti usano delle variabili int (che occupano spazio in memoria) solo per dichiarare un pin es. int led = 2;
e non usano #define led 2 che al contrario se o capito bene non occupa memoria
questo me lo sono sempre chiesto anch'io 
Prendi il mio codice postato prima e mettici byte al posto di int
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
...
for(byte i = 0; i <= 9; i++)
...
for(byte i = 9; i >= 0; i--)
... non funziona più
Ps:
- I PWM della mega 2560 sono 15 ma non sono in sequenza, quindi con un for solo non riesci a farlo
- libro con una 'b' sola
pablos:
Prendi il mio codice postato prima e mettici byte al posto di int
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
...
for(byte i = 0; i <= 9; i++)
...
for(byte i = 9; i >= 0; i--)
... non funziona più
perchè un non esce mai dal secondo for, il byte è sempre >= 0, io nel mio programma ho usato un char che invece può essere minore di 0
il byte va da 0 a 255
il char va da -128 a +127
l'int va da -32768 a 32767
nel reference trovi anche tutti gli altri tipi di variabili: Arduino - Home
conosco lo spazio occupato dalle var.
quello che conta è che venga utilizzati meno spazio possibili nelle var dichiarate pubbliche tipo questa
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
le altre all'interno delle funzioni vengono distrutte al termine della stessa.
A parità di righe impiegate, tempo impiegato per fare il prog e memoria utilizzata penso sia più conveniente usare un int in questo specifico caso. Semplicemente un mio parere
pablos:
conosco lo spazio occupato dalle var.
quello che conta è che venga utilizzati meno spazio possibili nelle var dichiarate pubbliche tipo questa
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
le altre all'interno delle funzioni vengono distrutte al termine della stessa.
A parità di righe impiegate, tempo impiegato per fare il prog e memoria utilizzata penso sia più conveniente usare un int in questo specifico caso. Semplicemente un mio parere
io non sono d'accordo, da quello che so il micro fa meno "fatica" a calcolare le variabili più "corte" e unsigned rispetto a quelle signed... Quindi l'unsigned char e il byte dovrebbero essere quelle migliori...