Contar Pulsos de un botón para 3 Led.[RESUELTO]

Hola comunidad de arduino, estoy haciendo un proyecto de 3 LED y 1 BOTOM lo que quiero hacer es que al presionar 3 veces el botón se prenda el LED rojo, 2 Veces presionado el botón, led amarillo y 1 una vez el led verde.

1 push = Led verde encendido.
2 push = Led amarillo encendido.
3 push = led rojo encendido.

Se me es un poco difícil con la propiedad loop que se me remite y no logra almacenar cuantas veces presiono el boton para que de imedianto, pase al led rojo al presionar el botón 3 veces

Hasta ahorita solo he logrado que lo presiono una vez y se prende el verde otra vez y prende el amarillo y asi lo ara en secuencia, pero yo no quiero que haga esa secuencia

Aqui les dejo el codigo que tengo hasta ahorita, espero pueda ayudarme con mi error:

int botomStatus = 0;
int botomAnterrior = 0;
int botomAnterrior2 = 0;
int status = 0;

void setup(){
pinMode(1, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);

pinMode(2, INPUT);

}
void loop(){

botomStatus = digitalRead(2);

if (botomStatus == HIGH && botomAnterrior == LOW) {
status = status + 1;
delay(10);
}

botomAnterrior = botomStatus;

if(botomStatus == false && botomAnterrior2 == true){

switch (status)
{
case 1:
digitalWrite(6, HIGH);
digitalWrite(4, LOW);
digitalWrite(1, LOW);
break;
case 2:
digitalWrite(6, LOW);
digitalWrite(4, HIGH);
digitalWrite(1, LOW);
break;
case 3:
digitalWrite(6, LOW);
digitalWrite(4, LOW);
digitalWrite(1, HIGH);
break;
default:
status = 0;
digitalWrite(6, LOW);
digitalWrite(4, LOW);
digitalWrite(1, LOW);
break;
}

}

botomAnterrior2 = botomStatus;

}

Conexion:

Espero pueda ayudarme de antemano gracias y espero igual me haya explicado, gracias :slight_smile:

DEPUES DE UN BUEN TIEMPO AQUI LES COMPARTO LA SOLUCION.

 int botomStatus = 0;
 int botomAnterrior = 0;
 int status = 0;
int x=0;
int concurrencia = 0;
boolean compareTo = false;
void setup(){
  pinMode(1, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  
  pinMode(2, INPUT);

}
void loop(){


            
                while(true){
                    botomStatus = digitalRead(2);
                       
                       
                       if (botomStatus == HIGH && botomAnterrior == LOW) {
                              status = status + 1;                            //Condicion que verifica si el usuario a presionado el botom
                              delay(10);
                              Serial.print("hola");
                        }
                        
                    x=concurrencia%2;
                          
                          
                       if(status != 0 && x==0 && concurrencia==80){  
                            
                            compareTo=true;                                 //Condicion que da luz verde a la condicion de las variables
                            Serial.println(status);
                            break;
                   
                          }
                  
                       if(status != 0){
                         delay(20);
                          concurrencia++;                                   //concurrencia o concatenacion de las veces que paso, sirve para dar unos 10 seg depues de presinar
                        }                                                   //una vez el boton para verificar si se volvera a presionar o no.
                     
                        
                    botomAnterrior = botomStatus;

              
                
              }
                

               




                
                if(compareTo == true){                                  //Aqui valora la condicion si se cumplio una anterior, que el "status" sea diferente de 0

                    switch (status)
                    {
                        case 1:
                            digitalWrite(6, HIGH);
                            digitalWrite(4, LOW);
                            digitalWrite(1, LOW);
                            status = 0;
                            compareTo=false; 
                            concurrencia = 0;
                            break;
                        case 2:
                            digitalWrite(6, LOW);
                            digitalWrite(4, HIGH);
                            digitalWrite(1, LOW);
                             status = 0;
                             compareTo=false; 
                             concurrencia = 0;
                            break;
                        case 3:
                            digitalWrite(6, LOW);
                            digitalWrite(4, LOW);
                            digitalWrite(1, HIGH);
                            status = 0;
                            compareTo=false;
                            concurrencia = 0;
                            break;
                        default:
                            status = 0;
                            digitalWrite(6, LOW);
                            digitalWrite(4, LOW);
                            digitalWrite(1, LOW);
                            compareTo=false;
                            concurrencia = 0;
                            break;
                    }
                
                }


                
            
     
}

Video:

Hola.

Tendrías que hacer otra cosa..

si pulso el botón-> contador++;

eso dentro de un bucle, y cuando hayas acabado de pulsar las veces que quieras, que salga del bucle y:

si contador=1-> encender verde
si contador=2-> encender amarillo
si contador=3-> encender rojo

if ( digitalRead(13) == HIGH ) //cuando el pulsador está presionado
  {
     
      if ( digitalRead(13) == LOW )//cuando deja de estar presionado, cuenta
      {
         contador++;              
         delay (100);     debounce
      }
  }





if (contador==1)
  {
    encender led...
  }

Espero que te sirva.

Un saludo!

Hay algo que no entiendo en tu código, se supone que almacenara la variable contador que guardara las veces que a presionado pero si

pones en el loop que remite tantas veces y una velocidad del procesador del arduino cuando yo presione otra vez ya la sentencia pasaría a verificar en que estado quedo la variable contador y prendería led verde, ahora ya quedo guardado 1 en contador cuando yo vuelva a presionarlo se sumara 2 y prenderá el led amarillo y así asta llegar al led rojo, lo que yo quiero

es algo como un ciclo

algo así: mientras( presionamos el botom una, dos ò tres veces) as esto: cuéntame cuantas veces lo presiono, cuando salga de ahí

valorarme en "switch" la variable contador:
si es 1 led verde.
si es 2 led amarillo.
si es 3 led rojo.

el código que tengo me los va prendiendo según yo los valla apretando, si yo lo presiono 3 veces se prende el verde, amarillo y al final queda el rojo prendido, yo solo quiero que me guarde el contador y luego valore la variable, ¿Como lo hago?

Hola.
Si te pones a presuponer cosas sin probar, lo más posible es que te equivoques.
Primero prueba lo que te he dicho porque es el camino que tienes que darle al proyecto. Luego, si algo no te gusta vamos viendo =)

