const int encoderPin = 2; // Pino do encoder
const int encoderHoles = 200; // Número de furos do encoder
const unsigned long timeout = 85; // Tempo limite em ms para considerar a roda parada
const float wheelDiameter = 1.57; // Diâmetro da roda em metros (ajuste conforme necessário)
const float wheelCircumference = wheelDiameter * 3.14159265;
volatile unsigned long lastEncoderInterruptTime = 0;
volatile unsigned long previousEncoderInterruptTime = 0;
volatile int encoderInterruptCount = 0;
bool wheelStopped = false;
unsigned long lastSpeedPrintTime = 0;
const unsigned long printInterval = 500; // Intervalo em ms para imprimir a velocidade (500 ms = 0.5 segundo)
void setup() {
Serial.begin(9600);
pinMode(encoderPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderPin), encoderInterrupt, FALLING);
}
void loop() {
unsigned long currentTime = millis();
// Verificar se a roda está parada
if (currentTime - lastEncoderInterruptTime > timeout) {
if (!wheelStopped) {
wheelStopped = true;
Serial.println("Roda parada.");
}
} else {
wheelStopped = false;
}
// Calcular e imprimir a velocidade a cada pulso do encoder e a cada intervalo de tempo
if (encoderInterruptCount >= 1 && (currentTime - lastSpeedPrintTime >= printInterval)) {
// Cálculo do tempo gasto entre dois pulsos do encoder (em ms)
unsigned long timeElapsed = lastEncoderInterruptTime - previousEncoderInterruptTime;
// Convertendo para RPM
float rpm = (60000.0 / (timeElapsed * encoderHoles));
// Convertendo para KM/h
float kmh = (rpm * wheelCircumference * 60) / 1000;
// Imprimindo resultados
Serial.print("Tempo entre pulsos: ");
Serial.print(timeElapsed);
Serial.println(" ms");
Serial.print("Velocidade: ");
Serial.print(kmh);
Serial.println(" KM/h");
Serial.print("Velocidade: ");
Serial.print(rpm);
Serial.println(" RPM");
// Resetando contador e atualizando o tempo de interrupção
encoderInterruptCount = 0;
previousEncoderInterruptTime = lastEncoderInterruptTime;
lastSpeedPrintTime = currentTime; // Atualiza o último tempo de impressão
}
}
void encoderInterrupt() {
previousEncoderInterruptTime = lastEncoderInterruptTime;
lastEncoderInterruptTime = millis();
encoderInterruptCount++;
}