#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
}
}
}
}
}