我有以下脚本,该脚本在每次按下按钮时都会增加计数器。当计数器达到某个数字(即10)时,我要触发事件。
from RPi import GPIO
from time import sleep
clk = 25
dt = 8
GPIO.setmode(GPIO.BCM)
GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
counter = 0
clkLastState = GPIO.input(clk)
try:
while True:
clkState = GPIO.input(clk)
dtState = GPIO.input(dt)
if clkState != clkLastState:
if dtState != clkState:
counter += 1
else:
counter -= 1
print counter
clkLastState = clkState
sleep(0.01)
finally:
GPIO.cleanup()
就示例脚本而言,最简单的方法就是让它在达到所需数字(即“已达到目标”)时打印出一些东西。
此问题与我的先前帖子-rotary encoder script for raspberry pi using python有关。我认为与其解决这个问题,不如补充或修改该问题,以更好地理解各个组成部分。
非常感谢
答案 0 :(得分:1)
如果要对赋值执行一个(条件)操作,则希望它是一个对象属性,可以劫持该赋值。重载__setattr__
方法或使用property
。例如:
class C:
def __init__(self, trigger, init_val=0):
self._v = init_val
self.trigger = trigger
@property
def v(self):
return self._v
@v.setter
def v(self, value):
if value == self.trigger:
print("Trigger {} hit, perform some action.".format(value))
else:
print("Nothing to do for {}".format(value))
self._v = value
c = C(10)
while c.v < 12: # Go couple turns past the "event" to see its effect
c.v += 1
我怀疑您真正想要的是尽管在这两个问题中都运行了两个循环,以便您可以继续计数开关事件并控制电动机的旋转,直到电动机达到前者的阈值后才停止。还有更多实现此目的的方法,例如,想到线程。在下面的示例中,我让计数器在单独的线程中运行,并让电机循环检查计数器的进度如何:
from threading import Thread
from time import sleep
class Counter(Thread):
def __init__(self, limit):
self.value = 0
self.limit = limit
super().__init__()
def run(self):
while self.value < self.limit:
# We'd be acquiring and accumulating actual values here
sleep(1)
self.value += 1
print("Counter now at {}".format(self.value))
counter = Counter(10)
counter.start()
while counter.value < counter.limit:
print("Spinning motor")
sleep(0.5) # do actual work here
print("Stop motor")
您可以组合两个示例,也可以在其自己的线程中运行/或电动机控制。但是,如果轮询开关和旋转电机都以相同的频率发生,则仅保持计数并将其值与单个循环内的极限值进行比较会容易得多。万一达到极限,如果电动机通过一个动作启动而需要通过另一种动作停止,则只需启动,循环切换开关取回,并在该循环结束后将其停止。