Датчик движения нити с Raspberry Pi и OctoPrint

Я пытаюсь сделать датчик движения нити и интегрировать его с Octoprint, работающим на Raspberry Pi 3 model B+.
Моя цель - создать устройство, которое приостанавливает печать, когда обнаруживает, что нить не движется в течение определенного времени, скажем, 10 секунд.
Я уже собрал прототип из лежащего вокруг хлама и игрушечной машинки, украденной у моего брата, и подключил его к Raspberry. Он использует модуль кодировщика оптопары со встроенным LM393 и другим оборудованием. Его цифровой выход подключен к контакту GPIO Raspberry. Нить накала проходит между резиновыми колесами, поворачивая их, а на оси верхнего колеса установлено колесо энкодера, изменяющее состояние датчика.
А вот и моя проблема. Я не совсем знаком с Python, особенно с прерываниями.
Я умею читать состояние датчика в цикле:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
try:
    while True:
     if (GPIO.input(26) == 1)
      do magic
     elif (GPIO.input(26) == 0)
      do other magic

Я также видел, что для этого лучше использовать прерывания:

GPIO.setup(pin, GPIO.IN)    
GPIO.add_event_detect(pin, GPIO.BOTH, callback = function)

но я понятия не имею, как настроить обратный отсчет, который будет отсчитывать от 10 до 0 после изменения состояния датчика И который останавливался и сбрасывался при изменении состояния и снова считал.
Когда обратный отсчет фактически дойдет до 0, это вызовет другой вывод GPIO.

После решения этой проблемы я бы использовал плагин OctoPrint для обработки сигнала индикации замятия и приостановки печати.
Я бы также с радостью сделал лучший дизайн сенсора и поделился бы им с вещами или чем-то еще.

И да, я знаю, что коммерческий универсальный датчик заклинивания уже существует, но нет никакого удовольствия в том, чтобы просто покупать все и не использовать мусор (и не красть автомобильные игрушки). Я тоже считаю, что моя идея немного дешевле.

1 ответ

Вы бы использовали таймер.

   import threading
   
   def hello():
   print "hello, world"
   
   t = Timer(30.0, hello)
   t.start()  # after 30 seconds, "hello, world" will be printed

из https://docs.python.org/3.8/library/threading.html

Код аналогичен при переходе к плагину OctoPrint.

   def hello():
       print("Hello World!")
   
   t = RepeatedTimer(1.0, hello)
   t.start() # prints "Hello World!" every second

из https://docs.octoprint.org/en/master/modules/util.html?highlight=repeatedtimer

Другие вопросы по тегам