Combinacion de pulsaciones para diferentes acciones

Buenos dias,

Estoy intentando crear un contador de un futbolin, los goles los cuenta automaticamente con sensor ultrasonico, hasta ahi bien, pero he querido rizar el rizo y poner 3 botones para controlar posibles errores en el marcador.

La idea es con una combinacion de pulsaciones de los 3 botones (Ejemplo):

  • Presionando boton 1 mas de 3 segundos y despues boton 2 y posteriormente boton 3, me deje incrementar contador display 1
    * Boton 2 Incrementa 1 gol
    * Boton 3 disminuye 1 gol
  • Presionando boton 1 mas de 3 segundos y despues boton 3 y posteriormente boton 2, me deje incrementar contador display 2
    * Boton 2 Incrementa 1 gol
    * Boton 3 disminuye 1 gol

He hecho un frankenstein de ejemplos, para ver si lo conseguia con un display y replicarlo, pero imposible y eso que solo lo he intentado presionando el boton 1 3 segundos.

Si alguien me pudieda ayudar se lo agradeceria

#include <EEPROM.h>
byte Pulsador  =1; // Pines usados
byte Led       =5; 
byte Ventilador=6;  

  
boolean Estado_Pulsador;      // Para almacenar el estado del pulsador low o high
boolean Estado_Anterior;      // Usada para saver cundo soltamos el pulsador

byte Secuencia = 0;           // Para manejar la secuencia de salidas
byte Total_Secuencias=5;      // Cambia aquipara limitar ell numero de secuencias

unsigned long T_Apagar=3000;  // Tiempo a mantener pulsado el boton para apagar 
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);   // Configuramos pin como entrada
  Estado_Anterior = false;    // Iniciamos elproceso con el boton sin pulsar
}

void loop()
{
  // Estado_Pulsador = !digitalRead(Pulsador); // Lee el estado del botón pull up. 
     Estado_Pulsador = !digitalRead(Pulsador);    // Lee el estado del botón pull down.
  
  if (Estado_Pulsador && !Estado_Anterior)     // Si pulsador pasa de low a high (entra al pulsar pero no al mantener pulsado)
  {
    T_Pulsado=millis()+T_Apagar;               // Para controlar el timpo que pasa pulsado 
    Estado_Anterior=true;                      // No enta en el if hasta q pulsador pase de high a low
    Secuencia++;                               // Pasamos a siguiente secuencia
  } 
  
  if (!Estado_Pulsador && Estado_Anterior)     // Si pulsador pasa de high a low (entra al soltar pulsador pero no al mantener despulsado)
  {
    Estado_Anterior=false;                     // No enta en el if hasta q pulsador pase de low a high
    T_Pulsado=0;                               // Al soltar pulsador ya no controlamos el tiempo que permanece pulsado
  } 
  
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado)  
  {                                        // Si hay tiempo cargado para controlar el fin y esta pulsado y ha transcurrido el tiempo para apagarlo
    T_Pulsado=0;                           // Ya no controlamos tiempo de pulsado
    Secuencia=0;                           // Secuencia 0, todo apagado
  }  
  
  if (Secuencia>Total_Secuencias)          // Si se han acabado las secuencias
  {Secuencia=1;}                                    // Regresamos a la primera (podrias poner T_Pulsado=0; para finalizar aqui)
  
 switch (Secuencia) 
 {
    case 0:
          //No hay secuencia, apagar o hacer lo que necesites
      break;   
   case 1:
      Proceso1();
      break;
    case 2:
      Proceso2();
      break;
    case 3:
      Proceso3();
      break;
    case 4:
      Proceso4();
      break;
    case 5:
      Proceso5();
      break;      
  } 
}

void Proceso1()
{
}
void Proceso2()
{
}
void Proceso3()
{
}
void Proceso4()
{
}
void Proceso5()
{
}

https://www.tinkercad.com/things/3IFBkSNu2GD-copy-of-display-7-segmentos-con-arduino-botones-de-aumento-y/editel?sharecode=yrf6skVegBn7qGfKnHE4suUds1WHWydC5sIU-4RuXQE

Código corregido

Tu publicación fue ** MOVIDA ** a su ubicación actual ya que es más adecuada.

¿Podría también tomarse unos minutos para Aprenda a usar el foro .

Aquí puede encontrar más ayuda general y consejos para la resolución de problemas.

Buenos dias,

Gracias y siento no haberlo publicado en el foro correcto

Cuando dices codigo corregido, que quieres decir

Que editó tu primer post usando etiquetas.
Lee las normas del foro, usa etiquetas aunque publiques solo 1 línea de código para explicar algo.

Porque usar 3 botones para hacer algo que con 1 puedes?
Boton 1 incrementa
Boton 2 decrementa
Boton 3 pone a 0 por ejemplo.

Porque tengo que controlar 2 displays. Uno por cada portería. Y quiero hacerlo con código de combinaciones para que no lo sepan hacer nadie para no hacer trampas

Okay entonces pensá la programación como una máquina de estados.
Cada vez que una tecla cumpla con una secuencia avanzas un estado.
Si el boton 1 esta encendido x 3 segundos avances 1 estado, si luego se presiona el 2 avanzas al siguiente, y asi... hasta lograr lo que buscas.
Es mucho mas simple que verlo como lo estas haciendo.

Mira entonces que simple es esto

  • Presionando boton 1 mas de 3 segundos y despues boton 2 y posteriormente boton 3, me deje incrementar contador display 1
    Presionando boton 1 mas de 3 segundos y despues boton 3 y posteriormente boton 2, me deje incrementar contador display 2

Los dos empienzan igual para el primer estado que es boton 1 x > 3 segundos
luego tienes dos variantes, entonces en el estado dos preguntas si se presionó 2 o 3 y vas a dos situaciones distintas que termina en incremento de display 1 o 2.

Gracias nuevamente por tu interes
Lo explicas muy bien y muy sencillo, pero leyendo la máquina de estados, que viene muy bien explicado, para un novato nos cuesta llevarlo a un codigo.
He quitado cosas del codigo, he puesto, pero mi resultado es el doble que antes, NADA DE NADA.
Gracias por tu interes y seguire leyendo a ver si soy capaz de ver la luz

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