from machine import Pin, PWM, ADC
import time
# Inisialisasi Pin
TRIG = Pin(28, Pin.OUT)
ECHO = Pin(27, Pin.IN)
pir = Pin(21, Pin.IN)
pot = ADC(Pin(26))
servo = PWM(Pin(15))
servo.freq(50)
buzzer = PWM(Pin(14))
buzzer.duty_u16(0)
# Fungsi Bantu
def map_value(value, in_min, in_max, out_min, out_max):
return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
def set_servo_angle(angle):
duty = map_value(angle, 0, 180, 1638, 8192)
servo.duty_u16(duty)
def baca_jarak():
TRIG.low()
time.sleep_us(2)
TRIG.high()
time.sleep_us(10)
TRIG.low()
while ECHO.value() == 0:
start = time.ticks_us()
while ECHO.value() == 1:
end = time.ticks_us()
durasi = end - start
jarak = (durasi * 0.0343) / 2
return jarak
# Melodi Suhu Rendah
def play_low_temp_melody():
for freq in [440, 494, 523]:
buzzer.freq(freq)
buzzer.duty_u16(32768)
time.sleep_ms(200)
buzzer.duty_u16(0)
time.sleep_ms(50)
# Status awal
palang_tertutup = False
mode_otomatis = False
while True:
try:
jarak = baca_jarak()
print("Jarak:", jarak)
# Mode otomatis: kereta terdeteksi
if jarak < 30:
if not mode_otomatis:
print("🚆 Kereta terdeteksi - Mode Otomatis aktif")
set_servo_angle(120)
palang_tertutup = True
mode_otomatis = True
else:
# Hanya aktifkan potensiometer jika tidak dalam mode otomatis
if mode_otomatis:
print("✅ Tidak ada kereta - Mode Manual aktif")
mode_otomatis = False
# Mode manual dari potensiometer
pot_val = pot.read_u16()
angle = map_value(pot_val, 0, 65535, 0, 180)
print("🎛️ Potensio angle:", angle)
set_servo_angle(angle)
palang_tertutup = angle >= 90
# Deteksi gerakan saat palang tertutup
if palang_tertutup and pir.value() == 1:
print("🚶 PIR mendeteksi saat palang tertutup!")
play_low_temp_melody()
else:
buzzer.duty_u16(0)
time.sleep(0.2)
except Exception as e:
print("⚠️ Error:", e)
buzzer.duty_u16(0)
servo.duty_u16(0)
time.sleep(1)