chiarimento codice gestione LED

Salve a tutti, a livello amatoriale sto imparando e praticando circuiti + codice attraverso un libro che si chiama ARDUINO PER NEGATI.
Come primo progetto ho realizzato seguendo le indicazioni del libro una serie di LED (10 in tutto) che si accendono ad un intervallo di 40ms, il risultato finale restituisce un effetto simile alla famosa striscia LED di Supercar.
Adesso ho provato a modificare il codice in modo che i LED si accendino alle estremità e che in sequenza si accendino fino ad incontrarsi in mezzo per poi tornare indietro.
Dopo vari tentativi sono riuscito a realizzare il codice, il problema è che sono riuscito ad ottenere il risultato in parte casualmente e non ne capisco la logica, specialmente nell’ultima parte del codice, quando ho usato la funzione IF.
Ho usato la funzione IF per controllare una metà dei led (5 led) in modo che si accendino in sequenza dal LED 0 fino al LED 5 e poi torni indietro al LED 0, ma incomprensibilmente le due funzioni IF che ho inserito per controllare i primi 5 LED mi controllano anche gli altri LED rimanenti e il tutto funziona e bene.
Secondo la mia logica avrei dovuto inserire altre due funzioni IF per controllare i led dal 6 al 10 ma se lo faccio il tutto non funziona più.
Non riesco proprio a capirne la logica, qualcuno sa aiutarmi? Qui sotto allego il codice e la foto del circuito.

Grazie Marco

// A variable to set a delay time between each LED int
int delayTime = 40;

 // A variable to store which LED we are currently working on
int currentLED = 0;
int lastLED = 9;

 // A variable to store the direction of the travel
int dir = 1;

// A variable to store the last time we changhed something
long timeChanged = 0;

// An array to hold the value for each LED pin
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

void setup() {
  // Set all pins for OUTPUT
  for (int i=0; i<10; i++) {
    pinMode(ledPin[i], OUTPUT);
  }

 // Record the time once the setup has completed
  timeChanged = millis();
}

void loop() {
  // check weather it has been long enough
  if ((millis() - timeChanged) > delayTime) {

    //turn off all of the LEDs
    for (int i=0; i<10; i++) {
      digitalWrite(ledPin[i], LOW);
    }

    // Light the current LED
    digitalWrite(ledPin[currentLED], HIGH);
    digitalWrite(ledPin[lastLED], HIGH);

    // Increase the direction value 9up or down)
    currentLED = currentLED + dir;
    lastLED = lastLED - dir;

    // if we are at the end of the row, change direction
    if (currentLED == 4) {
      dir = -1;
    }
    if (currentLED == 0) {
      dir = 1;
    }
 
  // sotre the current time as the time we last changed LEDs
  timeChanged = millis(); 
  }
}

Partiamo col dirti (opinione personale e opinabile) che la serie "per negati" è totalmente inadatta a spiegare come lavorare in un mondo che per quanto lo vogliamo trasportare nell'ambito amatoriale è comunque un agglomerato di materie ingegneristiche, che vanno studiate su libri competenti e non su guide o tutorial.
Chiusa parentesi, l'algoritmica non è una materia da affrontare con casualità. Si pensa il progetto e si trova il corrispettivo sistema logico di funzionamento, fatto questo si codifica.
Hai presente quando al elementari ti dicono che non si può non essere in grado di leggere la propria scrittura, beh si può estendere questo concetto alla programmazione con "Non si può non essere in grado di comprendere la logica del proprio algoritmo". Non esistono problemi con una sola implementazione valida nessuno su questo forum ti risponderà mai che il tuo algoritmo è sbagliato se questo funziona, ti potrà dire che puo essere implementato meglio, o ottimizzato.
Veniamo al succo del topic la logica piu semplice che vedo per un implementazione del genere sono due contatori che ad ogni ciclo uno incrementa e uno decrementa accendendo il LED corrispondente e spegnendo quello precedentemente attivato, arrivati agli estremi si invertono, quello che prima decrementava inizierà ad incrementare.

SE, e ribadisco, se, ho ben capito, tu vuoi accendere i led :

0 e 9
1 e 8
2 e 7
3 e 6
4 e 5

... SE è così ti basta usare una formuletta ... come vedi il secondo LED è pari a 9 meno il valore del primo LED ... quindi il for va si da 0 a 4 e per il secondo LED non ti serve null'altro che una sottrazione per sapere quale accendere.

Sempre SE ho capito ciò che vuoi ... ::slight_smile:

Guglielmo

Guarda, oggi è la befana e sono allegro :grinning:

bool toward = true;
byte i = 4, j = 13;
void loop() {
  digitalWrite(i, LOW);//Spengo i LED correnti
  digitalWrite(j, LOW);

  if(toward) {//In base alla direzione attuale incremento o decremento gli indici
    i++;
    j--;
  } else {
    i--;
    j++;
  }
  
  digitalWrite(i, HIGH);//Accendo i nuovi LED
  digitalWrite(j, HIGH);

  if(i == 13 || i == 4) toward = !toward;//Se siamo agli estremi inverto la direzione per il prossimo ciclo
  
  delay(500);//Aspetto mezzo secondo prima del prossimo ciclo
}

Questo è un esempio di come potresti implementarlo in modo semplice ed elementare, cerca di capire la logica.

Emmm ... Roberto ... c'è un particolare ...

byte ledPin = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

... i tuoi digitalWrite invece vanno sui pin 0 .. 10

Guglielmo

P.S.: ... e occhio all'indice che può andare solo da 0 a 9 :wink:

Eh va beh si tratta di cambiare due numerini xD, dai l'ho già fatto. Comunque il mio era un codice a titolo di esempio, non voleva essere un sostituto del suo, volevo solo che capisse la logica che dovrebbe avere uno sketch.

RobertoBochet:
Eh va beh si tratta di cambiare due numerini xD, dai l'ho già fatto.

:smiley: :smiley: :smiley: ... sai bene che qui gli utenti si limitano a ... copia/incolla :grin: :grin: :grin:

Guglielmo

Hai ragione, speriamo che il nostro amico sia superiore all'utente medio! :grinning: