#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Definiciones para el teclado matricial
const byte FILAS = 4; // Número de filas del teclado
const byte COLUMNAS = 4; // Número de columnas del teclado
char teclas[FILAS][COLUMNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinesFilas[FILAS] = {19, 18, 5, 17}; // Pines conectados a las filas
byte pinesColumnas[COLUMNAS] = {16, 4, 2, 15}; // Pines conectados a las columnas
Keypad keypad = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
// Definiciones para el display 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C y número de columnas y filas
// Clave de activación
const String claveCorrecta = "1875";
// Variables
String claveIngresada = "";
bool releActivo = false; //estado del rele
bool relePin4activado = false;//variable para controlar el estado del 4to rele
unsigned long tiempoReloj = 0;//variable para medir el tiempo avtivo del 4to rele
const int cloche = 25; //pin conectado al cloche
bool clochePresionado = false;//estado de boton de cloche
int relePin1 = 12;//pin conectado al rele1
int relePin2 = 13;//pin conectado al rele2
int relePin3 = 14;//pin conectado al rele2
int relePin4 = 27;//pin conectado al rele2
const int rpmPin = 33;//pin conectado al tacometro del ecu
volatile int rpmPulsos = 0;//contador de pulsos
unsigned long tiempoAnterior = 0;
unsigned long tiempoIntervalo = 200;//tiempo para calcular rpm en milisegundos
void setup() {
Wire.begin();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("PENACHO"); // Muestra el mensaje de bienvenida
lcd.setCursor(2,1);
lcd.print("PERFORMANCE");
delay(2000); // Espera 5 segundos
lcd.clear(); // Limpia la pantalla
lcd.print("PICALE JATA!");
lcd.setCursor(0, 1);
pinMode(cloche, INPUT);//configurar el pin del cloche como entrada
pinMode(relePin1, OUTPUT);
digitalWrite(relePin1,1);
pinMode(relePin2, OUTPUT);
digitalWrite(relePin2,1);
pinMode(relePin3, OUTPUT);
digitalWrite(relePin3,1);
pinMode(relePin4, OUTPUT);
digitalWrite(relePin4,1);
attachInterrupt(digitalPinToInterrupt(rpmPin),contarPulsos,RISING);//configurar la interrupcion para contar pulsos
}
void loop() {
char tecla = keypad.getKey();
/*int relePin1Estado=digitalRead(relePin1);
int relePin2Estado=digitalRead(relePin2);*/
//int estado_motorEstado = digitalRead(estado_motor);
int RPM = calcularRpm();
if (tecla) {
if (tecla == 'D') {
if (claveIngresada == claveCorrecta && RPM < 400) {
lcd.clear();
lcd.print("YASISO!");
// Agregar aquí el código para realizar la activación
digitalWrite(relePin1, LOW);
digitalWrite(relePin2, LOW);
digitalWrite(relePin3, LOW);
if(digitalRead(cloche)==LOW){//lectura de boton cloche
//activar rele4
digitalWrite(relePin4, LOW);
relePin4activado = true;//actualizar el estado del rele
tiempoReloj = millis();//iniciar el reloj
}else{
//no se presiono el boton de confirmacion
digitalWrite(relePin4, HIGH);
relePin4activado = false;//actualizar el estado del rele
}
}else{
lcd.clear();
lcd.print("NAMBE!");
digitalWrite(relePin1, HIGH);
digitalWrite(relePin2, HIGH);
digitalWrite(relePin3, HIGH);
//digitalWrite(relePin4, HIGH);
delay(2000);
lcd.clear();
lcd.print("PICALE JATA!");
}
claveIngresada = "";
} else {
claveIngresada += tecla;
lcd.print('*');
}
}
if (relePin4activado && (RPM >= 400||(millis() - tiempoReloj>=3000))){//actualizar el estado del rele
digitalWrite(relePin4, HIGH);
relePin4activado = false;
}
}
int calcularRpm(){
if(millis() - tiempoAnterior > tiempoIntervalo){
int RPM = (rpmPulsos*60)/(tiempoIntervalo/200);//calcular rpm
/*lcd.setCursor(12, 0);
lcd.println(RPM);*/
rpmPulsos = 0;
tiempoAnterior = millis();
return RPM;
}
return 0;
}
void contarPulsos(){
rpmPulsos++;
}