led con inseguitore

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 :slight_smile: se c'è qualcosa che non va o che non capisci nel programma basta che chiedi :wink:

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 :cold_sweat:

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 :slight_smile:

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...