#include <Servo.h>
// =======================
// Konfigurasi Pin
// =======================
const int o2Pin = A9; // Input sensor O₂ (potensiometer)
const int rpmPin = A8; // Input simulasi RPM (potensiometer)
const int servoPin = 7; // Output servo
// =======================
// Konfigurasi Batas RPM
// =======================
int maxRPM = 9000; // Bisa diganti menjadi 8500, 12000, dll.
// =======================
// Objek Servo
// =======================
Servo limiterServo;
// =======================
// Variabel Global
// =======================
float o2Voltage = 0;
int o2Value = 0;
int rpmValue = 0;
int rpm = 0;
int servoAngle = 0;
String mixtureStatus;
void setup() {
Serial.begin(9600);
limiterServo.attach(servoPin);
Serial.println("=== ECU SIMULATOR START ===");
delay(800);
}
void loop() {
// =======================
// BACA SENSOR O₂
// =======================
o2Value = analogRead(o2Pin);
o2Voltage = o2Value * (5.0 / 1023.0);
if (o2Voltage < 0.3) mixtureStatus = "LEAN";
else if (o2Voltage <= 0.7) mixtureStatus = "IDEAL";
else mixtureStatus = "RICH";
// =======================
// BACA PULSER (SIMULASI RPM)
// =======================
rpmValue = analogRead(rpmPin);
rpm = map(rpmValue, 0, 1023, 0, maxRPM);
// =======================
// SERVO FULL 0–180 BASED ON RPM
// =======================
servoAngle = map(rpm, 0, maxRPM, 0, 180);
// Batasi jika lewat batas (jaga servo aman)
servoAngle = constrain(servoAngle, 0, 180);
limiterServo.write(servoAngle);
// =======================
// OUTPUT SERIAL MONITOR
// =======================
Serial.print("RPM: ");
Serial.print(rpm);
Serial.print(" | O2: ");
Serial.print(o2Voltage, 2);
Serial.print("V");
Serial.print(" | Mixture: ");
Serial.print(mixtureStatus);
Serial.print(" | Servo: ");
Serial.print(servoAngle);
Serial.println(" deg");
delay(250);
}