#include <LiquidCrystal.h>
// Define LCD Pins (Adjust these pins based on your Wokwi setup)
const int rs = 14, en = 26, d4 = 25, d5 = 33, d6 = 32, d7 = 27;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// IR Sensor and LED Pins
const int IRSensorPin = 2;
const int ledPin = 13;
// Variables for RPM Calculation
int inputState;
int lastInputState = LOW;
long lastDebounceTime = 0;
long debounceDelay = 5;
long currentTime;
long endTime;
long startTime;
int RPM = 0;
double trip = 0;
double kkbanspd = 0.00223; // Constant for wheel size (adjust based on your bike's wheel circumference)
float lnTime = 0;
void setup() {
pinMode(IRSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(115200); // Set a higher baud rate for ESP32
lcd.begin(16, 2);
// Initial LCD setup display
lcd.clear();
lcd.print("Ge Creative");
lcd.setCursor(0, 1);
lcd.print("Bike Speedometer");
delay(2000);
endTime = 0;
}
void loop() {
// RPM Calculation and Display
currentTime = millis();
int currentSwitchState = digitalRead(IRSensorPin);
if (currentSwitchState != lastInputState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentSwitchState != inputState) {
inputState = currentSwitchState;
if (inputState == LOW) {
digitalWrite(ledPin, LOW);
calculateRPM(); // Calculate RPM from sensor
} else {
digitalWrite(ledPin, HIGH);
}
}
}
lastInputState = currentSwitchState;
// LCD Display for Speed and Trip
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Spd:");
lcd.setCursor(5, 0);
lcd.print((RPM * kkbanspd) * 60); // Calculate speed in km/h
lcd.setCursor(12, 0);
lcd.print("Km/h");
lcd.setCursor(0, 1);
lcd.print("Trp:");
lcd.setCursor(5, 1);
lcd.print(trip * kkbanspd); // Calculate total trip in km
lcd.setCursor(12, 1);
lcd.print("Km");
delay(500);
RPM = 0;
}
void calculateRPM() {
startTime = lastDebounceTime;
lnTime = startTime - endTime;
RPM = 60000 / (startTime - endTime);
endTime = startTime;
trip++;
}