from machine import Pin, ADC, PWM, I2C
import ssd1306
import time
LDR_PIN = ADC(Pin(34))
LDR_PIN.atten(ADC.ATTN_11DB)
PIR_PIN = Pin(13, Pin.IN)
BUTTON_PIN = Pin(12, Pin.IN, Pin.PULL_UP)
LED_WHITE = Pin(25, Pin.OUT) # Lampu jalan
LED_RED = Pin(26, Pin.OUT) # Lampu kecemasan
BUZZER = PWM(Pin(14))# Buzzer
BUZZER.duty(0)
FAN_SERVO = PWM(Pin(27), freq=50) # Servo sebagai kipas wap
TEMP_PIN = ADC(Pin(32))
TEMP_PIN.atten(ADC.ATTN_11DB)
i2c = I2C(1, scl=Pin(22), sda=Pin(21))
print("Scanning for I2C devices...")
devices = i2c.scan()
if not devices:
print("❌ Tiada peranti I2C dikesan. Semak sambungan OLED (SDA=21, SCL=22).")
else:
print("✅ Peranti I2C dikesan:", devices)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
LDR_THRESHOLD = 2000
TEMP_THRESHOLD = 30
def set_angle(angle):
duty = int((angle / 70) * 102 + 26)
FAN_SERVO.duty(duty)
while True:
# --- Bacaan sensor ---
ldr_val = LDR_PIN.read()
pir_val = PIR_PIN.value()
button_val = BUTTON_PIN.value()
temp_val = TEMP_PIN.read() / 4095 * 100
# --- Lampu jalan automatik ---
if ldr_val < LDR_THRESHOLD and pir_val == 1:
LED_WHITE.value(1)
else:
LED_WHITE.value(0)
# --- Lampu kecemasan & buzzer ---
if button_val == 0:
LED_RED.value(1)
BUZZER.freq(1000)
BUZZER.duty(500)
else:
LED_RED.value(0)
BUZZER.duty(0)
# --- Kipas wap (servo) ---
if temp_val > TEMP_THRESHOLD:
set_angle(0)
time.sleep(0.2)
set_angle(60)
time.sleep(0.2)
fan_status = "ON"
else:
set_angle(0)
fan_status = "OFF"
time.sleep(0.2)
oled.fill(0)
oled.text("Smart Street Lamp", 0, 0)
oled.text("Temp: {:.1f} C".format(temp_val), 0, 16)
oled.text("Fan: " + fan_status, 0, 32)
oled.text("LDR: {}".format(ldr_val), 0, 48)
oled.show()
print("LDR:", ldr_val, "PIR:", pir_val, "Button:", button_val, "Temp:", temp_val, "Fan:", fan_status)
time.sleep(1)