// ============================================================
// SPEEDOMETER SIMULATION - WOKWI
// Arduino Uno + Potentiometer + 4-Digit 7-Segment
// LED Hijau + LED Merah + Buzzer
//
// Potensiometer : A0
// 7-segment : D2-D8
// Digit select : D9-D12
// LED Hijau : D13
// LED Merah : A1
// Buzzer : A2
// ============================================================
const int POT_PIN = A0;
// Urutan segment: A, B, C, D, E, F, G
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};
// Digit 1 sampai digit 4
const int digitPins[4] = {9, 10, 11, 12};
const int LED_HIJAU = 13;
const int LED_MERAH = A1;
const int BUZZER = A2;
// Pola angka untuk 7-segment common cathode
// 1 = segment menyala, 0 = segment mati
const byte polaAngka[10][7] = {
// A B C D E F G
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
int isiDigit[4] = {-1, -1, -1, 0};
unsigned long waktuBlinkTerakhir = 0;
unsigned long waktuSerialTerakhir = 0;
const unsigned long intervalBlink = 300;
bool statusMerah = false;
void setup() {
Serial.begin(9600);
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW);
}
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
// Common cathode multiplexing:
// HIGH = digit mati, LOW = digit aktif
digitalWrite(digitPins[i], HIGH);
}
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(POT_PIN, INPUT);
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
}
void loop() {
// Arduino Uno: ADC 10-bit, nilai 0 sampai 1023
int nilaiADC = analogRead(POT_PIN);
// Simulasi pedal gas: 0-1023 -> 0-120 km/jam
int kecepatan = map(nilaiADC, 0, 1023, 0, 120);
// Persiapkan angka dan refresh display
siapkanDisplay(kecepatan);
refreshDisplay();
// Sistem peringatan
if (kecepatan < 80) {
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
statusMerah = false;
} else {
digitalWrite(LED_HIJAU, LOW);
if (millis() - waktuBlinkTerakhir >= intervalBlink) {
waktuBlinkTerakhir = millis();
statusMerah = !statusMerah;
digitalWrite(LED_MERAH, statusMerah);
if (statusMerah) {
tone(BUZZER, 1000);
} else {
noTone(BUZZER);
}
}
}
// Monitoring pada Serial Monitor
if (millis() - waktuSerialTerakhir >= 500) {
waktuSerialTerakhir = millis();
Serial.print("ADC: ");
Serial.print(nilaiADC);
Serial.print(" | Kecepatan: ");
Serial.print(kecepatan);
Serial.println(" km/jam");
}
}
void siapkanDisplay(int angka) {
// Kosongkan semua digit
for (int i = 0; i < 4; i++) {
isiDigit[i] = -1;
}
if (angka == 0) {
isiDigit[3] = 0;
return;
}
int posisi = 3;
while (angka > 0 && posisi >= 0) {
isiDigit[posisi] = angka % 10;
angka /= 10;
posisi--;
}
}
void tampilkanSatuDigit(int posisi, int nilai) {
// Matikan semua digit untuk mencegah ghosting
for (int i = 0; i < 4; i++) {
digitalWrite(digitPins[i], HIGH);
}
// Matikan semua segment
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], LOW);
}
// -1 berarti digit dikosongkan
if (nilai < 0 || nilai > 9) {
return;
}
// Tampilkan pola angka
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], polaAngka[nilai][i]);
}
// Aktifkan digit yang dipilih
digitalWrite(digitPins[posisi], LOW);
// Waktu nyala tiap digit (multiplexing)
delayMicroseconds(1000);
// Matikan lagi sebelum pindah ke digit berikutnya
digitalWrite(digitPins[posisi], HIGH);
}
void refreshDisplay() {
for (int i = 0; i < 4; i++) {
tampilkanSatuDigit(i, isiDigit[i]);
}
}