#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++;
}
Loading chip...chip-scope
Loading chip...chip-pwm