if ( digitalRead(13) == HIGH ) //cuando el pulsador está presionado
  {
     
      if ( digitalRead(13) == LOW )//cuando deja de estar presionado, cuenta
      {
         contador++;              
         delay (100);     debounce
      }
  }





if (contador==1)
  {
    encender led...
contador=0;
  }

Un saludo.

PD:he añadido -contador=0; se me había olvidado, y es muy importante para que se reinicie la variable.

int contador;

void setup(){
pinMode(1, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);

pinMode(2, INPUT);

}
void loop(){

if ( digitalRead(13) == HIGH ) //cuando el pulsador está presionado
{

if ( digitalRead(13) == LOW )//cuando deja de estar presionado, cuenta
{
contador++;
delay (100); //debounce
}
}

if (contador==1)
{
digitalWrite(6, HIGH);
contador=0;
}

if(contador == 2) {
digitalWrite(4, HIGH);
contador=0;

}

if(contador == 2) {
digitalWrite(1, HIGH);
contador=0;

}

}

Hola, así quedaría el código?? lo probé y no enciende los led :confused:

 int contador;

void setup(){
  pinMode(1, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  

}
void loop(){

if ( digitalRead(2) == HIGH ) //cuando el pulsador está presionado
  {
     
      if ( digitalRead(2) == LOW )//cuando deja de estar presionado, cuenta
      {
         contador++;              
         delay (100);     //debounce
      }
  }





if (contador==1)
  {
    digitalWrite(6, HIGH);
contador=0;
  }

if(contador == 2)  {
  digitalWrite(4, HIGH);
  contador=0;

}

if(contador == 2)  {
  digitalWrite(1, HIGH);
  contador=0;

}
            
     
}

Prueba así. Es que no estoy utilizando variables para el pulsador. Así sería directamente leyendo el pin:if ( digitalRead(2) == LOW )
Un saludo.

Si no lo avía visto el error,
ya lo corregí, aparentemente solo prende el verde, presiono mas veces el botom y sigue en verde, que paso?

int contador=0;

void setup(){
pinMode(1, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);

pinMode(2, INPUT);

}
void loop(){

if ( digitalRead(2) == HIGH ) //cuando el pulsador está presionado
{

if ( digitalRead(2) == LOW )//cuando deja de estar presionado, cuenta
{
contador++;
delay (100); //debounce
}
}

if (contador==1)
{
digitalWrite(6, HIGH);
contador=0;
}

if(contador == 2) {
digitalWrite(4, HIGH);
contador=0;

}

if(contador == 3) {
digitalWrite(1, HIGH);
contador=0;

}

}

El código que he aportado, sirve para que aprendas a manejar un contador de pulsos. Ya lo tienes. Ahora lo que tienes que hacer es entenderlo, practicar, cambiarlo...

No se apaga porque en ningún sitio del código pone que se apague.

A partir de ahora está tu dedicación =)

