const int potPin1 = A0; // Pin untuk potensiometer 1 (kecepatan dan RPM)
const int potPin2 = A1; // Pin untuk potensiometer 2 (variabel load cell)
const int buttonOnPin = 2; // Pin untuk tombol ON (tombol biru)
const int buttonOffPin = 3; // Pin untuk tombol OFF (tombol kuning)
float potValue1;
float potValue2;
float speedKmh;
float rpm;
float torqueNm; // Variabel untuk menyimpan torsi dalam Nm
float horsepower; // Variabel untuk menyimpan daya dalam Horsepower (HP)
const float pi = 3.14159;
const float leverArm = 0.5; // Panjang lengan momen dalam meter (50 cm)
const float conversionFactor = 9.5488; // Faktor konversi dari rad/s ke RPM
// Ukuran ban belakang Honda Beat (90/90-14)
const float tireWidthRear = 90; // mm
const float aspectRatioRear = 90; // %
const float rimDiameterRear = 14 * 25.4; // inch to mm
const float tireDiameterRear = rimDiameterRear + 2 * (tireWidthRear * (aspectRatioRear / 100.0));
const float tireCircumferenceRear = pi * tireDiameterRear / 1000.0; // mm to meters
// Rentang load cell (1-50 kg)
const float minLoad = 1.0; // kg
const float maxLoad = 50.0; // kg
const int potMin = 0;
const int potMax = 1023;
bool dataEnabled = false; // Variabel untuk status apakah data ditampilkan atau tidak
bool buttonOnPrevState = HIGH; // Status sebelumnya tombol ON
bool buttonOffPrevState = HIGH; // Status sebelumnya tombol OFF
unsigned long previousMillis = 0; // Waktu sebelumnya data ditampilkan
const long interval = 500; // Interval delay antara pembacaan data (ms)
// Variabel untuk menyimpan data tertinggi
float topRpm = 0.0;
float topSpeedKmh = 0.0;
float topTorqueNm = 0.0;
float topHorsepower = 0.0;
void setup() {
Serial.begin(9600); // Memulai komunikasi serial
pinMode(buttonOnPin, INPUT_PULLUP); // Mengatur pin tombol ON sebagai input dengan pull-up internal
pinMode(buttonOffPin, INPUT_PULLUP); // Mengatur pin tombol OFF sebagai input dengan pull-up internal
}
void loop() {
// Membaca status tombol ON dan OFF
bool buttonOnState = digitalRead(buttonOnPin);
bool buttonOffState = digitalRead(buttonOffPin);
// Tombol ON ditekan dan sebelumnya tidak ditekan
if (buttonOnState == LOW && buttonOnPrevState == HIGH) {
dataEnabled = !dataEnabled; // Toggle status dataEnabled
if (dataEnabled) {
Serial.println("Data diaktifkan. Mulai menampilkan data.");
} else {
Serial.println("Data dimatikan. Berhenti menampilkan data.");
}
}
// Tombol OFF ditekan dan sebelumnya tidak ditekan
if (buttonOffState == LOW && buttonOffPrevState == HIGH) {
// Mematikan data dan menampilkan data tertinggi sebelum dimatikan
if (topRpm > 0 || topSpeedKmh > 0 || topTorqueNm > 0 || topHorsepower > 0) {
Serial.println("= Kendaraan Tidak Tersedia =");
Serial.print("TOP RPM = ");
Serial.println(topRpm);
Serial.print("TOP Kecepatan = ");
Serial.println(topSpeedKmh);
Serial.print("TOP Torsi = ");
Serial.println(topTorqueNm);
Serial.print("TOP Horsepower = ");
Serial.println(topHorsepower);
Serial.println("=============================");
} else {
Serial.println("Tidak ada data tertinggi yang tersedia.");
}
// Reset data tertinggi
topRpm = 0.0;
topSpeedKmh = 0.0;
topTorqueNm = 0.0;
topHorsepower = 0.0;
dataEnabled = false; // Mematikan data
Serial.println("Data dimatikan. Berhenti menampilkan data.");
}
// Memperbarui status sebelumnya tombol ON dan OFF
buttonOnPrevState = buttonOnState;
buttonOffPrevState = buttonOffState;
// Jika dataEnabled true, maka tampilkan data
if (dataEnabled) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// Simpan waktu terakhir data ditampilkan
previousMillis = currentMillis;
// Membaca nilai dari potensiometer 1 untuk kecepatan dan RPM
potValue1 = analogRead(potPin1);
speedKmh = map(potValue1, potMin, potMax, 0, 160); // Mengkonversi nilai potensiometer ke km/h
// Menghitung RPM berdasarkan kecepatan untuk ban belakang
rpm = (speedKmh * 1000) / (tireCircumferenceRear * 60); // konversi km/h ke m/s dan bagi keliling ban untuk mendapatkan RPM
// Menyimpan nilai tertinggi RPM
if (rpm > topRpm) {
topRpm = rpm;
}
// Menyimpan nilai tertinggi Kecepatan
if (speedKmh > topSpeedKmh) {
topSpeedKmh = speedKmh;
}
// Menampilkan hasil untuk potensiometer 1
Serial.print("Kecepatan : ");
Serial.print(speedKmh);
Serial.println(" km/h");
Serial.print("RPM (rotation per minute) : ");
Serial.println(rpm);
// Membaca nilai dari potensiometer 2 untuk load cell (variabel load cell)
potValue2 = analogRead(potPin2);
// Mengkonversi nilai potensiometer 2 ke rentang load cell (1-50 kg)
float load = map(potValue2, potMin, potMax, minLoad, maxLoad);
// Menghitung torsi berdasarkan rumus yang disediakan
torqueNm = (load * leverArm) / conversionFactor;
// Menyimpan nilai tertinggi Torsi
if (torqueNm > topTorqueNm) {
topTorqueNm = torqueNm;
}
// Menampilkan hasil untuk potensiometer 2 (load cell)
Serial.print("Torsi : ");
Serial.print(torqueNm);
Serial.println(" Nm");
// Menghitung Horsepower (daya)
horsepower = (torqueNm * rpm) / 5252.0; // Rumus HP = (Torsi * RPM) / 5252
// Menyimpan nilai tertinggi Horsepower
if (horsepower > topHorsepower) {
topHorsepower = horsepower;
}
// Menampilkan hasil Horsepower
Serial.print("Horsepower : ");
Serial.print(horsepower);
Serial.println(" HP");
}
}
delay(50); // Mengurangi delay untuk responsivitas tombol
}