Array....maledetti Array

Premesso che questo topic è in qualke modo collegato al topic "millis()....maledetto millis()" l'obbiettivo è semplice far accendere 4 led prima in una direzione,poi nell'altra,poi bloccare un led acceso,,,,,,il tutto senza usare stringhe dormienti tipo "delay,while o do while,for".

Ora seguiti e rimaneggiati i consigli precedenti questo è lo sketch che ovviamente compila.

#define G 8//giallo
#define V 9//verde
#define R 10//rosso
#define B 11//blu

byte led[]={G,V,R,B};
byte stato=0;
byte passo=0;
unsigned long tempo;
unsigned int velocita=200;

void setup() 
{
 Serial.begin(9600);
 pinMode(led[stato], OUTPUT);
}

void Monitor()
{ 
  Serial.print("TEMPO ");
  Serial.println(tempo);
  Serial.print("STATO ");
  Serial.println(stato);
  Serial.print("PASSO ");
  Serial.println(passo);
  Serial.println(" ");
}

void Avanti1()
{
 if(millis()-tempo>=velocita)
   {
    tempo+=velocita;
    digitalWrite(led[stato],LOW); 
    stato=(stato+1)%4;
    digitalWrite(led[stato],HIGH); 
   }
} 

void Avanti2()
{
 if(millis()-tempo>=velocita)
   {
    tempo=millis();
    digitalWrite(led[stato],LOW); 
    passo=(passo+1)%5;
    stato=passo-1;
    digitalWrite(led[stato],passo); 
   }
} 

void Indietro1()
{
 if(millis()-tempo>=velocita)
   {
    tempo+=velocita;
    stato=(stato+1)%4;
    digitalWrite(led[stato],stato);
   }
}


void loop()
{
 Monitor(); 
 Avanti1();
}

...Dunque Avanti1 funziona (copiato da un esempio)ma parte dal secondo led.
...Risolto il problema con Avanti2.

i problemi cominciano da Indietro1,,,,,ho gi fatto vari tentativi,ma non cicla indietro.

Scusa ma questa operazione cosa ti aspetti che faccia ?
pinMode(led[stato], OUTPUT);

Se pensi che metta in OUTPUT tutti i pin dichiarati nell'array ti sbagli, stai lavorando su 1 elemento dell'array, ovvero lo 0 visto che stato=0. Per lavorare su tutti gli elementi di un array DEVI usare dei cicli:

for(int i=0;i<sizeof(led);i++)  
{ pinMode(led[i],OUTPUT);
}

non voglio usare il for al momento

E comunque devi fare 4 pinMode

pinMode(led[0], OUTPUT);
pinMode(led[1], OUTPUT);
pinMode(led[2], OUTPUT);
pinMode(led[3], OUTPUT);

Puso:
non voglio usare il for al momento

Allora preparati a dover indicare ogni singolo elemento dell'array. Devi settare a output tutti i pin presenti in led, e i nodi sono O usando un for O settandoli tutti separatamente

Puso:
...Dunque Avanti1 funziona (copiato da un esempio)ma parte dal secondo led.

Inverti low e high e dovrebbe partire dal primo

Indietro deve essere uguale ad Avanti1 ma con gli high/low opposti.

AIGOR...il ciclo in avanti è funzionante.............non ho ben chiaro come fare il ciclo indietro...il tutto senza FOR. :confused:

giovepluvio...sono preparato a tutto 8)

Puso:
il tutto senza FOR.

... poi mi spieghi questa tua insensata "idiosincrasia" per il for, che è uno statement normalmente de ampiamente usato nel 'C' :o

Guglielmo

Finiscila di mettere in ogni Tuo topic la parola "maledetto". Se lo associ a qualsiasi piccolo problema che incontri é meglio che ripensi alla Tua personale visione della vita e dal mondo cercando di pensare positivo.
Ciao Uwe

Guglielmo
finche non capisco non è insensata,è semplicemente dal quel poco che ho capito una stringa dormiente.
Vorrei evitarla al momento e trovare un'altra strada.

uwefed
la parola maledetto nei miei topic...identifica solo la mia ignoranza....tipo una firma.

Puso:
finche non capisco non è insensata,è semplicemente dal quel poco che ho capito una stringa dormiente.

Ecco ... NON hai capito niente allora ...

... come ti ho già detto, piantala di andare avanti a "tentoni" cercando di scrivere pezzi di programma senza senso ed aspettando che gli altri te li mettano apposto, dato che, ed ora è ampiamente dimostrato, da tali esempi tu NON impari NULLA.

Prenditi un buon libro e STUDIA e contemporaneamente iscriviti ad un corso di programmazione in 'C' ... perché tanto con questio esempietti e prove NON arrivi da nessuna parte.

Guglielmo

Veramente il for non e' una stringa ... e' una funzione ... un po come quelle che potresti crearti tu, dove gli passi un certo numero di parametri (in questo caso gli passi la variabile su cui operare, la quantita' di volte da operare e l'operazione da fare), e lui le esegue come glie le passi, eseguendo per lo stesso numero di volte quello che metti fra le graffe ...

Se proprio ti sta antipatico il for (magari perche' ti ha fregato il posto al bar ? ... :D), puoi anche sostituirlo con un banale if o un paio di if nidificati, se proprio vuoi ... o anche un while ...

cosa intendi per non imparo nulla???
ho imparato un sacco di cose invece grazie ad esempi.......e nessuno mi ha mai messo a posto niente.
Lo ripeto..non sono il tipo"COPIA INCOLLA" ......devo solo capire.

appunto...funzione dormiente.

perche' "dormiente" ?

perchè se lo uso"il FOR"...è come usare un delay....finche non cambia si ferma tutto il resto......sto tentando di passare coi bit consigliati da Doc...ma al momento sono arenato.

Puso:
...ma al momento sono arenato.

.... e, ripeto un'ultima volta, finché NON studierai arenato rimarrai sempre. Gli esempietti vanno bene sino a quando fai lampeggiare un LED, se vuoi fare qualche cosa di più serio ... occorre molto tempo, impegno e studio.

Lo STATEMENT "for" (NON è una funzione è una struttura di controllo) NON blocca un bel nulla ... basta saperlo usare !

Guglielmo

P.S.: ... per inciso, il loop(), gira sempre, grazie ad una "for" che NON vedi, ma c'è :smiling_imp:

il LOOP è quindi un FOR velocissimo.......... :o .
tento di capirci qualkosa ...sempre per hobbistica.