Contador de estados en led

Hola gente, sigo con el proyecto de leds del que pregunté algo de bluetooth hace tiempo, no he logrado hacer ese control pero bueno, por otro lado tengo también la necesidad de que cuando se cumpla un ciclo se muestre de alguna manera, se me ocurrió un display de 7 segmentos. Busque en la red y solo encontré como hacer el contador con un botón, intente hacer lo mismo pero con el estado del led, en lugar del botón con el led, pero solo no me ha salido, requiero que cada que se encienda un determinado led en la matriz de los 27 charlieplexada incremente el contador. Alguien tiene idea de algún código para el sketch? Muchas gracias!!!

No entiendo lo que quieres hacer?

Que amable en darle seguimiento, gracias, explico un poco.
ya logré hacer un arreglo charlieplexado de leds para que se muevan como el auto increíble, usando 6 pines y funciona, después modifique para que solo encendieran los leds extremos alternados, mi intención ahora es que a través de pulsar un botón cambie entre todo el barrido de leds a encender solo los extremos. He visto ejemplos donde declarando cada led hacen secuencias y lo ponen en caso de que cambie la secuencia, de este tipo por ejemplo:

a)

 0 0 0 0 0 0 0 1
 0 0 0 0 0 0 1 0
 0 0 0 0 0 1 0 0
 .
 .
 1 0 0 0 0 0 0 0

b)
 
 0 0 0 1 1 0 0 0
 0 0 1 1 1 1 0 0
 0 1 1 1 1 1 1 0
 1 1 1 1 1 1 1 1

con algo como esto:

