#include <Wire.h> // Untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Perpustakaan untuk LCD I2C
#include <TM1637Display.h> // Perpustakaan untuk TM1637
const int buttonPin = 2; // Pin untuk tombol
const int ledPin = 10; // Pin LED built-in Arduino
const int buzzerPin = 8; // Pin buzzer
const int pirPin = 4; // Pin PIR Motion Sensor
const int ledPins[] = {9, 6, 5, 3}; // Pin LED
const int numLEDs = sizeof(ledPins) / sizeof(ledPins[0]);
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C LCD, 20 karakter x 4 baris
TM1637Display display(13, 12); // Menggunakan pin 2 untuk CLK dan pin 3 untuk DIO
bool buttonPressed = false;
int countdown = 15; // Hitung mundur awal dalam detik
bool isCountdownStarted = false; // Apakah hitung mundur sudah dimulai?
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(ledPin, LOW);
noTone(buzzerPin); // Pastikan buzzer dimatikan pada awalnya
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
lcd.setCursor(3, 0);
lcd.print("Smart Croosing");
lcd.setCursor(4, 2);
lcd.print("Tekan tombol ");
lcd.setCursor(1, 3);
lcd.print("Dan tunggu berbunyi");
pinMode(pirPin, INPUT);
for (int i = 0; i < numLEDs; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // Matikan semua LED pada awalnya
}
// Matikan tampilan tujuh segmen
display.setBrightness(0x00); // Kecerahan 0x00 adalah mati
display.showNumberDec(0); // Tampilkan angka 0 pada tujuh segmen
Serial.begin(9600);
}
void loop() {
int motion = digitalRead(pirPin); // Baca status sensor PIR
if (motion == HIGH) {
Serial.println("Terdapat kendaraan lewat");
for (int i = 0; i < numLEDs; i++) {
digitalWrite(ledPins[i], HIGH); // Nyalakan LED secara bergantian
delay(500); // Tunggu sebentar
digitalWrite(ledPins[i], LOW); // Matikan LED
}
}
// Periksa apakah tombol ditekan
if (digitalRead(buttonPin) == LOW && !buttonPressed && !isCountdownStarted) {
buttonPressed = true;
isCountdownStarted = true; // Mulai hitung mundur
unsigned long startTime = millis();
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Smart Croosing");
lcd.setCursor(1, 2);
lcd.print("Sebelum menyebrang");
lcd.setCursor(2, 3);
lcd.print("Lihat kiri kanan");
delay(1000);
while (millis() - startTime < 30000) {
digitalWrite(ledPin, HIGH); // Nyalakan LED
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer
tone(buzzerPin, 200);
display.showNumberDec(countdown); // Tampilkan hitung mundur
delay(900); // Waktu menyala
digitalWrite(ledPin, LOW); // Matikan LED
digitalWrite(buzzerPin, LOW); // Matikan buzzer
noTone(buzzerPin); // Matikan bunyi buzzer
display.showNumberDec(countdown); // Tampilkan hitung mundur
delay(900); // Waktu mati
countdown--; // Kurangi hitung mundur
}
digitalWrite(ledPin, LOW); // Matikan LED
digitalWrite(buzzerPin, LOW); // Matikan buzzer
noTone(buzzerPin); // Matikan bunyi buzzer
countdown = 15; // Reset hitung mundur
delay(1000); // Tunggu sebentar sebelum mengakhiri program
buttonPressed = false; // Setel ulang variabel buttonPressed
isCountdownStarted = false; // Setel ulang variabel isCountdownStarted
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Smart Croosing");
lcd.setCursor(4, 2);
lcd.print("Tekan tombol ");
lcd.setCursor(1, 3);
lcd.print("Dan tunggu berbunyi");
}
}