Retraso en botón pulsador según el código que ejecute

Buenas gente.

Hice una prueba con Arduino Leonardo, en la cual hago que al accionar un interruptor de palanca, este no detecte todo el tiempo en "ON", sino que sólo haga un pulso, como si se tratase de un pulsador común. Lo mismo para cuando se vuelve al interruptor en posición "OFF", que lo detecte como un pulsador común. La duración de "ON" como la de "OFF" la establecí en 60 ms.
Hay 2 códigos, uno proporcionado por ChatGPT el cual funciona y tiene "if" anidados (es el que está comentado como "//CON ESTE CÓDIGO SI FUNCIONA OK:" y ese mismo código lo edité para que no queden los "if" anidados, el cual está comentado como "//CON ESTE CÓDIGO FUNCIONA MAL, CAUSA MUCHO RETRASO AL PRESIONAR EL "BOTÓN_1":"

PROBLEMA: cuando ejecuto el código editado por mi, al pulsar el boton_1 (el cual es un pulsador común) éste detecta la pulsación con retraso (un poco más de un segundo).

¿A qué se debe el retraso del boton_1 cuando ejecuto mi código?

NOTA: en el código proporcionado se pueden ver los 2 códigos para la correcta visualización, pero no está de más aclarar que cuando ejecuto uno, comento el otro.

Acá el código:

#include <Joystick.h>

//Constantes para definir los pines de Arduino:
#define BOTON_1 4
#define PALANCA_1 9 //Interruptor de palanca 

bool estadoAnteriorInterruptor = HIGH; //Estado inicial del interruptor (Apagado) PULL_UP

Joystick_ Joystick; //Instancia del objeto Joystick

void setup() {
  pinMode(BOTON_1, INPUT_PULLUP); //Entradas con resistencias internas de PullUp
  pinMode(PALANCA_1, INPUT_PULLUP);
  Joystick.begin(); //Inicialización del objeto Jostick
}

void loop() {
  bool estadoActualInterruptor = digitalRead(PALANCA_1) == LOW;   
  
  //BOTONES:
  if (digitalRead(BOTON_1) == LOW) {
    Joystick.setButton(0, 1); //Primer parámetro es el botón virtual, segundo parámetro su estado 1=ON
  }
  else {
    Joystick.setButton(0, 0); //Botón virtual apagado. 
  } 

  //CON ESTE CÓDIGO FUNCIONA MAL, CAUSA MUCHO RETRASO AL PRESIONAR EL "BOTÓN_1": 
  if (estadoActualInterruptor != estadoAnteriorInterruptor && estadoActualInterruptor) { 
    // El interruptor pasó a ON
    Joystick.setButton(5, 1);         // Pulsar botón Nº 6 en joystick
    delay(60);          // Esperar breve periodo
    Joystick.setButton(5, 0);         // Soltar botón   
    // Actualizar estado anterior del interruptor
    estadoAnteriorInterruptor = estadoActualInterruptor; //Pone el "estadoAnteriorInterruptor" en modo LOW y FALSE
  }
  else if(estadoActualInterruptor != estadoAnteriorInterruptor) {
    // El interruptor pasó a OFF
    Joystick.setButton(5, 1);         // Pulsar botón Nº 6 en joystick
    delay(60);          // Esperar breve periodo
    Joystick.setButton(5, 0);         // Soltar botón   
    // Actualizar estado anterior del interruptor
    estadoAnteriorInterruptor = estadoActualInterruptor; 
  }

  //CON ESTE CÓDIGO SI FUNCIONA OK: 
  if (estadoActualInterruptor != estadoAnteriorInterruptor) {
    // Si hubo un cambio de estado:
    if (estadoActualInterruptor) {
      // El interruptor pasó a ON
      Joystick.setButton(5, 1);         // Pulsar botón en joystick
      delay(60);          // Esperar breve periodo
      Joystick.setButton(5, 0);         // Soltar botón
    } else {
      // El interruptor pasó a OFF
      Joystick.setButton(5, 1);         // Pulsar otro botón en joystick
      delay(60);          // Esperar breve periodo
      Joystick.setButton(5, 0);         // Soltar botón
    }
    // Actualizar estado anterior del interruptor
    estadoAnteriorInterruptor = estadoActualInterruptor;
  }
}

Probé el código de los if anidados y funciona bien. Pero el editado por mi, si bien la palanca funciona bien, el pulsador boton_1 funciona con retraso.

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @elaprendiz84

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Ok gracias y disculpas por la confusión.

1 Like

Primero el de la IA.
Es redundante por no decir que está mal, ¿por qué?
Porque hace lo mismo si estadoActualInterruptor es true como si es false.
En realidad solo actúa cuando el estado es distinto al anterior sin importar el estado.
Es lo mismo que hacer

if (estadoActualInterruptor != estadoAnteriorInterruptor) { // Si hubo un cambio de estado: 
  Joystick.setButton(5, 1); // Pulsar botón en joystick 
  delay(60); // Esperar breve periodo 
  Joystick.setButton(5, 0); // Soltar botón
// Actualizar estado anterior del interruptor
  estadoAnteriorInterruptor = estadoActualInterruptor;
} 

Tu código arrastra el mismo error (o casi).
Si hay cambio de estado y el estado es true ejecuta la secuencia, sino (else) si simplemente hay cambio de estado,sin importar si es true o false, hace lo mismo (aunque de no cumplirse la primera condición por defecto actúe por false).

Sobre el retraso, no veo la causa.

1 Like

Hola MaximoEsfuerzo, muchas gracias por tu respuesta.

Leyendo el código, veo que tenes toda la razón en tu comentario. De hecho, el código que me sugerís es más corto y hace lo mismo que el código de la IA pero sin redundancia.

Lo que sigo sin entender, es por qué hay tanto delay en el "BOTON_1" cuando ejecuto el código que yo modifiqué, el que comenté como "//CON ESTE CÓDIGO FUNCIONA MAL, CAUSA MUCHO RETRASO AL PRESIONAR EL "BOTÓN_1".

Como te dije, no veo la causa del retraso.

De todos modos el código está mal planteado y es igual de redundante que el original.

Probaré el código que me proporcionaste y si no veo retraso ni nada raro, doy tu respuesta como solución, independientemente de que no pude sacarme la duda del por qué tenía tanto retraso en el "BOTON_1"con el código:

if (estadoActualInterruptor != estadoAnteriorInterruptor && estadoActualInterruptor) { 
    // El interruptor pasó a ON
    Joystick.setButton(5, 1);         // Pulsar botón Nº 6 en joystick
    delay(60);          // Esperar breve periodo
    Joystick.setButton(5, 0);         // Soltar botón   
    // Actualizar estado anterior del interruptor
    estadoAnteriorInterruptor = estadoActualInterruptor; //Pone el "estadoAnteriorInterruptor" en modo LOW y FALSE
  }
  else if(estadoActualInterruptor != estadoAnteriorInterruptor) {
    // El interruptor pasó a OFF
    Joystick.setButton(5, 1);         // Pulsar botón Nº 6 en joystick
    delay(60);          // Esperar breve periodo
    Joystick.setButton(5, 0);         // Soltar botón   
    // Actualizar estado anterior del interruptor
    estadoAnteriorInterruptor = estadoActualInterruptor; 
  }

bool estadoActualInterruptor = digitalRead(PALANCA_1) == LOW;
De hecho no tengo ni idea como siquiera te funciona, estadoActualInterruptor es resultado de la operación lógica digitalRead(PALANCA_1) == LOW, es decir es true mientras no presiones el joystick, esto no tiene sentido.

Hola @PeterKantTropus.
Con respecto a tu pregunta de que no sabes cómo funciona bool estadoActualInterruptor = digitalRead(PALANCA_1) == LOW; te lo explico: el interruptor de palanca, cuando está en posición OFF, el Arduino lee un estado HIGH porque está configurado como PULLUP. Entonces, mientras esté en esa posición, estadoActualInterruptor será "false". Sólo cuando se mueva la palanca del interruptor a "ON" y arduino lea un estado "LOW", ahí será "true".

Cuando me refería a que no entiendo cómo funciona, es que veo por primera vez declarar una variable e inicializar con una operación lógica en la cual llama a una función que interactúa con el hardware.
Claramente esa línea tendrían que ser dos, primero declarar e inicializar la variable con una constante, Luego asignarle el valor mediante la operación lógica.

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