// https://forum.arduino.cc/t/ram-evoto-coding/1427104/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi Pin
const int pinRPM = 2;
const int pinSpeed = 3;
const int pinFuel = A0;
// Variabel Interrupt
volatile unsigned long pulseRPM = 0;
volatile unsigned long pulseSpeed = 0;
// Variabel Perhitungan
unsigned long lastMillis = 0;
const int interval = 1000; // Update setiap 1 detik
// Konstanta Kendaraan (Sesuaikan bagian ini!)
const float kelilingBan = 1.85; // Keliling ban dalam meter (contoh: ban ring 17)
const int pulsaPerRotasi = 1; // Jumlah tonjolan magnet di velg/magneto
// void IRAM_ATTR countRPM() {
void countRPM() {
pulseRPM++;
}
// void IRAM_ATTR countSpeed() {
void countSpeed() {
pulseSpeed++;
}
void setup() {
lcd.init();
lcd.backlight();
pinMode(pinRPM, INPUT_PULLUP);
pinMode(pinSpeed, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pinRPM), countRPM, RISING);
attachInterrupt(digitalPinToInterrupt(pinSpeed), countSpeed, RISING);
lcd.setCursor(0, 0);
lcd.print("RAM EVOTO CLONE");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
// Hitung setiap 1 detik tanpa menghentikan program (non-blocking)
if (currentMillis - lastMillis >= interval) {
// Matikan interrupt sebentar agar data tidak berubah saat dihitung
noInterrupts();
unsigned long copyRPM = pulseRPM;
unsigned long copySpeed = pulseSpeed;
pulseRPM = 0;
pulseSpeed = 0;
interrupts();
// 1. Kalkulasi RPM
// (Pulsa / detik) * 60 = RPM
int rpm = (copyRPM / pulsaPerRotasi) * 60;
// 2. Kalkulasi Speed (KM/H)
// Jarak = pulsa * keliling ban
// Speed = (Jarak dalam meter / detik) * 3.6 untuk konversi ke km/jam
float distance = copySpeed * kelilingBan;
int kph = distance * 3.6;
// 3. Baca Sensor Bensin (Rata-rata/Mapping)
int fuelRaw = analogRead(pinFuel);
int fuelPercent = map(fuelRaw, 100, 900, 0, 100);
fuelPercent = constrain(fuelPercent, 0, 100);
// Update Tampilan
updateDisplay(kph, rpm, fuelPercent);
lastMillis = currentMillis;
}
}
void updateDisplay(int s, int r, int f) {
lcd.clear(); // Bersihkan layar agar tidak ada karakter tertinggal
lcd.setCursor(0, 0);
lcd.print("SPD: "); lcd.print(s); lcd.print(" km/h");
lcd.setCursor(0, 1);
lcd.print("RPM: "); lcd.print(r);
lcd.setCursor(10, 1);
lcd.print("F:"); lcd.print(f); lcd.print("%");
}RPM * 60
kph * 6.6
Fuel