#include <LiquidCrystal.h>
#include <Keypad.h>
#include <TM1637Display.h>
#define COLS 20
#define ROWS 4
#define CLK 10
#define DIO 9
#define APRETANDOLO 1
#define SUELTO 0
#define apretado 3
const int Trigger = 43;
const int Echo = 45;
int LedRojo = 39;

int LedRojoEstado = LOW;
int LedVerde = 41;
int LedVerdeEstado = LOW;
const int Button = 47;





unsigned long previousMillis = 0;
const long interval = 60000; // 1 minuto
int lox = 0;

int count = 0;
int textoGuardado = 0; // Cambiamos la variable a float
int Push;

long duration;
int distance;
bool sensorActive = true;


unsigned long stopTime = 0;
unsigned long startTime = 0;

const byte filas = 4; 
const byte columnas = 4;
byte pinesFilas[] = {22, 24, 26, 28};
byte pinesColumnas[] = {30, 32, 34, 36};
char teclas[4][4] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'}
  
};

TM1637Display display = TM1637Display(CLK, DIO);
Keypad teclado1 = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

class BotonSimple {
  private:
    unsigned char pin;
    unsigned char anterior, valor;
    unsigned char estado;

    unsigned long temporizador;
    unsigned long tiempoRebote;
  public:
    BotonSimple(unsigned char _pin, unsigned long _tiempoRebote);
    void actualizar();
    int  leer();
};

BotonSimple::BotonSimple(unsigned char _pin, unsigned long _tiempoRebote=50) {
  pin = _pin;
  tiempoRebote = 50;
  pinMode(pin, INPUT_PULLUP);
  valor=HIGH; anterior=HIGH; estado=SUELTO;
}

void BotonSimple::actualizar() {
  // NOTA: En el ejemplo original en vez de "pin" leia directamente el pin "2", con lo que el
  // codigo no funciona correctamente con el pin que le hayamos asignado.
  if ( valor==digitalRead(pin) ){
    temporizador=0;
  }
  else
  if ( temporizador==0 ) {
    temporizador = millis();
  }
  else
  if ( millis()-temporizador >= tiempoRebote ) {
    valor = !valor;
  }
  
  if ( anterior==HIGH && valor==LOW  ) estado = APRETANDOLO;
  if ( anterior==HIGH && valor==HIGH ) estado = SUELTO;
  if ( anterior==LOW && valor==HIGH ) estado = apretado;
  anterior = valor;
}

int BotonSimple::leer() { 
  return estado;
}
 
BotonSimple boton1(47);
BotonSimple boton2(7);


void setup() {
  display.setBrightness(0x0f); // Ajusta el brillo
  display.clear(); // Limpia el display
  Serial.begin(9600);
  lcd.begin(COLS, ROWS);
  digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
  pinMode(Trigger, OUTPUT); //pin como salida
  pinMode(Echo, INPUT);  //pin como entrada
  pinMode(LedRojo, OUTPUT);
  pinMode(LedVerde, OUTPUT);
  digitalWrite(LedRojo, HIGH);
 
}

void loop() {
  boton1.actualizar();
  boton2.actualizar();
  switch (boton1.leer()) {
    case APRETANDOLO:
      LedVerdeEstado = !LedVerdeEstado;
      
      digitalWrite(LedVerde, HIGH);
      digitalWrite(LedRojo, LOW);
      break;
    default:break;
  }
  if (!LedVerdeEstado){

    
    char teclaPresionada = teclado1.getKey();
    if (teclaPresionada) {
      if (textoGuardado != 0) {
        // Si ya hay texto guardado, lo borramos antes de guardar la nueva tecla
        textoGuardado = 0;
        lcd.clear(); // Limpia el LCD para eliminar el texto anterior
      }
      textoGuardado = teclaPresionada - '0'; // Guarda la nueva tecla presionada como un número
      lcd.setCursor(0, 1);
      lcd.print("Numero de Golpes: ");
      lcd.print(teclaPresionada); // Muestra la nueva tecla en el LCD
      int j;
      int n;
      n=10000;
      delay(100); // Espera un momento para que se pueda leer la tecla en el LCD
      Serial.print("Numero de golpes: ");
      Serial.println(textoGuardado);
      
      long t; //timepo que demora en llegar el eco
      long d; //distancia en centimetros
      for (j = 1; j <= n; j++) {
        if (sensorActive == true){
          
          digitalWrite(Trigger, HIGH);
          delayMicroseconds(10);          //Enviamos un pulso de 10us
          digitalWrite(Trigger, LOW);
          t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
          d = t/59;             //escalamos el tiempo a una distancia en cm
          
          
          int Distancia = t * 0.034 / 2;
          
          lcd.setCursor(0, 0);
          lcd.print("Distancia: ");
          lcd.print(Distancia);
          lcd.print(" cm");
          Serial.print(j);
          Serial.print("-");
          Serial.print(d);
          Serial.println();
          if (d < 400) { // Umbral de distancia en centímetros
          count++;
          delay(50); // Retardo para evitar múltiples conteos por la misma detección
          }
          // Cada 4 detecciones, actualiza el display
          if ((count) % textoGuardado == 0) { 
          display.showNumberDec((count) / textoGuardado); // Muestra el conteo en el display
          }
          if (d > 0) {
          lox++;
          }
        }
          int currentMillis = millis();
          delay(1000);
          // Mostrar la cantidad de veces en el LCD cada minuto
          if (currentMillis - previousMillis >= interval) {
          previousMillis = currentMillis;
            
            lcd.setCursor(0, 2);
            lcd.print("V: ");
            lcd.print(lox);
            lcd.print(" Glp/min");
            lox = 0; // Reiniciar el conteo para el siguiente minuto
          }
          
        
        
      }
      
    }
  }
}
$abcdeabcde151015202530354045505560fghijfghij
4-Digit Display