const int pedalPin = A2; // Accelerator pedal pin (Analog input)
const int wheelPin = 3; // Wheel speed sensor pin (Digital input)
const int enginePin = 8; // PWM output pin for engine control
const float wheelSize = 0.45; // Wheel diameter in meters
void setup() {
pinMode(enginePin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Read accelerator pedal position
int pedalPosition = readPedalPosition();
// Calculate engine demand signal
int engineDemand = calculateEngineDemand(pedalPosition);
// Set engine speed using PWM output
setEngineSpeed(engineDemand);
// Read wheel speed and calculate vehicle speed
float vehicleSpeed = calculateVehicleSpeed(wheelPin, wheelSize);
// Output speed and engine demand to Serial monitor
outputSpeedAndDemand(vehicleSpeed, engineDemand);
// Delay for 500 milliseconds
delay(500);
}
int readPedalPosition() {
int pedalValue = analogRead(pedalPin);
return map(pedalValue, 0, 1023, 0, 100);
}
int calculateEngineDemand(int pedalPosition) {
return map(pedalPosition, 0, 100, 0, 255);
}
void setEngineSpeed(int engineDemand) {
analogWrite(enginePin, engineDemand);
}
float calculateVehicleSpeed(int sensorPin, float wheelDiameter) {
unsigned long pulseDuration = pulseIn(sensorPin, HIGH);
float wheelCircumference = wheelDiameter * PI;
float wheelRevolutions = pulseDuration / 1000; // Convert to seconds
float vehicleSpeed = (wheelCircumference / wheelRevolutions) * 3.6; // Convert to km/h
return vehicleSpeed;
}
void outputSpeedAndDemand(float vehicleSpeed, int engineDemand) {
Serial.print("Speed = ");
Serial.print(vehicleSpeed, 2);
Serial.print(" Km/H ");
Serial.print("Demand = ");
Serial.print(engineDemand);
Serial.println(" %");
}