#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C miLCD(0x27, 16, 2);
#define I2C_SDA 8
#define I2C_SCL 9
#define pulsoPorRevolucion 20.0
unsigned long tiempoAnterior = 0;
#define DT_PIN 5
#define CLK_PIN 4
float rpm = 0;
unsigned long tiempoTranscurrido=0;
int pulsos=0;
int velocidad_rpm = 0;
volatile int DTState=0;
volatile int CLKState=0;
unsigned long tiempoActual=0;
int pulso_dt=0;
int pulso_clk=0;
void ARDUINO_ISR_ATTR DT() {
pulso_dt++;
}
void ARDUINO_ISR_ATTR CLK() {
pulso_clk++;
}
int calcularRPM() {
//DT para saber si es antihorario(resto pulso ) o horario(sumo pulso)
tiempoTranscurrido = tiempoActual - tiempoAnterior;
tiempoAnterior=tiempoActual;
return rpm =(pulsos/pulsoPorRevolucion)/(60000/tiempoTranscurrido);
}
void mostrarVelocidadRPM(int rpm) {
miLCD.setCursor(1, 1);
miLCD.print(rpm);
}
void setup() {
pinMode(DT_PIN, INPUT);
pinMode(CLK_PIN, INPUT);
Wire.begin(I2C_SDA, I2C_SCL);
miLCD.init(); // Inicializamos el módulo LCD
miLCD.backlight();
miLCD.home(); // Limpiamos la pantalla y colocamos el cursor en (0, 0)
attachInterrupt(DT_PIN, DT, FALLING);
attachInterrupt(CLK_PIN, CLK, FALLING);
miLCD.setCursor(0,0);
miLCD.print("velocidad (RPM) ");
Serial.println("inicio");
}
void loop() {
Serial.println(pulsos);
Serial.println(tiempoTranscurrido);
if(pulso_clk>pulso_dt){
pulsos*=-1;
Serial.println("-pulso");
}else if(pulso_dt>pulso_clk){
pulsos*=1;
Serial.println("+pulso");
}
tiempoActual = millis();
velocidad_rpm =calcularRPM();
mostrarVelocidadRPM(velocidad_rpm);
}