Go Down

Topic: ROTAZIONE LED (Read 702 times) previous topic - next topic

imho

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?



Code: [Select]
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!

lesto

#1
Sep 19, 2013, 12:22 pm Last Edit: Sep 19, 2013, 12:23 pm by lesto Reason: 1
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

Code: [Select]
pinArray[count]+1

sicuro di questo codice?!  :D
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

imho

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

lesto

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)

Quote
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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

imho

Ciao,
questo inizio di  sketch puo' andare bene per array circolare?
Mi manca il codice che va' all'interno del void loop....  qualche suggerimento? :smiley-sad-blue:
Grazie per la santa pazienza


Code: [Select]

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 () {


}

nid69ita

#5
Sep 19, 2013, 04:04 pm Last Edit: Sep 19, 2013, 04:16 pm by nid69ita Reason: 1
@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 ...
my name is IGOR, not AIGOR

lesto

Quote
@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)

Quote
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

Quote
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!
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

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

Code: [Select]
//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

lesto

questo è un array circolare :) (a doppio indice)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

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

lesto

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)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

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

Go Up