Цифровой вход PyFirmata получает None, работая хорошо на отладке

Я изучаю протокол pyFirmata с некоторыми примерами. В качестве упражнения я делаю систему датчиков PIR. Когда я запускаю код, pyFirmata всегда выводит значение None. Однако, если я делаю отладку в PyCharm, все работает так, как должно быть. На Arduino загружается эскиз StandardFirmata. Кто-нибудь знает, что является причиной этого поведения?

Код:

import pyfirmata
from time import sleep

def blinkled(pin, message):
    print(message)
    board.digital[pin].write(1)
    sleep(1)
    board.digital[pin].write(0)
    sleep(1)


port = '/dev/cu.usbmodem1411'
board = pyfirmata.Arduino(port)

it = pyfirmata.util.Iterator(board)
it.start()

pirPin = board.get_pin('d:7:i')
redPin = 12
greenPin = 13

while True:
    value = pirPin.read()
    while value is None:
        print("None")
        sleep(1)
        pass

    if value is True:
        blinkled(redPin, "Motion Detected.")

    else:
        blinkled(greenPin, "No Motion Detected.")

board.exit()

2 ответа

Хорошо, мы обнаружили, что выражение while должно быть заменено на if. Тогда все работает. Не понимаю это поведение.

  1. Почему программа застряла с "while" при получении None?
  2. Почему в режиме отладки все нормально?

Я буду признателен, если кто-нибудь может объяснить.

Код решил эту проблему:

if value is None:
    print("None")

В дополнение к переключению на предложение if, как указал OP, следует использовать оператор continue для продолжения в верхней части цикла :

      if value is None:
    print("None")
    continue

Это приведет к тому, что логика кода не будет проходить через дополнительные предложения после того, как она не пройдет первоначальный тест «Нет значения».

Другие вопросы по тегам