Te puedo resolver dudas pero no escribirte códigos, porque yo ando algo liado ahora.

Un saludo y lo siento.

Pero pregunta dudas que para eso estamos!

jajajaja, en realidad se usar los contadores, pero no se si me explico bien o que, mira

el código que aporte yo, yo lo hise, quisas esta un poco confuso, ahí también realizo contador, claro un poco a la antigua quería asegurarme de todo
no conozco bien el lenguaje así que fui a lo seguro

"contador = contador + 1" = "contador++;"

pero eso no es lo importante te digo que mi condigo funciona, solo que necesito ese ciclo o como programar eso sumar la variable "contador" primero antes
de que me la valore en los if o switch, porque???

sencillo aver si me explico mejor asi:

supongamos que estos son los led
[V] = verde
[A] = Amarillo
[R] = Rojo
cuando tenga una "e" el led esta encendido
cuando tenga una "a" el led esta apagado
esto es el botom presionado
[:::]
y esto es el botom apagado
[---]

ahora vamos a correr mi código:

Presiono el botom una vez:
[:::]
Se enciende el botom verde
[Ve] [A] [R]

Presiono el botom otra vez (OJO la variable tenia uno antiormente ahora tiene 1+1=2):
[:::]
Se APAGA el verde y se enciende el amarillo
[Va] --> [Ae] [R]

Presiono el botom otra vez (OJO la variable tenia dos antiormente ahora tiene 2+1=3):
[:::]
Se APAGA el amarillo y se enciende el Rojo
[V] [Aa] --> [Re]

Presiono el botom otra vez (OJO la variable tenia tres antiormente ahora tiene 3+1=4):
[:::]
Se APAGA el rojo y asi queda todos apagados
[V] [A] [Ra]
y contador es = 0;

Pero yo no quiero que pase así, yo lo que quiero es que me valore la variable y luego cumpla su valor según tenga por ejemplo

Presiono tres veces el botom (OJO la variable tenia 0 anteriormente ahora tiene 0+3=3, porque debió sumar 3 veces una por cada presión que hice)
ahora valora la variable en switch:
[:::]
estan apagados todos!!! y se encendera o cumplirá la condición que tenga "contador == 3" osea el rojo y no ir de uno en uno asta llegar al rojo....
[Va] [Aa] [Re]

Espero esta explicación se entienda mejor :confused:

En vez de dar "palos de ciego" seria mejor que te aprendas un poco de programacion de arduino o busques ejemplos hechos para comprender.

Que te escriban el codigo o no te preocupes de desarrollarlo y menos de entenderlo no te hace ningun favor.

Por cierto la explicacion no se entiende ni con la piedra roseta...

Unos enlaces para que aprendas:
http://arduino.cc/es/Tutorial/HomePage

http://arduino.cc/es/Guide/Introduction

http://dfists.ua.es/~jpomares/arduino/page_01.htm

Heke:
Por cierto la explicacion no se entiende ni con la piedra roseta...

jajajajajaja +1

Si no van a aportar nada por favor asteganse de responder en este post, Espero alguien que si tenga la capacidad de entender estos tipos de problemas y su experiencia me diga la repuesta. Gracias de todo modo.

¿Y ÉSTE?

WaSoM:
Si no van a aportar nada por favor asteganse de responder en este post,

¿No he aportado nada?

¿No te das cuenta, que tu esquema no lo entiende ni el tato?

supongamos que estos son los led
[V] = verde
[A] = Amarillo
[R] = Rojo
cuando tenga una "e" el led esta encendido
cuando tenga una "a" el led esta apagado
esto es el botom presionado
[:::]
y esto es el botom apagado
[---]

ahora vamos a correr mi código:

Presiono el botom una vez:
[:::]
Se enciende el botom verde
[Ve] [A] [R]

Presiono el botom otra vez (OJO la variable tenia uno antiormente ahora tiene 1+1=2):
[:::]
Se APAGA el verde y se enciende el amarillo
[Va] --> [Ae] [R]

Presiono el botom otra vez (OJO la variable tenia dos antiormente ahora tiene 2+1=3):
[:::]
Se APAGA el amarillo y se enciende el Rojo
[V] [Aa] --> [Re]

