Como encender los leds de un cubo individualmente?

Hola compañeros de programación. Empecé con el arduino hace poco, quiero hacer cubos led desde lo más simple y pequeño como un 2x2x2 hasta lo que surja.
Estoy con el 2x2x2 utilizando el sistema de 4 columnas y 2 filas conectadas a un transistor NPN.

Mi pregunta es la siguiente:
¿Cómo consigo encender cada led uno seguido del otro?
La primera capa es fácil. En el momento de activar la segunda capa, obviamente se encienden todos los leds, ya todas las columnas están encendidas.

No he encontrado mucha información al respecto. Solo un método que consiste en decirle que led quiero encender y el que se enciende "sin querer" decirle que se apague con un delay muy corto. Pero no acabo de entenderlo.
Agradecería una explicación sobre como poder controlar cada led individualmente sin encender otros por como está el sistema montado.


void setup() {
  for (int pin = 6; pin < 12; pin++) {
    pinMode(pin, OUTPUT);
  }
}

void loop() {

oneByOne();

}

void oneByOne(){

  digitalWrite(10, HIGH);                //Activo la primera fila
  for (int pin=6; pin<10;pin++){   //Se encienden los leds de la primera fila individualmente
    digitalWrite(pin, HIGH);
    delay(500);
  }
  digitalWrite(11, HIGH);                //Activo segunda fila.   Por lo tanto se enciende todo el cubo

}

Tienes que hacer multiplexado.
Primero enciendes los LED que corresponda de una fila y activas su transistor, luego los de la otra fila y activas su transistor (previo desactivar el otro, claro).

Gracias @MaximoEsfuerzo , desconocía el término multiplexado y ya me he informado, pero toda la información es sobre displays de leds 8x8 o displays numéricos de 7 leds. Se me está haciendo complicado trasladar esos conceptos al cubo led, pero lo conseguiré!

Quizá no me he explicado bien, quiero que cada led se encienda individualmente cada 500ms y se mantenga encendido hasta que estén todos encendidos.

@MazimoEsfuerzo Creo que lo que intentaba hacer es muy complicado para mi en estos momentos, primero tendré que aprender bien el concepto de multiplexión y aplicarlo.
Para ello he querido encender los leds de cada fila diagonalmente y la otra fila la diagonal inversa.
Hasta aqui todo bien, pero quiero que se vayan intercalando cada medio segundo.
He conseguido que hagan el primer cambio, pero no entiendo porque no cambian una segunda vez y así sucesivamente las veces que desee

void diagonales() {
  int currentMillis = 0;
  int previousMillis = 0;
  int intervalo = 500;

  currentMillis = millis();

  if (currentMillis - previousMillis >= intervalo) {
     previousMillis = currentMillis;

    //Primera fila estado 1
    for (int pin = 6; pin < 11; pin = pin + 2) {  //Encender columnas pares + transistor Fila 1
      digitalWrite(pin, HIGH);
    }
    for (int pin = 7; pin < 12; pin = pin + 2) {  //Apagar columnas impares + transistor Fila 2
      digitalWrite(pin, LOW);
    }
    delay(mp);  //Multiplexación
    //Segunda fila
    for (int pin = 6; pin < 11; pin = pin + 2) {  //Apagar columnas pares + transistor Fila 1
      digitalWrite(pin, LOW);
    }
    for (int pin = 7; pin < 12; pin = pin + 2) {  //Encender columnas impares + transistor Fila 2
      digitalWrite(pin, HIGH);
    }
    delay(mp);  //Multiplexación
  } 
  {
    //Primera Fila estado 2
    for (int pin = 7; pin < 10; pin = pin + 2) {  //Encender columnas impares + transistor Fila 1
      digitalWrite(pin, HIGH);
      digitalWrite(10, HIGH);
    }
    for (int pin = 6; pin < 9; pin = pin + 2) {  //Apagar columnas pares + transistor Fila 2
      digitalWrite(pin, LOW);
      digitalWrite(11, LOW);
    }
    delay(mp);  //Multiplexación

    //Segunda Fila
    for (int pin = 6; pin < 9; pin = pin + 2) {  //Encender columnas pares + transistor Fila 2
      digitalWrite(pin, HIGH);
      digitalWrite(11, HIGH);
    }
    for (int pin = 7; pin < 10; pin = pin + 2) {  //Apago columnas impares + transistor Fila 1
      digitalWrite(pin, LOW);
      digitalWrite(10, LOW);
    }
    delay(mp);
  }
}

No uses delay() en algo que requiere actualización para poder lograr que el ojo lo vea como algo continuo porque el delay() detiene operaciones y verás parpadeos.

te refieres al delay que utilizo para que la multiflexación sea posible?
Entre los dos estado no hay delay, al ponerlo obviamente genera un error al proceso de multiplexación. Por lo tanto como hago para que el estado1 se quede x tiempo antes de pasar al estado2?

Primero tienes que ser paciente!!
Ir a Documentación, y leer los tutoriales de como se usa millis() pero en tu caso no basta con eso. Ya lo has usado.
Debes además crear una máquina de estados, para que todo se ejecute a su ritmo si detenerse.

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