from machine import Pin, I2C
import time
import ssd1306 # Impor pustaka SSD1306 yang sudah diunggah
# --- Konfigurasi Pin ---
LED_MERAH_PIN = 15
LED_KUNING_PIN = 14
LED_HIJAU_PIN = 13
BUTTON_PIN = 16 # Untuk tombol pedestrian
# Inisialisasi LED sebagai output
led_merah = Pin(LED_MERAH_PIN, Pin.OUT)
led_kuning = Pin(LED_KUNING_PIN, Pin.OUT)
led_hijau = Pin(LED_HIJAU_PIN, Pin.OUT)
# Inisialisasi tombol dengan pull-up internal
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
# --- Konfigurasi OLED ---
# Inisialisasi I2C untuk OLED
# SDA = GP8, SCL = GP9
i2c = I2C(1, scl=Pin(9), sda=Pin(8), freq=400000) # Pastikan pin I2C sesuai
# Ukuran layar OLED
OLED_WIDTH = 128
OLED_HEIGHT = 64
oled = ssd1306.SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, i2c)
# --- Variabel Global ---
LALU_LINTAS_NORMAL_MODE = True
PEDESTRIAN_CALL_ACTIVE = False
# --- Fungsi untuk Kontrol Lampu ---
def set_lights(merah, kuning, hijau):
led_merah.value(merah)
led_kuning.value(kuning)
led_hijau.value(hijau)
def display_status(text1, text2=""):
oled.fill(0) # Bersihkan layar
oled.text(text1, 0, 0)
oled.text(text2, 0, 16)
oled.show()
def traffic_sequence_normal():
global LALU_LINTAS_NORMAL_MODE
LALU_LINTAS_NORMAL_MODE = True
display_status("Lalu Lintas:", "HIJAU")
set_lights(0, 0, 1) # Hijau
time.sleep(5) # Durasi lampu hijau
if not LALU_LINTAS_NORMAL_MODE: # Jika mode berubah saat jeda, langsung keluar
return
display_status("Lalu Lintas:", "KUNING")
set_lights(0, 1, 0) # Kuning
time.sleep(2) # Durasi lampu kuning
if not LALU_LINTAS_NORMAL_MODE: # Jika mode berubah saat jeda, langsung keluar
return
display_status("Lalu Lintas:", "MERAH")
set_lights(1, 0, 0) # Merah
time.sleep(5) # Durasi lampu merah
def pedestrian_sequence():
global PEDESTRIAN_CALL_ACTIVE
display_status("PEDESTRIAN CALL:", "MOHON TUNGGU!")
set_lights(0, 1, 0) # Kuning (peringatan)
time.sleep(2)
display_status("PEDESTRIAN CALL:", "JALAN SEKARANG!")
set_lights(1, 0, 0) # Merah (untuk kendaraan)
# Anda bisa tambahkan LED khusus pejalan kaki di sini jika ada
time.sleep(7) # Waktu untuk penyeberangan
display_status("PEDESTRIAN CALL:", "PERSIAPAN..")
set_lights(0, 1, 0) # Kuning kembali
time.sleep(2)
PEDESTRIAN_CALL_ACTIVE = False # Reset flag setelah selesai
display_status("Lalu Lintas:", "NORMAL")
# --- Handler Tombol (Interrupt) ---
def button_handler(pin):
global LALU_LINTAS_NORMAL_MODE, PEDESTRIAN_CALL_ACTIVE
time.sleep_ms(50) # Debounce
if button.value() == 0 and not PEDESTRIAN_CALL_ACTIVE: # Tombol ditekan (low) dan belum ada pedestrian call
LALU_LINTAS_NORMAL_MODE = False
PEDESTRIAN_CALL_ACTIVE = True
print("Tombol Pejalan Kaki Ditekan!")
# Daftarkan interrupt untuk tombol
button.irq(trigger=Pin.IRQ_FALLING, handler=button_handler)
# --- Program Utama ---
display_status("SISTEM LALU LINTAS", "Memulai...")
time.sleep(2)
while True:
if LALU_LINTAS_NORMAL_MODE:
traffic_sequence_normal()
elif PEDESTRIAN_CALL_ACTIVE:
pedestrian_sequence()
# Setelah pedestrian sequence selesai, kembali ke mode normal
LALU_LINTAS_NORMAL_MODE = True