#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set I2C address and display size
const int crankPin = 9; // Crank sensor output pin
const int camPin = 10; // Cam sensor output pin
const int potPin = A0; // Potentiometer input pin
void setup() {
pinMode(crankPin, OUTPUT);
pinMode(camPin, OUTPUT);
pinMode(potPin, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("RPM:CRANK");
}
void loop() {
int potValue = analogRead(potPin);
int pulseWidth = map(potValue, 0, 1023, 10, 90);
// Crank sensor signal
float crankPeriod = 1000.0 / 20.0; // 20 Hz
float crankHighTime = crankPeriod * (pulseWidth / 100.0);
digitalWrite(crankPin, HIGH);
delayMicroseconds(crankHighTime);
digitalWrite(crankPin, LOW);
delayMicroseconds(crankPeriod - crankHighTime);
// Cam sensor signal
float camPeriod = 1000.0 / 10.0; // 10 Hz
float camHighTime = camPeriod * (pulseWidth / 100.0);
digitalWrite(camPin, HIGH);
delayMicroseconds(camHighTime);
digitalWrite(camPin, LOW);
delayMicroseconds(camPeriod - camHighTime);
// Calculate RPM
int rpm = map(pulseWidth, 10, 90, 500, 6000);
// Display RPM
lcd.setCursor(0, 1);
lcd.print(rpm);
lcd.print(" RPM");
delay(100);
}