Presiono el botom otra vez (OJO la variable tenia tres antiormente ahora tiene 3+1=4):
[:::]
Se APAGA el rojo y asi queda todos apagados
[V] [A] [Ra]
y contador es = 0;

WaSoM:
Espero alguien que si tenga la capacidad de entender estos tipos de problemas y su experiencia me diga la repuesta. Gracias de todo modo.

¿@Heke no, verdad? XDDDDDDDDD

Pues nada. Voy a ver si cojo más experiencia y tal para entender un contador de pulsos.

Por cierto, para poder entender lo que dices necesitamos que lo hagas en castellano.
Un saludo!

Quizás aprendas un poco, mas ya lo resolví solo falta codearlo y lo pongo, no era un simple contador de pulsos bueno el problema no era contar en si los pulsos, pero bueno. Algún día si dejas tu ignorancia aprenderás chico.

WaSoM:
Quizás aprendas un poco, mas ya lo resolví solo falta codearlo y lo pongo, no era un simple contador de pulsos bueno el problema no era contar en si los pulsos, pero bueno. Algún día si dejas tu ignorancia aprenderás chico.

Parece que tienes problemas de trastorno bipolar.
Increíble. Aprende tu a escribir que no se yo que es peor.
Que te vaya bien machote.

Besis :*

No te esfuerces Pascual, es imposible descifrar lo que este hombre quiere decir...

Pues sí, es una pérdida de tiempo.

Si yo puedo tener trastorno o todo lo que ustedes, pero la diferencia es que yo se programar y ustedes no llega ni a un "hola mundo" aun que yo no sepa escribir en español, se dictarle a la maquina pequeño algún día tendrá lógica.

Hola,

Lo que le falto a tu codigo es que al presionar el boton, esperara por mas pulsos por un lapso de tiempo, una vez completado ese tiempo o numero de iteraciones sin cambio es que segun el valor del contador encienda el led adecuado y apague los otros.

Saludos.

Hola a todos ya que mucho me preguntaron como lo resolví aquí se los comparto:

Como dice Luis solo necesitamos esperar un tiempo, algo así pensé yo no estoy muy familiarizado con el lenguaje pero esta fue mi manera de resolverla, seguro otros podrán compartir otros métodos, que viva la información en la red.

 int botomStatus = 0;
 int botomAnterrior = 0;
 int status = 0;
int x=0;
int concurrencia = 0;
boolean compareTo = false;
void setup(){
  pinMode(1, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  
  pinMode(2, INPUT);

}
void loop(){


            
                while(true){
                    botomStatus = digitalRead(2);
                       
                       
                       if (botomStatus == HIGH && botomAnterrior == LOW) {
                              status = status + 1;                            //Condicion que verifica si el usuario a presionado el botom
                              delay(10);
                             
                        }
                        
                    x=concurrencia%2;
                          
                          
                       if(status != 0 && x==0 && concurrencia==80){  
                            
                            compareTo=true;                                 //Condicion que da luz verde a la condicion de las variables
                            
                            break;
                   
                          }
                  
                       if(status != 0){
                         delay(20);
                          concurrencia++;                                   //concurrencia o concatenacion de las veces que paso, sirve para dar unos 10 seg depues de presinar
                        }                                                   //una vez el botom para verificar si se volvera a presionar o no.
                     
                        
                    botomAnterrior = botomStatus;

              
                
              }
                

               




                
                if(compareTo == true){                                  //Aqui valora la condicion si se cumplio una anterior osea que "status" sea diferente de 0

                    switch (status)
                    {
                        case 1:
                            digitalWrite(6, HIGH);
                            digitalWrite(4, LOW);
                            digitalWrite(1, LOW);
                            status = 0;
                            compareTo=false; 
                            concurrencia = 0;
                            break;
                        case 2:
                            digitalWrite(6, LOW);
                            digitalWrite(4, HIGH);
                            digitalWrite(1, LOW);
                             status = 0;
                             compareTo=false; 
                             concurrencia = 0;
                            break;
                        case 3:
                            digitalWrite(6, LOW);
                            digitalWrite(4, LOW);
                            digitalWrite(1, HIGH);
                            status = 0;
                            compareTo=false;
                            concurrencia = 0;
                            break;
                        default:
                            status = 0;
                            digitalWrite(6, LOW);
                            digitalWrite(4, LOW);
                            digitalWrite(1, LOW);
                            compareTo=false;
                            concurrencia = 0;
                            break;
                    }
                
                }


                
            
     
}