Pulsadores en Arduino

Hola cómo están? Les quería comentar que tuve una clase donde vimos este código y quería saber si me podrían explicar la función que cumplen los delays, lo hice mas corto porque era un poco mas largo. Sepan disculpar por los errores al abrir un tema soy bastante nuevo en esto saludos

const int pulsador_suma = 12;
const int pulsador_resta = 11;
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;

int contador = 0;

void setup()
{
    pinMode(pulsador_resta, INPUT_PULLUP);
    pinMode(pulsador_suma, INPUT_PULLUP);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);
}

void loop(){
    int lectura_resta = digitalRead(pulsador_resta);
    int lectura_suma = digitalRead(pulsador_suma);

    if (lectura_resta == LOW)   {
            delay(500);
            if (contador == 0)            {
                contador = 0;

            } else
            {
                contador = contador - 1;

            }
    }

    if (lectura_suma == LOW)    {
        delay(500);
        if (contador == 6)
        {
            contador = 6;

        } else
        {
            contador = contador + 1;

        }
    }

    if (contador == 0)
    {

        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);

    }

    if (contador == 1)
    {

        digitalWrite(led1, HIGH);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);


    }
    if (contador == 2)
    {

        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);


    }

    if (contador == 3)
    {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, LOW);


    }

    if (contador == 4)
    {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
    }

Código Editado por Moderador

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Anti rebotes para los pulsadores.

Date cuenta de que esto no hace absolutamente nada útil.

Dice “si la variable contador es igual a cero, entonces hazla igual a cero”.

Anda por ahí otro caso con 6.

En relación a tu pregunta, delay() es una función cuyo trabajo es “espera un tiempo y no hagas absolutamente nada durante ese tiempo; no permitas que el procesador haga nada más”

if (contador > 0)
{
  contador=contador-1;
}
if (contador < 6)
{
  contador=contador+1;
}

Por otro lado, edita el post y adjunta el código de acuerdo a las Normas de foro en español, punto 7.

Las ley a las normas del foro, pero hay cosas que no entiendo recién empiezo en todo este tema

Hola gracias por la respuesta. El código fue hecho en una clase de un curso que estoy haciendo y la verdad ha cosas que no entiendo.
En este caso lo que vi es que si no pongo el delay al apretar un pulsador se prenden todos los leds en vez de hacerlo de a uno

Disculpa mí ignorancia que sería anti rebotes?. El contador está hecho con dos pulsadores. Cuanfo aprietas uno de los mismos va prendiendo de a uno los leds que para este caso serían 6 y cuando aprietas el otro pulsador apaga de a un led.
Lo que vi es que si no pongo esos delays se prenden todos al mismo tiempo y se apagan todos al mismo tiempo

Lo que no entiendo es porqué se apagan o prenden todos sin ese delay

Estos delay generan un tiempo de espera que en tu programa tiene una doble función.

Es muy común (pasa casi siempre) que los botones, switches y demás reboten varias veces durante breves momentos cuando son accionados. Durante esos momentos el botón dará valores LOW y HIGH en sucesión rápida, que puede ser fácilmente captada por el Arduino. Usualmente se programa un tiempo de espera de unos 50mS para que termine el rebote y tener una lectura estable del botón. Tu delay se encarga de eso.

El otro efecto que tienen tus tiempos de espera es visual, es decir, hacer que los leds duren encendidos o apagados por un tiempo perceptible para el ojo humano. Considera que el tiempo de ejecución del loop sin los delays debe andar alrededor de 1mS. Es tan rápido que parece que todos los leds prenden al mismo tiempo, pero no es así.

Lo anterior parece como una justificación para usar delay, pero es necesario considerar que en un programa más elaborado se convierte en un estorbo porque bloquea la ejecución de lo demás.

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 (<CODE/>)




Por favor no sigas respondiendo sin editar tu posteo inicial. Si tienes dudas me escribes por privado.

Hola ahi lo modifique creo que asi esta bien, gracias por la ayuda

Creo que en base a lo que me decís el delay frenaría esos rebotes y por ejemplo se prendería un led y esperaría 500ms y después seguiría con la siguiente acción

¿Qué parte de que tienes que seleccionar todo el código y pulsar <CODE/> no entiendes?

Ya me lo explico un moderador, disculpa por no entender, paciencia que todos estamos aprendiendo. Si recurro a este foro es por ayuda

Y cómo quedó?

Si te referis al código que subí lo estuve viendo y ya pude entenderlo. Lo voy a tratar de modificar para que no haya algunas redundancias que me marcaron.

Muchas gracias por la ayuda

Una vez que lo modifiques súbelo de nuevo. No alteres la publicación anterior. Eso hace que los comentarios que se hacen no tengan sentido cuando alguien visita este hilo en el futuro

Ya lo modifiqué yo porque le puso tantas llamadas a la etiqueta CODE que jamás lo resolvería.

1 Like

Corte y pegue como me comentaste, pero la verdad no sé qué paso

Hola @jp0293

Como dices que eres nuevo, (....todos hemos sido nuevos alguna vez) te remito el código (limpiado) que ya te reformo @Surbyte .

Te sobraban los leds 5 y 6 en pin mode y faltaba llave de cierre de loop .
A partir de aquí, retoca lo que quieras del codigo !!!

Un saludo !!... :cocktail:... :cocktail:
..

    /*
    
       PULSADORES SUMA - RESTA
    
       Si se pulsa suma: aumenta contador
       Si se pulsa resta: disminuye contador

       Segun Numero contador: cambia encendido leds 
    
    */
    
    const int pulsador_suma = 12;
    const int pulsador_resta = 11;
    const int led1 = 2;
    const int led2 = 3;
    const int led3 = 4;
    const int led4 = 5;
        
    int contador = 0;
    
    void setup()
    {
      pinMode(pulsador_resta, INPUT);
      pinMode(pulsador_suma, INPUT);
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(led3, OUTPUT);
      pinMode(led4, OUTPUT);     
    }
    
    void loop() 
    {
      int lectura_resta = digitalRead(pulsador_resta);
      int lectura_suma = digitalRead(pulsador_suma);
    
      if (lectura_resta == HIGH) 
    {
        delay(500);
      if (contador == 0)    
     {
          contador = 0;   
    } 
    else
    {
       contador = contador - 1;   
    }
    }   
      if (lectura_suma == HIGH) 
   {
        delay(500);
      if (contador == 6)
    {
       contador = 6;    
    } 
    else
    {
      contador = contador + 1;   
    }
      }   
      if (contador == 0)
      {    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);   
      }    
      if (contador == 1)
      {   
        digitalWrite(led1, HIGH);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);   
     }
      if (contador == 2)
      {  
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);    
      }   
      if (contador == 3)
      {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, LOW);   
      }    
      if (contador == 4)
      {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
      }

  } // LL-LOOP

 // ***************** FIN  ********************