Реверсивный счетчик
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()
Комментарии
Отправить комментарий