Duda secuencia leds

Necesito realizar que los LED en AMBOS extremos de la tira comiencen como encendidos, luego muévelos uno hacia el otro, que parezca que rebotan entre sí, y luego regresan al final.

He realizado el siguiente codigo.

Lo que sucede es que cada uno va para un lado y no coinciden en el mismo punto.

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ledDelay(65); // retraso entre tiempos
int sentido = 1;
int ledActual = 0;
int ledAnterior=6;
int ledAnterior2=10;
unsigned long marcaTiempo;

void setup() {
for (int x=0; x<10; x++) { // Ajustar los pines como de salida.
pinMode(ledPin[x], OUTPUT); }
marcaTiempo = millis();
}

void loop() {
if ((millis() - marcaTiempo) > ledDelay) {
cambiarLed();
marcaTiempo = millis();
}
}

void cambiarLed() {
for (int x=0; x<6; x++) { // Apagamos los leds
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[ledActual],HIGH); // Enciendo el led actual
ledActual += sentido; // Pado al siguiente led

                                                         // Cambio el sentido del movimiento si he llegado al principio
                                                         // o al fin de la tira de leds.
          if (ledActual == 5) {sentido = -1;}
          if (ledActual == 0) {sentido = 1;}

for (int x=6; x<10; x++) { // Apagamos los leds
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[ledAnterior],HIGH); // Enciendo el led actual
ledAnterior+= sentido; // Pado al siguiente led

                                                         // Cambio el sentido del movimiento si he llegado al principio
                                                         // o al fin de la tira de leds.
          if (ledAnterior2 == 6) {sentido = -1;}
          if (ledAnterior == 0) {sentido = 1;}

}

Por favor, edita el código para que aparezca correctamente entre las etiquetas code y se visualice correctamente.

Vas bien encaminado, pero tienes algunos problemas que solventar.

ledPin debe ser un array, si no lo haces así el compilador tira error:

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

Por otro lado, la variable ledDelay la defines de una manera rara, debería ser asi:

int ledDelay = 50;

En el setup no inicias bien los pines como salida, debes hacer:

for (int x=0; x<10; x++) {
  pinMode(ledPin[x], OUTPUT);
}

De hecho el error más recurrente es que olvidas que ledPin es un array con los pins y cada vez que escribes sobre un pin lo haces sobre el array, no sobre el pin.

Una vez solucionado el problema con esa variable ya podemos ver cosas funcionando.

Dado que vas a apagar todos los leds a la vez, ¿por qué no lo haces en un solo "for"?

 for (int x = 0; x < 10; x++) { 
  digitalWrite(ledPin[x], LOW);
 }

Luego cuando realizas la secuencia de la otra esquina, no tienes en cuenta que el sentido es contrario. Su sumas el sentido irán desplazandose en el mismo sentido que los primeros. Deberias restar.

Por otro lado no hace falta que hagas dos cambios de sentido. Cuando los leds de la izquierda han hecho su secuencia, también lo habrán hecho los de la derecha, así que puedes ahorrarte unas líneas de código.

Por cierto, ten en cuenta que en los array se empieza contando desde 0, así, el led del pin 13 se corresponde con la posición 9 del array. Por lo tanto, ledAnterior deberia empezar en 9.

Lo mismo ocurre cuando avances en el array, si la variable ledActual vale 4 en realidad estas en la posición 5, y si no cuenta: 0, 1, 2, 3 y 4.

Con todo eso el código te queda más o menos así:

byte ledPin[10] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
const int ledDelay = 500; // retraso entre tiempos
int sentido = 1;
int ledActual = 0;
int ledAnterior = 9;
int ledAnterior2 = 10;
unsigned long marcaTiempo;

void setup() {
  for (int x = 0; x < 10; x++) { // Ajustar los pines como de salida.
    pinMode(ledPin[x], OUTPUT); 
    digitalWrite(ledPin[x], LOW);
  }
  marcaTiempo = millis();
}

void loop() {
  if ((millis() - marcaTiempo) > ledDelay) {
    cambiarLed();
    marcaTiempo = millis();
  }
}

void cambiarLed() {
  // Apagamos los leds
  for (int x = 0; x < 10; x++) { 
    digitalWrite(ledPin[x], LOW);
  }

  digitalWrite(ledPin[ledActual], HIGH); // Enciendo el led actual. 
  ledActual += sentido; // Pado al siguiente led
  digitalWrite(ledPin[ledAnterior], HIGH); // Enciendo el led actual
  ledAnterior -= sentido; // Pado al siguiente led

  // Cambio el sentido del movimiento si he llegado al principio
  // o al fin de la tira de leds.
  if (ledActual == 4) {
    sentido = -1;
  }
  if (ledActual == 0) {
    sentido = 1;
  }
}
1 Like

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Hola vitorjam:

En tu código de replica,que funciona correctamente, creo que sobra (residuo del anterior)
... `` int ledAnterior2 = 10; " ....
Verdad ???
Un saludo !!!

Si. Sobra.

1 Like

Aquí propongo una solución con un enfoque diferente, menos inteligente, más de fuerza bruta.

Haces una secuencia de los patrones que quieres ver en tu tira de LEDs y la envías después de que pase el tiempo deseado.


unsigned int patrones[] = {
  0b0000000000,
  0b1000000001,
  0b0100000010,
  0b0010000100,
  0b0001001000,
  0b0000110000,
  0b0001001000,
  0b0010000100,
  0b0100000010,
  0b1000000001
};

const int numLeds = 10;
unsigned int pin[numLeds] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

const unsigned long ledDelay = 65;
unsigned long ultimaVez = 0;

void setup() {
  for (int i = 0; i < numLeds; i++) {
    pinMode(pin[i], OUTPUT);
  }
}

void loop() {
  cambiarLed();

  // hacer algo mas
}


void cambiarLed() {
  unsigned long t = millis();
  if (t - ultimaVez > ledDelay) {
    static int n = 0; // numero del patron que vamos a mostrar
    
    actualizaLEDs(patrones[n]);

    // calcular siguiente numero de patron, 0 si llegamos al final de la lista
    n = (n + 1) % (sizeof(patrones) / sizeof(patrones[0]));
    
    ultimaVez = t;
  }
}


// actualiza la tira de LEDs con el patron deseado. Maximo 16 LEDs
void actualizaLEDs(unsigned int patron) {
	// procesamos bit por bit
  for (int i = 0; i < numLeds; i++) {
    digitalWrite(pin[i], bitRead(patron, i));
  }
}
1 Like

mancera 1979

Muy bueno !!!!!

Un saludo a México !!! :smiley: :cocktail:

Saludos! :hugs:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.