ROTAZIONE LED

Ciao,
ho disposto in cerchio 8 led e volevo far scorrere 2 led in rotazione continua, con il codice che vi posto ho dei problemi nel “legare” lo scorrimento nel punto finale con quello iniziale, potete darci un’occhiata?

int pinArray[] = {2, 3, 4, 5, 6, 7, 8, 9};
int count = 0;
int timer = 1000;

void setup(){
  for (count=0;count<8;count++) {
       pinMode(pinArray[count], OUTPUT);
  }
}

void loop() {
  for (count=0;count<8;count++) {
      digitalWrite(pinArray[count], HIGH);
      digitalWrite(pinArray[count]+1, HIGH);

           delay(timer);

      digitalWrite(pinArray[count], LOW);
      digitalWrite(pinArray[count]+1, LOW);
  }



}

Grazie!

finito il for, devi aggiungere il caso speciale in cui su accende e spegne l'ultimo e il primo led, poi il loop si occupa del resto

pinArray[count]+1

sicuro di questo codice?! :D

Ciao, ho provato come dici tu ma non mi funziona... :~ conosci qualche codice alternativo che dia lo stesso risultato?

mi sa che non hai letto attentamente.

il primo pezzo, in cui suggerisco la soluzione, mi piacerebbe vedere cosa hai scritto.

il secondo pezzo, in cui ho fatto il commento di una tua riga di codice, vorrei sapere se e cosa hai capito che non va in quel pezzo di codice (il problema è SLEGATO al problema precedente)

conosci qualche codice alternativo che dia lo stesso risultato?

al volo direi usando un array circolare, eviteresti il for, e puoi ottimizzare l'accendomento spenimento del led successivo, se fai attenzione all'inizializzazione e all'eventuale fase di stop. Il codice non te lo do non perchè sono cattivo (bhe un poco sì ]:D), ma queste sono le basi di programmazione, un piccolo problema di logica, e se non impari a sbatterci la testa e capire quello che scrivi posso darti tutto il codice che vuoi ma non lo saprai mai usare.

Ciao,
questo inizio di sketch puo’ andare bene per array circolare?
Mi manca il codice che va’ all’interno del void loop… qualche suggerimento? :disappointed_relieved:
Grazie per la santa pazienza

byte led [] = {2,3,4,5,6,7,8,9};
int ciclo1 []= {2,3};
int ciclo2 []= {3,4};
int ciclo3 []= {4,5};
int ciclo4 []= {5,6};
int ciclo5 []= {6,7};
int ciclo6 []= {7,8};
int ciclo7 []= {8,9};
int ciclo8 []= {9,2};




int Count = 8;
int SPEED = 1000;


void setup () {
  for (int Pin = 0; Pin < Count; Pin++) {
    pinMode (led [Pin],OUTPUT);

  }   
}

void loop () {


}

@lesto, forse un array circolare è tecnica un pò complicata per @imho

@imho con il primo codice che hai postato non sei molto distante dalla soluzione. Certo quel codice può essere migliorato, esempio evitando il for, ma visto che la prima versione c'eri quasi, rimarrei su quella e ad ottimizzare ci penserei poi.

Con il primo codice punti sempre 2 celle dell'array e questo, come poi hai anche evidenziato tu, dà un problema. Quando sei con count=7 (cioè all'ultima cella) allora usi ANCORA count+1 per andare alla cella successiva (come ti ha detto prima @lesto). Che non c'e' !!! (ricorda che il linguaggio C/C++ non controlla se vai a leggere o scrivere oltre l'ultimo elemento di un array)

C'e' un caso speciale, quando count=7, devi accendere il secondo led NON in base a count+1 ma ...

@lesto, forse un array circolare è tecnica un pò complicata per @imho

mai detto che fosse più facile, in realtà io volevo spingerlo a correggere il suo codice... (e comunque è più facile)

Quando sei con count=7 cioè all'ultima cella allora usi ancora count+1 per andare alla cella successiva. Che non c'e' !!!

questa mi è sfuggita

questo inizio di sketch puo' andare bene per array circolare?

no, sei completamente fuori strada, ad occhio stai creando una macchina a stati.. anche questa è una soluzione!

Per fare una cosa semplice, basta usare 2 indici, uno che punta alla posizione del 1° led ed uno che punta alla posizione del 2°.

//situazione di partenza
led1 = 0
led2 = 1

//ciclo
accendo i 2 led
incremento led2
controllo che led2 non sia andato oltre l'ultima posizione: in caso affermativo, riporto a zero
incremento led1
controllo che led1 non sia andato oltre l'ultima posizione: in caso affermativo, riporto a zero
ripeto

questo è un array circolare :) (a doppio indice)

Ma è più facile da gestire così che con un ciclo for. Inoltre con lo pseudo codice la traduzione in linguaggio Arduino è semplificata.

approvo, in oltre la "distanza" tra i due indici indica quanti led resteranno accesi contemporanemaente. Nel tuo caso solo uno (ma lasciamo che il ragazzo se la cavi, direi che ne ha abbastanza sotto il sole.. anche se avrei preferito proseguire sulla sua soluzione)

Infatti, con 2 indici può accendere ben più di una coppia di led.