if (digitalRead(A0)==HIGH){ //Al presionar el pulsador
saltar++; // Cambia de secuencia
if (saltar>3){ //Solo hay 4 secuencias 0,1,2 y 3 al ser 3 . .
saltar=0; // Vuelve a secuencia 0

con programación de secuencias asi:

}
void secuencia1(){
for (int i=2; i<=9; i++){ //Pin 2 al 9
digitalWrite(i, HIGH); // Prenda pin actual
digitalWrite(i-1,LOW); // Apage el Anterior
delay(50); // retardo entre prender y apagar
}
for (int i=9; i>=2; i--){ //Al contrario de la
digitalWrite(i, LOW); // anterior secuencia va de 9 a 2
digitalWrite(i-1,HIGH);
delay(50);
}

La mía es esto:

  flashLED(A, B);
  flashLED(A, C);
  flashLED(A, D);
  flashLED(B, A);
  flashLED(B, C);
  flashLED(B, D);
  flashLED(C, A);
  flashLED(C, B);
  flashLED(C, D);
  flashLED(D, A);
  flashLED(D, B);
  flashLED(D, C);

Pero no se si no se puede ya que intenté poner esto como una se las secuencias y la otra con solo la primera y ultimas líneas y no funcionó, no se si no se puede ya que estuve revisando errores al teclear y no encontré.

Muchas gracias por el apoyo!!

Ok. Te pido leas tu respuesta y dime si alguien tomando lo que tu has escrito puede ayudarte.

Personalmente necesito todo el código para luego ponerme a analizar que hiciste, que falla y como resolverlo. No se como trabajan las mentes de los demas?
Yo soy electronico y me volví programador autodidacta, de manera que no puedo hacer los pasos al la inversa.

Si no tengo nada, no visualizo el problema.

Por eso si lees las normas te queda claro que un problema debe presentarse primero con su contexto y luego presentar su código completo.
Al final todo esto que hacemos desde tu primer post es darle vuelta a algo que fácilmente y bien expuesto lo podrias haber planteado de arranque.
Ahora tu expliación esta, pero falta el código completo.

Gracias.

Gracias por tu atención, el código es esto, funciona si quito lo de las secuencias, pero no con secuencias

int A = 13;
int B = 12;
int C = 11;
int D = 10;
int brightness = 50;
long valor;           //potenciometro
int saltar=0; // Variable que indica el numero de la secuencia a ejecutarse



void setup(){
  
  Serial.begin(9600);         //Potenciometro
  Serial.println("Inicio de sketch - valores del potenciometro");

  pinMode(A, INPUT);
  pinMode(B, INPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
}

void loop(){
if (digitalRead(A1)==HIGH){ //Al presionar el pulsador
saltar++; // Cambia de secuencia
if (saltar>3){ //Solo hay 2 secuencias 0y1
saltar=0; // Vuelve a secuencia 0
}
while (digitalRead(A1)==HIGH){} // Mientras se pulsa no haga nada mas
}

if(saltar==0){ //Si es 1 inicie funcion de secuencia1
secuencia1();
}
if(saltar==1){ //Si es 2 inicie funcion de secuencia2
secuencia2();
}
   
  
// leemos del pin A0 valor en el potenciometro
valor = analogRead(A0);
  
 valor = map(valor, 0, 1022, 0, 150);

  void secuencia1(){
  // Cycle across the LEDs from right to left
  flashLED(A, B);
  flashLED(A, C);
  flashLED(A, D);
  flashLED(B, A);
  flashLED(B, C);
  flashLED(B, D);
  flashLED(C, A);
  flashLED(C, B);
  flashLED(C, D);
  flashLED(D, A);
  flashLED(D, B);
  flashLED(D, C);
  
  // Cycle across the LEDs from left to right
  flashLED(D, B);
  flashLED(D, A);
  flashLED(C, D);
  flashLED(C, B);
  flashLED(C, A);
  flashLED(B, D);
  flashLED(B, C);
  flashLED(B, A);
  flashLED(A, D);
  flashLED(A, C);
  }
  void secuencia2(){
    flashLED(A, B);
    flashLED(D, C);
  }
}


///////////////////////////////////////////
// Function to flash LED and change the LED
// pins back to INPUT.
///////////////////////////////////////////
void flashLED(int hi, int lo) {
  pinMode(hi, OUTPUT);
  pinMode(lo, OUTPUT); 
  digitalWrite(hi, HIGH);
  digitalWrite(lo, LOW);
  delay(valor);
  pinMode(hi, INPUT);
  pinMode(lo, INPUT);
}

a ver si hay alguna idea ya que no soy muy vivo en esto.. Gracias!

A ver asi...

int A = 13;
int B = 12;
int C = 11;
int D = 10;
int brightness = 50;
long valor;           //potenciometro
int saltar     = 0; // Variable que indica el numero de la secuencia a ejecutarse
bool boton, botonAnt = false;

void setup(){

  Serial.begin(9600);         //Potenciometro
  Serial.println("Inicio de sketch - valores del potenciometro");

  pinMode(A, INPUT);
  pinMode(B, INPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
}

void loop(){

  botonAnt = boton;
  boton = digitalRead(A1);
  if (boton && !botonAnt) { //Al presionar el pulsador
      saltar++; // Cambia de secuencia
      if (saltar>3){ //Solo hay 2 secuencias 0y1
          saltar = 0; // Vuelve a secuencia 0
      }
      // while (digitalRead(A1)==HIGH){} // Mientras se pulsa no haga nada mas
  }

  if (saltar == 0){ //Si es 1 inicie funcion de secuencia1
      secuencia1();
  }
  if (saltar == 1){ //Si es 2 inicie funcion de secuencia2
      secuencia2();
  }

  // leemos del pin A0 valor en el potenciometro
  valor = map(analogRead(A0), 0, 1022, 0, 150);
}

void secuencia1() {
  // Cycle across the LEDs from right to left
  flashLED(A, B);
  flashLED(A, C);
  flashLED(A, D);
  flashLED(B, A);
  flashLED(B, C);
  flashLED(B, D);
  flashLED(C, A);
  flashLED(C, B);
  flashLED(C, D);
  flashLED(D, A);
  flashLED(D, B);
  flashLED(D, C);

  // Cycle across the LEDs from left to right
  flashLED(D, B);
  flashLED(D, A);
  flashLED(C, D);
  flashLED(C, B);
  flashLED(C, A);
  flashLED(B, D);
  flashLED(B, C);
  flashLED(B, A);
  flashLED(A, D);
  flashLED(A, C);
}

void secuencia2() {
  flashLED(A, B);
  flashLED(D, C);
}

///////////////////////////////////////////
// Function to flash LED and change the LED
// pins back to INPUT.
///////////////////////////////////////////
void flashLED(int hi, int lo) {
  pinMode(hi, OUTPUT);
  pinMode(lo, OUTPUT); 
  digitalWrite(hi, HIGH);
  digitalWrite(lo, LOW);
  delay(valor);
  pinMode(hi, INPUT);
  pinMode(lo, INPUT);
}

Ohhh!!! que amableeeeeeee, sirve, hice pruebas con lo que me apoyaste y funciona, solo una pregunta, esto no sirve para el caso de un push button?
ya que le intenté poner uno de esos y me di cuenta que cuando le conecto la energía se va a la secuencia 2, si lo conecto en tierra hace la secuencia 1, en ambos casos con el cable a A1, ahí bastaría con decirle que cuando se presione el botón cambie?

Hay una comida cuando pases por acá!

:smiley:

Aca lo tienes Resistencia pull up y pull down

|500x451

Si usas el pulsador entre pin y GND, entonces debes definirlo asi

pinMode(pin, INPUT_PULLUP);

Lo anterior es con resistencia externa.

Surbyte, agradezco mucho tu apoyo y paciencia, me aprovecharé una vez mas de este post ya que tiene relación con el mismo proyecto, ahora quiero agregarle un contador de siete segmentos que vaya contando cada vez que se enciende un led, el del extremo que sea, he buscado como contar los pulsos, pero no he encontrado nada con referencia a algo semejante de la matriz que uso de leds, específicamente quiero que se incremente el numero cuando suceda "flashLED(A, C);" Muchas gracias de antemano!!!

Bien, pongamos todo en contexto para retormar la idea.

Tienes todo conectado charlieplexado. Para crear un DISPLAY de 7 Segmentos los leds charlieplexados deben estar asociados a segmentos. Cual es la asociación?

Aborde como si estuvieras a mi lado, una disculpa, explico, es una serie de 30 leds en linea, que con la charlieplexación hice que se moviera tipo knight rider, digamos que inicia en la derecha, y al volver a encender el led inicial es un ciclo para mi proyecto, ahora quiero agregarle un display, mas he visto que hay varios tipos, no se ni cual es el mejor ya que gracias a la charlieplexación solo utilice 6 pines de un arduino pro mini, le puse un potenciómetro lineal y un switch de balancin, ahi recibí tu yuda para cambiar el switch por boton, ahora me gustaria ponerle un contador, con dos digitos me seria duficiente ya que mi maximo seria de 60 ciclos, y ya viendome quiza aprovechado, saber si cuando llega a encenderse el led de cada extremo pueda hacer que vibre algun motor.

Que amable en estar tan al pendiente surbyte!!!

Bien dos digitos usando lo que queda de 6-2 (rx tx) - 1 potenciomentro digamos en A0.

Nos quedan al menos 6 pines de 7 a 13 para comandar los displays Podrias hacerlo con 74HC595. 2 si quieres dos digitos pero puedes ampliarlo a lo que gustes Mira este hilo

Podrias hacerlo con MAX7219 y ya viene con módulo listo

Podrias usar un decodificador 7 segmentos como el CD4511 u otro, lo que requiere 4 pines para del decoder mas 2 para hacerlo multiplexado. Ver código |500x176

El mas ximple el MAX7219 algo asi link

|500x370

Muchas gracias por tu rápido apoyo, me pondré a ver y trabajar con lo que comentas, seguro en breve regresare con alguna dudilla, aunque espero sea con una evolución mas al proyecto ya que quiero meterle unos vibradores y quizá hasta audio, ahí voy aprendiendo. Muchas gracias nuevamente!! !