from machine import Pin, PWM, ADC
import time
# Конфигурация пинов
BUTTON_DOT_PIN = 14 # Пин для кнопки "точка"
BUTTON_DASH_PIN = 13 # Пин для кнопки "тире"
BUZZER_PIN = 5 # Пин для бузера
RELAY_PIN = 32 # Пин для управления реле
POTENTIOMETER_PIN = 34 # Пин для потенциометра (скорость)
# Инициализация компонентов
button_dot = Pin(BUTTON_DOT_PIN, Pin.IN, Pin.PULL_UP)
button_dash = Pin(BUTTON_DASH_PIN, Pin.IN, Pin.PULL_UP)
buzzer = PWM(Pin(BUZZER_PIN))
buzzer.duty_u16(0) # Отключаем бузер по умолчанию
relay = Pin(RELAY_PIN, Pin.OUT)
potentiometer = ADC(POTENTIOMETER_PIN)
# Настройка начальных значений
MIN_SPEED = 1 # Минимальная скорость (1 WPM)
MAX_SPEED = 30 # Максимальная скорость (30 WPM)
buzz_frequency = 1000 # Частота звука бузера
# Функция для обработки нажатия кнопки
def process_button_press(button, duration):
buzzer.freq(buzz_frequency) # Устанавливаем частоту бузера
buzzer.duty_u16(32768) # Включаем бузер (50% duty cycle)
time.sleep_ms(duration) # Ждем заданную длительность
buzzer.duty_u16(0) # Выключаем бузер
time.sleep_ms(dot_duration) # Пауза между элементами
# Основной цикл программы
while True:
# Считываем значение потенциометра для регулировки скорости
pot_value = potentiometer.read_u16()
speed = MIN_SPEED + (pot_value / 65535) * (MAX_SPEED - MIN_SPEED) # Нормализуем скорость от MIN_SPEED до MAX_SPEED
dot_duration = int(1200 / speed) # Длительность точки в миллисекундах
dash_duration = dot_duration * 3 # Длительность тире в миллисекундах
inter_element_gap = dot_duration # Интервал между элементами
# Проверяем нажатие кнопок
if button_dot.value() == 0 and button_dash.value() == 1: # Нажата кнопка "точка"
relay.value(1) # Включаем реле сразу после нажатия
time.sleep_ms(50) # Ждем 50 мс перед формированием сигнала
# Если кнопка все еще нажата, формируем точку
if button_dot.value() == 0:
process_button_press(button_dot, dot_duration)
else:
# Если кнопка отпущена earlier than 50 мс, формируем минимальный сигнал (точку)
process_button_press(button_dot, dot_duration)
elif button_dash.value() == 0 and button_dot.value() == 1: # Нажата кнопка "тире"
relay.value(1) # Включаем реле сразу после нажатия
time.sleep_ms(50) # Ждем 50 мс перед формированием сигнала
# Если кнопка все еще нажата, формируем тире
if button_dash.value() == 0:
process_button_press(button_dash, dash_duration)
else:
# Если кнопка отпущена earlier than 50 мс, все равно формируем тире
process_button_press(button_dash, dash_duration)
else: # Если ни одна кнопка не нажата
relay.value(0) # Выключаем реле
# Если реле было включено и ни одна кнопка не нажата в течение 500 мс
start_time = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start_time) < 500:
if button_dot.value() == 0 or button_dash.value() == 0:
break # Если какая-либо кнопка нажата, прерываем ожидание
else:
relay.value(0) # Если прошло 500 мс без нажатия, выключаем реле
time.sleep_ms(10) # Короткая пауза для оптимизации работы