событие триггера, когда переменная равна x - python - PullRequest
0 голосов
/ 01 января 2019

У меня есть следующий скрипт, который увеличивает счетчик при каждом нажатии кнопки.Когда счетчик достигает определенного числа, т.е. 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()

Для примера сценария может быть проще всего заставить его напечатать что-либо при достижении требуемого числа, т.е. «цель достигнута».

Этот вопрос относится к более раннемумой пост здесь - скрипт роторного кодировщика для Raspberry Pi с использованием Python .Вместо того, чтобы добавить или изменить этот вопрос, я подумал, что лучше разбить проблему для понимания различных компонентов.

Большое спасибо

1 Ответ

0 голосов
/ 02 января 2019

Если вы хотите выполнить (условное) действие при присваивании значению, вы бы хотели, чтобы это был атрибут объекта, для которого вы можете перехватить присвоение.Перегрузите метод __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")

Вы можете объединить оба примера, а также запустить и / или двигательконтролировать в своем собственном потоке.Однако, если переключение опроса и вращающийся двигатель происходят на одной частоте, было бы намного проще просто вести подсчет и сравнивать его значение с пределом в пределах одного цикла.В случае, если двигатель запускается одним действием и его необходимо остановить другим действием, когда предел достигнут, просто запустите, зациклите извлечение переключателя и остановите его, как только этот цикл завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...