#include <Wire.h>
const int encoderPin = 2; // Pino do encoder
const int encoderHoles = 54; // Número de furos do encoder
const unsigned long timeout = 200; // Tempo limite em ms para considerar a roda parada
const float wheelDiameter = 0.785; // 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 = 1000; // Intervalo em ms para imprimir a velocidade (1000 ms = 1 segundo)
void setup() {
Serial.begin(9600);
pinMode(encoderPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderPin), encoderInterrupt, FALLING);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastEncoderInterruptTime > timeout) {
// Se o tempo limite for atingido, consideramos a roda parada
if (!wheelStopped) {
wheelStopped = true;
Serial.println("Roda parada.");
}
} else {
wheelStopped = false;
}
if (encoderInterruptCount >= 2 && (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 = 1;
previousEncoderInterruptTime = lastEncoderInterruptTime;
lastSpeedPrintTime = currentTime; // Atualiza o último tempo de impressão
}
}
void encoderInterrupt() {
previousEncoderInterruptTime = lastEncoderInterruptTime;
lastEncoderInterruptTime = millis();
encoderInterruptCount++;
}