Реверсивный счетчик

import RPi.GPIO as GPIO

import time


# Настройки

INCREASE_PIN = 17 # Пин для увеличения счетчика

DECREASE_PIN = 27 # Пин для уменьшения счетчика

START_COUNT = 0 # Начальное значение счетчика

DELAY_MS = 10 # Интервал записи в миллисекундах

PAUSE_THRESHOLD_MS = 100 # Порог паузы в миллисекундах

OUTPUT_FILE = "counter_log.txt" # Файл для записи показаний

DEBOUNCE_TIME_MS = 50 # Обработка дребезга


GPIO.setmode(GPIO.BCM)

GPIO.setup(INCREASE_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(DECREASE_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)


def write_counter_value(count):

    with open(OUTPUT_FILE, "a") as f:

        f.write(f"{count}\n")


def main():

    count = START_COUNT

    last_change_time = 0 # Для отслеживания времени последнего изменения

    last_write_time = time.time()

    write_counter_value(count)


    increase_debounce = 0

    decrease_debounce = 0


    while True:

        current_time = time.time()

        elapsed_from_change = (current_time - last_change_time) * 1000 if last_change_time else PAUSE_THRESHOLD_MS + 1

        elapsed_from_write = (current_time - last_write_time) * 1000


        # Обработка кнопок с подавлением дребезга

        increase_pressed = GPIO.input(INCREASE_PIN) == GPIO.LOW

        decrease_pressed = GPIO.input(DECREASE_PIN) == GPIO.LOW


        # Увеличение счетчика

        if increase_pressed and (current_time - increase_debounce) * 1000 > DEBOUNCE_TIME_MS:

            if not decrease_pressed: # Не изменяйте, если оба пина активны

                count += 1

                last_change_time = current_time

                increase_debounce = current_time


        # Уменьшение счетчика

        elif decrease_pressed and (current_time - decrease_debounce) * 1000 > DEBOUNCE_TIME_MS:

            if not increase_pressed: # Не изменяйте, если оба пина активны

                count -= 1

                last_change_time = current_time

                decrease_debounce = current_time


        # Запись в файл

        if elapsed_from_write >= DELAY_MS:

            write_counter_value(count)

            last_write_time = current_time


        # Проверка на паузу

        if elapsed_from_change > PAUSE_THRESHOLD_MS and last_change_time != 0:

            print("Ничего не произошло в течение 100 мс. Завершение работы.")

            break


        time.sleep(0.001) # Небольшая пауза для снижения нагрузки на CPU


try:

    main()

except KeyboardInterrupt:

    print("Счетчик остановлен.")

finally:

    GPIO.cleanup()



Комментарии

Популярные сообщения из этого блога

Распознавание речи без библиотек

Задержка звука с Python

Усилитель на микросхеме ILA7056. - Радиолюбитель - это просто