变量等于x时触发事件-python

时间:2019-01-01 12:26:26

标签: python python-3.x variables raspberry-pi

我有以下脚本,该脚本在每次按下按钮时都会增加计数器。当计数器达到某个数字(即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有关。我认为与其解决这个问题,不如补充或修改该问题,以更好地理解各个组成部分。

非常感谢

1 个答案:

答案 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")

您可以组合两个示例,也可以在其自己的线程中运行/或电动机控制。但是,如果轮询开关和旋转电机都以相同的频率发生,则仅保持计数并将其值与单个循环内的极限值进行比较会容易得多。万一达到极限,如果电动机通过一个动作启动而需要通过另一种动作停止,则只需启动,循环切换开关取回,并在该循环结束后将其停止。