【问题标题】:trigger event when variable equals x - python当变量等于 x 时触发事件 - python
【发布时间】:2019-05-28 10:57:15
【问题描述】:

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

非常感谢

【问题讨论】:

  • 没有内置的方法可以做到这一点 - 最简单的方法是在您修改 counter 时检查新值是否为 10(使用简单的 if)然后触发你的活动。另见,例如:stackoverflow.com/questions/6190468/…
  • 谢谢。我或许应该指出,我在这里找到了这个脚本 - link,虽然它在计数方面有效,但我真的不知道如何修改它以让它做我想做的事。也许我应该在那个网站上发帖,因为它可能更适合像我这样的初学者。
  • raspberrypi.stackexchange.com 也可能有帮助
  • 非常感谢!是的,非常贴切。

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


【解决方案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")

您可以组合这两个示例,也可以在其自己的线程中运行/或电机控制。但是,如果轮询开关和旋转电机都以相同的频率发生,那么保持计数并将其值与单个循环内的限制进行比较会简单得多。如果电机通过一个动作启动并且在达到限制时需要通过另一个动作停止,只需启动,循环检索开关并在该循环完成后停止。

【讨论】:

  • 非常感谢您的详细回复。我确实按照建议通过专门的树莓派堆栈交换论坛找到了我想要实现的解决方案,但帕特里克早些时候。链接在这里 - [链接] (raspberrypi.stackexchange.com/questions/92502/…)。也就是说,我接受了你的回答,因为它的彻底性。作为替代解决方案,我也会牢记这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2017-02-11
  • 2020-05-04
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多