from machine import Pin, PWM
import utime
trigger = Pin(3, Pin.OUT)
echo = Pin(2, Pin.IN)
# Inicialização do Buzzer
buzzer_pin = Pin(16)
buzzer = PWM(buzzer_pin)
buzzer.freq(1000)
buzzer.duty_u16(0) # Inicialmente desligado
# Inicialização dos LEDs
led_verde = Pin(18, Pin.OUT)
led_amarelo = Pin(19, Pin.OUT)
led_vermelho = Pin(20, Pin.OUT)
# Função para garantir que todos os LEDs estejam desligados
def desligar_todos_leds():
    led_verde.value(0)
    led_amarelo.value(0)
    led_vermelho.value(0)
# Inicializa todos os LEDs desligados
desligar_todos_leds()
def getDistance():
    trigger.low() #deixar de enviar
    utime.sleep_us(2)
    trigger.high() #enviar sinal
    utime.sleep_us(5)
    trigger.low()
    while echo.value()==0: #calc tempo sem sinal
        signaloff = utime.ticks_us()
    while echo.value()==1:#calcular até receber sinal
        signalon = utime.ticks_us()
    time = signalon - signaloff #calcular tempo de diferença
    distancia = (time * 0.0343) / 2 #determinação da distancia em cm
    return distancia
# Lógica do Buzzer e dos LEDs
def controlar_buzzer_e_leds(distancia):
    # Desliga todos os LEDs no início de cada ciclo para garantir o estado correto
    desligar_todos_leds()
    # Frequência do buzzer é 1000Hz (já definida na inicialização)
    if distancia < 40:
        # CONDIÇÃO 1: Distância < 40 cm
        
        # LED: Vermelho pisca junto com BUZZER por 0.1s, desliga por 0.1s (total 0.2s de intervalo)
        led_vermelho.value(1) 
        buzzer.duty_u16(32768) # 50% de duty cycle para ligar
        utime.sleep(0.1)
        led_vermelho.value(0)
        buzzer.duty_u16(0) # Desligar
        utime.sleep(0.1)
        
    elif distancia < 100:
        # CONDIÇÃO 2: 40 cm <= Distância < 100 cm
        
        # LED: Amarelo pisca junto com BUZZER por 0.25s, desliga por 0.25s (total 0.5s de intervalo)
        led_amarelo.value(1)           
        buzzer.duty_u16(32768) # 50% de duty cycle para ligar
        utime.sleep(0.25)
        led_amarelo.value(0)
        buzzer.duty_u16(0) # Desligar
        utime.sleep(0.25)
        
    else:
        # CONDIÇÃO 3: Distância >= 100 cm
        
        # LED: Verde acende (buzzer silencioso)
        led_verde.value(1)
        
        # BUZZER: Não toca (buzzer silencioso)
        buzzer.duty_u16(0)
        # Adiciona um pequeno atraso para que a leitura não seja instantânea
        utime.sleep_ms(100) # Mantém o estado por um tempo mínimo
# Loop principal para testar
while True:
    distancia = getDistance()
    print("Distancia: {:.2f} cm".format(distancia))
    controlar_buzzer_e_leds(distancia)