from machine import Pin, time_pulse_us
from time import sleep

# Definir os pinos do sensor HC-SR04
TRIG = Pin(27, Pin.OUT)
ECHO = Pin(28, Pin.IN)

# Definir os pinos para os displays de sete segmentos
display1 = [Pin(0, Pin.OUT), Pin(1, Pin.OUT), Pin(3, Pin.OUT), Pin(5, Pin.OUT), Pin(6, Pin.OUT), Pin(7, Pin.OUT), Pin(8, Pin.OUT)]
display2 = [Pin(9, Pin.OUT), Pin(10, Pin.OUT), Pin(11, Pin.OUT), Pin(12, Pin.OUT), Pin(13, Pin.OUT), Pin(14, Pin.OUT), Pin(15, Pin.OUT)]
display3 = [Pin(16, Pin.OUT), Pin(17, Pin.OUT), Pin(18, Pin.OUT), Pin(19, Pin.OUT), Pin(20, Pin.OUT), Pin(21, Pin.OUT), Pin(22, Pin.OUT)]

# Tabela para controlar os segmentos dos números de 0 a 9
numeros = [
    [0, 0, 0, 0, 0, 0, 1],  # 0
    [1, 0, 0, 1, 1, 1, 1],  # 1
    [0, 0, 1, 0, 0, 1, 0],  # 2
    [0, 0, 0, 0, 1, 1, 0],  # 3
    [1, 0, 0, 1, 1, 0, 0],  # 4
    [0, 1, 0, 0, 1, 0, 0],  # 5
    [0, 1, 0, 0, 0, 0, 0],  # 6
    [0, 0, 0, 1, 1, 1, 1],  # 7
    [0, 0, 0, 0, 0, 0, 0],  # 8
    [0, 0, 0, 0, 1, 0, 0]   # 9
]

# Função para exibir um número em um display
def exibir_numero(display, numero):
    for i in range(7):
        display[i].value(numeros[numero][i])

# Função para medir a distância com o HC-SR04
def medir_distancia():
    # Enviar pulso de 10us para TRIG
    TRIG.value(0)
    sleep(0.000002)  # 2 microsegundos
    TRIG.value(1)
    sleep(0.00001)  # 10 microsegundos
    TRIG.value(0)

    # Ler o tempo do pulso no ECHO (timeout de 25ms para evitar bloqueio)
    duracao = time_pulse_us(ECHO, 1, 25000)  # Timeout de 25ms
    
    if duracao < 0:  # Se o sensor não detectar nada dentro do tempo limite
        return -1
    
    # Calcular a distância em centímetros (velocidade do som 343 m/s)
    distancia = (duracao / 2) / 34.3  # Ajustado para cm
    return distancia

# Função principal
def main():
    while True:
        distancia = medir_distancia()
        
        if distancia == -1:
            print("Erro: Fora de alcance")
            distancia = 999  # Valor máximo exibível
        
        # Garantir que a distância fique dentro do intervalo de 0 a 999
        distancia = int(min(max(distancia, 0), 999))
        
        # Extrair dígitos individuais da distância (máximo 999)
        centenas = (distancia // 100) % 10
        dezenas = (distancia // 10) % 10
        unidades = distancia % 10
        
        # Atualizar todos os displays de uma vez
        exibir_numero(display1, centenas)
        exibir_numero(display2, dezenas)
        exibir_numero(display3, unidades)
        
        # Delay maior para estabilizar as leituras
        sleep(1)

BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT