#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define pinoCLK 7
#define pinoDT 6
#define botaoPin 2
LiquidCrystal_I2C lcd(0x27, 16, 2);
float contador = 0;
int estadoAtualCLK;
int estadoAnteriorCLK;
unsigned long lastRotationTime = 0;
float circunferencia = 1.27;
float distanciaPercorrida = 0;
float contadorAnterior = 0;
String encdir = "";
enum DisplayState {
DISPLAY_CONTADOR,
DISPLAY_RPM,
DISPLAY_DISTANCIA
};
DisplayState displayState = DISPLAY_CONTADOR;
unsigned long lastDisplayChangeTime = 0;
const unsigned long displayChangeInterval = 4000;
void setup() {
pinMode(pinoCLK, INPUT);
pinMode(pinoDT, INPUT);
pinMode(botaoPin, INPUT);
estadoAnteriorCLK = digitalRead(pinoCLK);
lcd.init();
lcd.setBacklight(HIGH);
}
void loop() {
estadoAtualCLK = digitalRead(pinoCLK);
if (estadoAtualCLK != estadoAnteriorCLK) {
if (digitalRead(pinoDT) != estadoAtualCLK) {
contador -= 0.5;
encdir = "HOR";
} else {
contador += 0.5;
encdir = "ANTH";
}
unsigned long currentTime = millis();
unsigned long rotationTime = currentTime - lastRotationTime;
float rpm = 60000.0 / rotationTime;
float diferencaContagem = contador - contadorAnterior;
distanciaPercorrida += (diferencaContagem * circunferencia);
contadorAnterior = contador;
if (digitalRead(botaoPin) == LOW) {
// Altera o estado de exibição
if (displayState == DISPLAY_CONTADOR) {
displayState = DISPLAY_RPM;
} else if (displayState == DISPLAY_RPM) {
displayState = DISPLAY_DISTANCIA;
} else {
displayState = DISPLAY_CONTADOR;
}
lastDisplayChangeTime = currentTime;
}
lcd.clear();
lcd.setCursor(0, 0);
switch (displayState) {
case DISPLAY_CONTADOR:
lcd.print("Rot.: ");
lcd.print(contador, 1);
break;
case DISPLAY_RPM:
lcd.print("Vel. (RPM): ");
lcd.print(rpm, 2);
break;
case DISPLAY_DISTANCIA:
lcd.print("Dist.: ");
lcd.print(distanciaPercorrida, 2);
break;
}
lastRotationTime = currentTime;
}
estadoAnteriorCLK = estadoAtualCLK;
}