Luci sequenziali

Ciao a tutti siccome sono alle prime armi con la programmazione avrei alcune domande da porre su un piccolo progetto che devo realizzare, mi spego meglio:
devo realizzare un lampeggiatore sequenziale avanti indietro con lampade a 220Vac, la parte hardware è funzionante e realizzata tramite relè di interfaccia che nello schema che allego ovviamente simulo con dei led, il mio problema nasce quando devo regolare la velocità delle lampade, ovvero forse ho sbagliato a compilare lo sketch e qui che chiedo aiuto. In pratica faccio leggere il valore del potenziometro e lo scrivo tramite il delay nel loop, il mio problema è che non riesco ad interagire col potenziometro diciamo in real time, in questo modo devo aspettare giustamente la fine del loop

int LED1 = 0; //uscita LED 1
int LED2 = 1; //uscita LED 2
int LED3 = 2; //uscita LED 3
int LED4 = 3; //uscita LED 4
int LED5 = 4; //uscita LED 5
int LED6 = 5; //uscita LED 6
int pot = A0; //Ingresso potenziometro
int potval = 0; //memorizza il valore letto su POT 
void setup()
{
pinMode(LED1,OUTPUT); //LED 1
pinMode(LED2,OUTPUT); //LED 2
pinMode(LED3,OUTPUT); //LED 3
pinMode(LED4,OUTPUT); //LED 4
pinMode(LED5,OUTPUT); //LED 5
pinMode(LED6,OUTPUT); //LED 6
}
void loop()
{
potval = analogRead(pot);
digitalWrite(LED1,HIGH);
delay(potval);
digitalWrite(LED1,LOW);
delay(potval);
digitalWrite(LED2,HIGH);
delay(potval);
digitalWrite(LED2,LOW);
delay(potval);
digitalWrite(LED3,HIGH);
delay(potval);
digitalWrite(LED3,LOW);
delay(potval);
digitalWrite(LED4,HIGH);
delay(potval);
digitalWrite(LED4,LOW);
delay(potval);
digitalWrite(LED5,HIGH);
delay(potval);
digitalWrite(LED5,LOW);
delay(potval);
digitalWrite(LED6,HIGH);
delay(potval);
digitalWrite(LED6,LOW);
delay(potval);
digitalWrite(LED5,HIGH);
delay(potval);
digitalWrite(LED5,LOW);
delay(potval);
digitalWrite(LED4,HIGH);
delay(potval);
digitalWrite(LED4,LOW);
delay(potval);
digitalWrite(LED3,HIGH);
delay(potval);
digitalWrite(LED3,LOW);
delay(potval);
digitalWrite(LED2,HIGH);
delay(potval);
digitalWrite(LED2,LOW);
delay(potval);
}

dove sbaglio ?

lo shetc è corretto, solo che pensato così, è logico che devi aspettare la fine del loop per variare la velocità, che logicamente pi lenta è più aspetti.

devi usare un altra tecnica, che ora non ricordo il nome che cambi lo stato solo se è passato un tott di tempo se non lo è il programma continua a girare.
da un occhio qui

http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

e grazie a leo72

Prova con questo sketch.

Dato che devi imparare, non ho commentato le istruzioni perché devi sforzarti di comprenderle.

Nota che i pin utili li ho fatti partire da 2, evitando lo 0 e 1 che servono alla comunicazione seriale.

byte LEDPin[5] = {
  2, 3, 4, 5, 6};

void setup() {
  for (byte I = 0; I < sizeof(LEDPin); I ++) {
    pinMode(LEDPin[I], OUTPUT);  
  }
}

void loop() {
  for (byte I = 0; I < sizeof(LEDPin); I ++) {
    LEDFlash(LEDPin[I], analogRead(A0));
  }
}

void LEDFlash(byte Pin, unsigned int TimeON) {
  digitalWrite(Pin, HIGH);
  delay(TimeON);
  digitalWrite(Pin, LOW);
}

cyberhs:
Prova con questo sketch.

Dato che devi imparare, non ho commentato le istruzioni perché devi sforzarti di comprenderle.

Nota che i pin utili li ho fatti partire da 2, evitando lo 0 e 1 che servono alla comunicazione seriale.

Grazie non avevo pensato di incorporare i pin nel ciclo for ora ci studio sopra.

Philomix:
Grazie non avevo pensato di incorporare i pin nel ciclo for ora ci studio sopra.

Grazie per l'aiuto ho compreso il ciclo for ma faccio a botte con l'IF

Allora ho abbandonato completamente quel codice buttato li per caso e ho preso spunto da quello che mi hai postato e sono giunto a questo per fare un conteggio avanti indietro con la possibilità di variare la velocità di conteggio, ora mi si presenta un'altro quesito: il tempo di lampeggio del primo e dell'utlimo pin devono essere esattamente la metà degli altri per avere una costante nel tempo, se includo nei due cicli for inclusi nel loop una condizione if ed else posso arrivare alla soluzione, ma il problema mio è che non riesco ad integrare if nel codice. Ovvero fino a quando il ciclo thispin rimane sotto a 12 il tempo T è uguale a potval a 12 va a potval/2

int pot = A0; 
int potval ; 
void setup() 
{
    for (int thisPin = 2; thisPin < 12; thisPin++)
    {
    pinMode(thisPin, OUTPUT);      
    }
}
void loop() 
{

  for (int thisPin = 2; thisPin < 12; thisPin++) 
    { 
    potval = analogRead(pot);
    potval = map(potval, 0, 1023, 25, 1000);
    digitalWrite(thisPin, HIGH);   
    delay(potval);                  
    digitalWrite(thisPin, LOW);    
    }
    for (int thisPin = 11; thisPin >= 2; thisPin--) { 
    potval = analogRead(pot);
    potval = map(potval, 0, 1023, 25, 1000);
    digitalWrite(thisPin, HIGH);
    delay(potval);
    digitalWrite(thisPin, LOW);
  }
}

Scusa ma non riesco a capire cosa tu voglia ottenere: spiegati meglio.

Nell'immagine dei collegamenti un GND è in corto con 5V (sono sulla stella linea).
Ricontrolla. 8)

PaoloP:
Nell'immagine dei collegamenti un GND è in corto con 5V (sono sulla stella linea).
Ricontrolla. 8)

hai ragione mi è scappato ora lo correggo

cyberhs:
Scusa ma non riesco a capire cosa tu voglia ottenere: spiegati meglio.

in pratica ora il conteggio è questo 1 2 3 n n n 8 9 10 10 9 8 n n n 3 2 1
mi piacerebbe capire come far eseguire un conteggio del tipo 1 2 3 n n n 8 9 10 9 8 n n n 3 2 1 in pratica mi piacerebbe che non contasse per due volte 1 e 10 essendo una sequenza avanti indietro

int NrLED = 1;
int incremento = 1:

loop()
  {
  NrLED += incremento;
  if (NrLED >=10 || NrLED<=1) incremento *= -1;
  ....
  }

Ciao Uwe

uwefed:

int NrLED = 1;

int incremento = 1:

loop()
  {
  NrLED += incremento;
  if (NrLED >=10 || NrLED<=1) incremento *= -1;
  ....
  }



Ciao Uwe

grazie per la risposta ma non riesco a capire come la condizione if interagisca con il ciclo for di quello che ho scritto