0

我正在尝试制作一个灯丝运动传感器并将其与运行在 Raspberry Pi 3 模型 B+ 上的 Octoprint 集成。
我的目标是制造一种设备,当它感应到灯丝在给定时间内没有移动时会暂停打印,比如说 10 秒。
我已经用周围的垃圾和从我兄弟那里偷来的玩具车制作了一个原型,并将其连接到 Raspberry。它使用带有 LM393 和其他内置材料的光耦合器编码器模块。它的数字输出连接到 Raspberry 的 GPIO 引脚。细丝进入橡胶轮之间转动它们,上轮的轴上安装了编码器轮,它改变了传感器的状态。
现在我的问题来了。我对 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 的插件 来处理卡纸指示信号并暂停打印。
我也很乐意为传感器做出更好的设计,并通过 thingiverse 或其他方式分享。

是的,我知道已经存在一种商业化的一体式堵塞传感器,但是仅仅购买所有东西而不使用垃圾(而不是偷汽车玩具)并没有什么乐趣。我也相信我的想法便宜一点。

4

1 回答 1

0

你会使用计时器。

   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#timer-objects

移至 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#octoprint.util.RepeatedTimer

于 2020-08-13T22:10:39.353 回答