AllInfo
Main: Info Blog Temp Mail


wrk 2025-02-04 11-30-09

  варианты обработки нажатий кнопок circuitpython
 
if not button_down.value:
handle_button_down()
while not button_down.value: # Ждем, пока кнопка не освободится
pass 

---------- мне понравился твой подход к обработке нажатий... дай еще варианты по этому вопросу

Token Speed: 3.11t/s =======================================

Конечно! Вот несколько вариантов обработки нажатий кнопок с использованием различных методов. Все они помогут вам избежать проблем с дребезжением контактов кнопок.



1. Использование таймера для антидребезга
Этот метод добавляет задержку после отпускания кнопки, чтобы убедиться, что нажатие было корректным.

python
Copy
import time

# Параметры антидребезга
DEBOUNCE_DELAY = 0.1

last_button_up_state = True
last_button_down_state = True
button_up_pressed_time = None
button_down_pressed_time = None

while True:
    current_button_up_state = button_up.value
    current_button_down_state = button_down.value
    
    if not last_button_up_state and current_button_up_state:
        # Кнопка "Добавить минуту" отпущена, проверяем время нажатия
        if button_up_pressed_time is not None:
            current_time = time.time()
            if (current_time - button_up_pressed_time) >= DEBOUNCE_DELAY:
                handle_button_up()
        
    if not last_button_down_state and current_button_down_state:
        # Кнопка "Уменьшить минуту" отпущена, проверяем время нажатия
        if button_down_pressed_time is not None:
            current_time = time.time()
            if (current_time - button_down_pressed_time) >= DEBOUNCE_DELAY:
                handle_button_down()
    
    # Обновляем состояния кнопок и время нажатия
    last_button_up_state = current_button_up_state
    last_button_down_state = current_button_down_state
    
    if not current_button_up_state and last_button_up_state:
        button_up_pressed_time = time.time()
    else:
        button_up_pressed_time = None
    
    if not current_button_down_state and last_button_down_state:
        button_down_pressed_time = time.time()
    else:
        button_down_pressed_time = None
    
    # Основной цикл программы
    # Обработка нажатий кнопок и другие задачи...
    
    time.sleep(MAIN_LOOP_DELAY)




2. Использование флагов для обработки нажатий
Этот метод использует флаги, чтобы отслеживать состояние кнопок и избегать повторных вызовов функций при дребезжении.

python
Copy
button_up_pressed = False
button_down_pressed = False

while True:
    current_button_up_state = button_up.value
    current_button_down_state = button_down.value
    
    if not last_button_up_state and current_button_up_state:
        # Кнопка "Добавить минуту" отпущена, устанавливаем флаг
        button_up_pressed = True
    
    if not last_button_down_state and current_button_down_state:
        # Кнопка "Уменьшить минуту" отпущена, устанавливаем флаг
        button_down_pressed = True
    
    # Обработка нажатий кнопок
    if button_up_pressed:
        handle_button_up()
        button_up_pressed = False  # Сбрасываем флаг после обработки
    
    if button_down_pressed:
        handle_button_down()
        button_down_pressed = False  # Сбрасываем флаг после обработки
    
    # Обновляем состояния кнопок
    last_button_up_state = current_button_up_state
    last_button_down_state = current_button_down_state
    
    # Основной цикл программы
    # Обработка нажатий кнопок и другие задачи...
    
    time.sleep(MAIN_LOOP_DELAY)




3. Использование библиотеки для антидребезга (например, debounce)
Если вы хотите использовать готовые решения, можно воспользоваться библиотеками, которые обрабатывают антидребезг автоматически.

python
Copy
from adafruit_debouncer import Debouncer

# Инициализация объектов для антидребезга
button_up_debouncer = Debouncer(button_up)
button_down_debouncer = Debouncer(button_down)

while True:
    button_up_debouncer.update()
    button_down_debouncer.update()
    
    if button_up_debouncer.fell:
        handle_button_up()
    
    if button_down_debouncer.fell:
        handle_button_down()
    
    # Основной цикл программы
    # Обработка нажатий кнопок и другие задачи...
    
    time.sleep(MAIN_LOOP_DELAY)




4. Использование таймера для периодической проверки состояния кнопок
Этот метод позволяет регулярно проверять состояние кнопок с интервалом, что помогает избежать дребезжания.

python
Copy
CHECK_INTERVAL = 0.1

while True:
    current_button_up_state = button_up.value
    current_button_down_state = button_down.value
    
    if not last_button_up_state and current_button_up_state:
        handle_button_up()
    
    if not last_button_down_state and current_button_down_state:
        handle_button_down()
    
    # Обновляем состояния кнопок
    last_button_up_state = current_button_up_state
    last_button_down_state = current_button_down_state
    
    # Основной цикл программы
    # Обработка нажатий кнопок и другие задачи...
    
    time.sleep(CHECK_INTERVAL)




Выберите метод, который лучше всего подходит для вашей задачи. Все эти варианты помогут вам избежать проблем с дребезжением контактов кнопок и обеспечить корректную обработку нажатий.


3.145.153.48 / 2025-02-05_06-55-06 UTC.