import machine
import utime
# ─── PINOS ────────
TRIG_PIN = 5
ECHO_PIN = 18
LED_VERDE = 27 # controla led5 e led6 juntos
LED_AMARELO = 14 # controla led3 e led4 juntos
LED_VERMELHO = 12 # controla led1 e led2 juntos
BUZZER_PIN = 13
# ─── LIMIARES DE DISTÂNCIA (cm) ───────────────────
DIST_MAX = 100
DIST_VERDE = 60
DIST_AMARELO = 30
DIST_CRITICO = 10
# ─── INICIALIZAÇÃO ────────────────────────────────
trig = machine.Pin(TRIG_PIN, machine.Pin.OUT)
echo = machine.Pin(ECHO_PIN, machine.Pin.IN)
led_v = machine.Pin(LED_VERDE, machine.Pin.OUT)
led_a = machine.Pin(LED_AMARELO, machine.Pin.OUT)
led_r = machine.Pin(LED_VERMELHO, machine.Pin.OUT)
todos_leds = [led_v, led_a, led_r]
buzzer = machine.PWM(machine.Pin(BUZZER_PIN), freq=1000, duty=0)
# ─── BUZZER ───────────────────────────────────────
def buzzer_on(freq: int = 1000):
buzzer.freq(freq)
buzzer.duty(512)
def buzzer_off():
buzzer.duty(0)
def beep(freq: int = 1000, duracao_ms: int = 100, pausa_ms: int = 100):
buzzer_on(freq)
utime.sleep_ms(duracao_ms)
buzzer_off()
utime.sleep_ms(pausa_ms)
# ─── LEDs ─────────────────────────────────────────
def apagar_tudo():
for led in todos_leds:
led.value(0)
buzzer_off()
def so_verde():
led_v.value(1)
led_a.value(0)
led_r.value(0)
def so_amarelo():
led_v.value(0)
led_a.value(1)
led_r.value(0)
def so_vermelho():
led_v.value(0)
led_a.value(0)
led_r.value(1)
# ─── HC-SR04 ──────────────────────────────────────
def medir_distancia() -> float:
"""Retorna distância em cm; -1 em caso de timeout."""
trig.value(0)
utime.sleep_us(2)
trig.value(1)
utime.sleep_us(10)
trig.value(0)
inicio = utime.ticks_us()
while echo.value() == 0:
if utime.ticks_diff(utime.ticks_us(), inicio) > 30_000:
return -1.0
t_subida = utime.ticks_us()
while echo.value() == 1:
if utime.ticks_diff(utime.ticks_us(), t_subida) > 38_000:
return -1.0
duracao = utime.ticks_diff(utime.ticks_us(), t_subida)
return (duracao * 0.034) / 2
# ─── LÓGICA DE ZONAS ──────────────────────────────
def processar_zona(dist: float):
if dist < 0 or dist > DIST_MAX:
apagar_tudo()
print(f"[---- ] objeto fora do alcance")
utime.sleep_ms(200)
elif dist > DIST_VERDE: # 60–100 cm - bipe mais lento
so_verde()
print(f"[VERDE ] {dist:.1f} cm — Seguro")
utime.sleep_ms(200)
beep(freq=1000, duracao_ms=160, pausa_ms=560)
elif dist > DIST_AMARELO: # 30–60 cm — bipe lento
so_amarelo()
print(f"[AMARELO ] {dist:.1f} cm — Atenção")
beep(freq=800, duracao_ms=120, pausa_ms=380)
elif dist > DIST_CRITICO: # 10–30 cm — bipe rápido
so_vermelho()
print(f"[VERMELHO] {dist:.1f} cm — Perigo!")
beep(freq=1200, duracao_ms=80, pausa_ms=120)
else: # < 10 cm — bipe contínuo
so_vermelho()
buzzer_on(freq=1500)
print(f"[CRÍTICO ] {dist:.1f} cm — PARE!")
utime.sleep_ms(200)
# ─── TESTE DE BOOT ────────────────────────────────
def teste_boot():
print("=" * 40)
print(" SENSOR DE ESTACIONAMENTO v3 — OK")
print("=" * 40)
# Sequência visual: verde → amarelo → vermelho
for led in todos_leds:
led.value(1)
utime.sleep_ms(200)
led.value(0)
# Dois bipes de confirmação
beep(freq=1000, duracao_ms=150, pausa_ms=80)
beep(freq=1400, duracao_ms=150, pausa_ms=80)
apagar_tudo()
utime.sleep_ms(300)
# ─── LOOP PRINCIPAL ───────────────────────────────
def main():
teste_boot()
while True:
dist = medir_distancia()
processar_zona(dist)
if __name__ == "__main__":
main()