from machine import I2C, Pin
from utime import sleep, ticks_us, ticks_diff
from picozero import Speaker
from pico_i2c_lcd import I2cLcd
trig = Pin(2, Pin.OUT)
echo = Pin(3, Pin.IN)
buzzer = Speaker(16)
botao = Pin(15, Pin.IN)
ultimo_estado = False
i2c = I2C(0, scl=Pin(21), sda=Pin(20), freq=400000)
I2C_ADDR = i2c.scan()[0]
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
lcd.putstr(f"Distancia:")
def verificar_botao():
global ultimo_estado
estado_atual = botao.value()
if estado_atual == 1 and ultimo_estado:
ultimo_estado = False
elif estado_atual == 1 and not ultimo_estado:
ultimo_estado = True
return
while True:
verificar_botao()
# Garante que o TRIG está em nível baixo
trig.low()
sleep(0.002) # Aguarda 2ms para estabilizar
# Envia um pulso de 10us
trig.high()
sleep(0.00001)
trig.low()
while echo.value() == 0:
start = ticks_us()
while echo.value() == 1:
end = ticks_us()
duracao = ticks_diff(end, start)
distancia = (duracao * 0.0343) / 2
"""
343 metros/segundo = 34.300 centímetros/segundo
1 segundo = 1.000.000 microssegundos
34300 ÷ 1.000.000 = 0,0343 centímetros por microssegundo
"""
if ultimo_estado == True:
tempo = distancia ** 1.35 / 1000
if distancia < 100:
if tempo < 0.04:
buzzer.on()
else:
buzzer.on()
sleep(tempo)
buzzer.off()
sleep(tempo)
else:
buzzer.off()
lcd.move_to(0, 1)
lcd.putstr(f"{distancia:.2f} cm ")
sleep(0.5) # Aguarda 1 segundo antes da próxima leitura