int redLED = 15;              // inisialisasi pin LED merah
int yellowLED = 2;            // inisialisasi pin LED kuning
int greenLED = 4;             // inisialisasi pin LED hijau
int pushButton = 5;           // inisialisasi pin push button
int buzzer = 18;              // inisialisasi pin buzzer

unsigned long ms_from_start = 0;                  // waktu yang berlalu sejak program dimulai dalam miliseconds
unsigned long ms_yellow_led_previous_time = 0;    // waktu terakhir ketika led kuning berubah kondisi
int yellow_led_interval = 1000;                   // durasi blinknig
int yellow_led_state = 1;                         // kondisi led kuning (on or off)


void setup() {
  Serial.begin(115200);               // memberi perintah untuk menampilkan teks
  Serial.println("Hello, ESP32!");    // menampilkan teks "Hello, ESP32!"
  pinMode(redLED, OUTPUT);            // menjadikan LED Merah Sebagai output
  pinMode(yellowLED, OUTPUT);         // menjadikan LED Kuning sebagai output
  pinMode(greenLED, OUTPUT);          // menjadikan LED Hijau sebagai output
  pinMode(pushButton, INPUT_PULLUP);  // menjadikan Push Button sebagai input
  pinMode(buzzer, OUTPUT);            // menjadikan buzzer sebagai output
}

void loop() {
  ms_from_start = millis();   // menjalankan waktu internal setiap milli second

int pushButtonState = digitalRead(pushButton);    // inisialisasi untuk membaca pushbutton

if(pushButtonState == LOW)        // menyatakan decision jika kondisi pushbutton off
{
    Serial.println("Silahkan Menyebrang Jalan");   // menampilkan teks ke console
    digitalWrite(redLED, LOW);                     // mematikan led merah
    digitalWrite(yellowLED, LOW);                  // mematikan led kuning

    // menyalakan led hijau dan buzzer selama 4 detik
    digitalWrite(greenLED, HIGH);
    digitalWrite(buzzer, HIGH);
    delay(4000);
}

// jika push button tidak ditekan
else if(pushButtonState == HIGH)    // menyatakan decision jika kondisi pushbutton on
{
    Serial.println("Dilarang Menyebrang");          // menampilkan teks ke console
    digitalWrite(greenLED, LOW);                    // mematikan led hijau
    digitalWrite(redLED, HIGH);                     // menyalakan led merah

    // blinking led kuning setiap 1 detik
    digitalWrite(yellowLED, yellow_led_state);
    if(ms_from_start - ms_yellow_led_previous_time > yellow_led_interval)
    {
      ms_yellow_led_previous_time = ms_from_start;

      if(yellow_led_state == 1)
        yellow_led_state = 0;
      else
        yellow_led_state = 1;

      
    }

}

  delay(10); // this speeds up the simulation
}