// Deklarasi pin untuk tombol dan LED
const int buttonPin = 2;  // Pin untuk tombol
const int ledPins[] = {27, 14, 12, 13};  // Pin untuk 4 LED
int buttonState;           // Variabel untuk menyimpan keadaan tombol
int lastButtonState = LOW; // Keadaan tombol terakhir
unsigned long lastDebounceTime = 0;  // Waktu tombol terakhir ditekan
unsigned long debounceDelay = 50;    // Debounce delay (50ms)

// Variabel untuk menghitung jumlah penekanan
int pressCount = 0;

// Variabel untuk menyimpan status LED terakhir
int lastLedState = 0;

// Variabel untuk jeda setelah penekanan tombol
unsigned long lastPressTime = 0;   // Waktu tombol terakhir ditekan
unsigned long waitTime = 1000;     // Jeda 1 detik sebelum LED menyala

void setup() {
  // Set LED sebagai output
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  // Set tombol sebagai input
  pinMode(buttonPin, INPUT);
}

void loop() {
  int reading = digitalRead(buttonPin);

  // Cek apakah tombol mengalami perubahan (debounce)
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  // Jika tombol stabil selama debounce delay, update state
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      // Jika tombol ditekan (HIGH ke LOW transition)
      if (buttonState == HIGH) {
        pressCount++; // Tambah hitungan penekanan

        // Hitungan berulang setelah 16 (0-15), reset ke 0 setelah mencapai 16
        pressCount = pressCount % 16;

        // Catat waktu terakhir tombol ditekan untuk mulai menghitung jeda
        lastPressTime = millis();

        // Simpan status LED terbaru sesuai dengan pressCount
        lastLedState = pressCount;
      }
    }
  }

  // Cek apakah jeda 1 detik sudah berlalu setelah tombol ditekan
  if ((millis() - lastPressTime) >= waitTime) {
    // Update LED berdasarkan hitungan setelah 1 detik
    for (int i = 0; i < 4; i++) {
      digitalWrite(ledPins[i], (lastLedState >> i) & 1);
    }

    // Setelah LED menyala, reset pressCount segera
    pressCount = 0; // Reset hitungan penekanan
  }

  lastButtonState = reading; // Simpan state tombol terakhir
}