from machine import Pin, time_pulse_us
from time import sleep
# Класс для управления семисегментным дисплеем
class SevenSegment:
def __init__(self, segment_pins, digit_pins):
self.segments = [Pin(pin, Pin.OUT) for pin in segment_pins]
self.digits = [Pin(pin, Pin.OUT) for pin in digit_pins]
self.digit_count = len(digit_pins)
# Отображение цифр 0-9
self.digit_map = [
[1, 1, 1, 1, 1, 1, 0, 0], # 0
[0, 1, 1, 0, 0, 0, 0, 0], # 1
[1, 1, 0, 1, 1, 0, 1, 0], # 2
[1, 1, 1, 1, 0, 0, 1, 0], # 3
[0, 1, 1, 0, 0, 1, 1, 0], # 4
[1, 0, 1, 1, 0, 1, 1, 0], # 5
[1, 0, 1, 1, 1, 1, 1, 0], # 6
[1, 1, 1, 0, 0, 0, 0, 0], # 7
[1, 1, 1, 1, 1, 1, 1, 0], # 8
[1, 1, 1, 1, 0, 1, 1, 0] # 9
]
def clear(self):
# Очищаем все цифры и сегменты
for digit in self.digits:
digit.on()
for segment in self.segments:
segment.off()
def display_digit(self, digit, value):
self.clear()
# Проверяем диапазоны
if not (0 <= digit < self.digit_count):
return
if not (0 <= value < len(self.digit_map)):
return
# Включаем соответствующие сегменты
for i, segment in enumerate(self.segments):
segment.value(self.digit_map[value][i])
# Активируем текущую цифру
self.digits[digit].off()
sleep(0.005)
self.digits[digit].on()
def display(self, value):
# Дополняем строку нулями вручную
value = pad_with_zeros(value, self.digit_count)
for i, char in enumerate(value):
if char.isdigit():
self.display_digit(i, int(char))
sleep(0.002) # Добавляем задержку между цифрами
# Функция для дополнения строки нулями слева
def pad_with_zeros(value, length):
value = str(value) # Преобразуем в строку
while len(value) < length:
value = "0" + value
return value
# Пины для ультразвукового датчика
TRIG_PIN = 5
ECHO_PIN = 18
# Пины для семисегментного дисплея
SEG_PINS = [2, 4, 16, 17, 21, 22, 23, 19] # Пины сегментов: A, B, C, D, E, F, G, DP
DIGIT_PINS = [25, 26, 27, 14] # Пины выбора цифр
# Настраиваем пины для ультразвукового датчика
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# Настраиваем дисплей
seven_seg = SevenSegment(SEG_PINS, DIGIT_PINS)
# Функция для измерения расстояния
def measure_distance():
trig.off()
sleep(0.002)
trig.on()
sleep(0.01)
trig.off()
# Считываем время эха
pulse_time = time_pulse_us(echo, 1, 30000)
if pulse_time < 0:
return None
# Расчёт расстояния в сантиметрах
distance = (pulse_time / 2) / 29.1
return round(distance)
# Главный цикл
while True:
distance = measure_distance()
if distance is None or distance > 400:
display_value = "----"
else:
display_value = str(distance)
# Дополняем строку вручную до 4 цифр
display_value = pad_with_zeros(display_value, 4)
# Отображаем значение на дисплее
seven_seg.display(display_value)
sleep(0.01)