from machine import Pin, PWM, I2C
import ssd1306
import time
# ============================================
# 듀얼 센서 OLED 후방 레이더 시스템
# (双传感器OLED倒车雷达 - 串口带颜色标识)
# ============================================
# ========== 센서 1 (왼쪽/정후방) ==========
trig1 = Pin(2, Pin.OUT)
echo1 = Pin(3, Pin.IN)
# ========== 센서 2 (오른쪽/정후방) ==========
trig2 = Pin(14, Pin.OUT)
echo2 = Pin(15, Pin.IN)
# ========== 부저 및 LED 설정 ==========
buzzer = PWM(Pin(6))
buzzer.duty_u16(0)
led_green = Pin(10, Pin.OUT) # 초록색 LED
led_yellow = Pin(11, Pin.OUT) # 노란색 LED
led_red = Pin(12, Pin.OUT) # 빨간색 LED
# ========== OLED 디스플레이 설정 ==========
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def get_distance(trig, echo):
"""초음파 거리 측정"""
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
duration = time.ticks_diff(end, start)
return (duration * 0.034) / 2
def beep(freq, duration_ms):
"""부저 울리기"""
buzzer.freq(freq)
buzzer.duty_u16(32768)
time.sleep_ms(duration_ms)
buzzer.duty_u16(0)
def update_leds(min_dist):
"""LED 상태 업데이트"""
led_green.value(0)
led_yellow.value(0)
led_red.value(0)
if min_dist > 100:
led_green.value(1)
elif min_dist > 50:
led_yellow.value(1)
else:
led_red.value(1)
def update_oled(dist1, dist2, min_dist):
"""OLED 화면 업데이트"""
oled.fill(0)
# 상단 제목
oled.text("Rear Radar", 20, 0)
oled.text("============", 0, 8)
# 왼쪽 센서 거리
oled.text("L:", 0, 20)
if dist1 < 400:
oled.text(f"{dist1:.0f}cm", 20, 20)
else:
oled.text("---", 20, 20)
# 오른쪽 센서 거리
oled.text("R:", 0, 32)
if dist2 < 400:
oled.text(f"{dist2:.0f}cm", 20, 32)
else:
oled.text("---", 20, 32)
# 최소 거리 (가장 중요)
oled.text("MIN:", 70, 20)
if min_dist < 400:
oled.text(f"{min_dist:.0f}cm", 70, 32)
else:
oled.text("---", 70, 32)
# 상태 표시
oled.text("Status:", 0, 48)
if min_dist > 100:
oled.text("SAFE", 60, 48)
elif min_dist > 50:
oled.text("CAUTION", 60, 48)
else:
oled.text("WARNING!", 60, 48)
oled.show()
def main():
print("=" * 50)
print(" 🚗 듀얼 센서 OLED 후방 레이더 🚗")
print(" Dual Sensor OLED Radar System")
print("=" * 50)
print("시스템 준비 완료!\n")
# LED 점검
for led, name, color in [(led_green, "초록", "GREEN"), (led_yellow, "노랑", "YELLOW"), (led_red, "빨강", "RED")]:
led.value(1)
print(f"{name}({color}) LED 점검")
time.sleep(0.2)
led.value(0)
beep(1000, 100)
print("부저 점검 완료\n")
while True:
dist1 = get_distance(trig1, echo1)
time.sleep_ms(50)
dist2 = get_distance(trig2, echo2)
min_dist = min(dist1, dist2)
# OLED 업데이트
update_oled(dist1, dist2, min_dist)
# 거리 바 만들기
bar_len = min(int(min_dist / 5), 20)
bar = "█" * bar_len + "░" * (20 - bar_len)
# 상태 한글 + 영문 색상 출력
if min_dist > 100:
status_kr = "안전"
status_en = "GREEN"
icon = "🟢"
elif min_dist > 50:
status_kr = "주의"
status_en = "YELLOW"
icon = "🟡"
else:
status_kr = "위험!!"
status_en = "RED"
icon = "🔴"
# 터미널 출력 (한글 + 영문색상 + 아이콘)
print(f"\n왼쪽: {dist1:.0f}cm | 오른쪽: {dist2:.0f}cm")
print(f"최소거리: {min_dist:.0f}cm [{bar}]")
print(f"상태: {status_kr} [{status_en}] {icon}")
# LED 업데이트
update_leds(min_dist)
# 부저 알람
if min_dist < 30:
beep(2000, 150)
time.sleep_ms(100)
elif min_dist < 50:
beep(1500, 200)
time.sleep_ms(300)
elif min_dist < 100:
beep(1000, 200)
time.sleep_ms(600)
else:
time.sleep_ms(500)
if __name__ == "__main__":
main()