Использование `gpiozero` на` raspberry pi` для управления выводами, но выходные выводы сбрасываются при выходе из скрипта, даже если состояние запоминается между запусками - PullRequest
0 голосов
/ 04 декабря 2018

Я использую gpiozero для управления устройствами на Raspberry Pi.Когда я создаю ссылку на (например) светодиодное устройство, есть параметр для создания объекта без изменения его текущего состояния: initial_state=None.(По умолчанию initial_state=False, что автоматически отключает значение при создании эталонного объекта). Проблема в том, что всегда кажется, что при выходе из скрипта аппаратный вывод сбрасывается (хотя, как ни странно, это не является внутренним «состоянием»).Что еще хуже, когда я снова запускаю скрипт, он знает состояние, в котором я его оставил, и возвращает физический вывод в это состояние!

Вот моя программа включения / выключения перемычек, теперь у нее есть пауза,в течение которого состояние остается неизменным, но при выходе из программы контакты сбрасываются.(Хотя, как я упоминал выше, состояние «запоминается»)

#!/usr/bin/env python
from __future__ import print_function
import sys
import time
from gpiozero import LED
jump1=LED(17,initial_value=None)
jump2=LED(27,initial_value=None)


if len(sys.argv)>1:
    print ("Jumper were: (%s,%s)"%(str(jump1.is_active),str(jump2.is_active)))
    if sys.argv[1].lower() == 'on':
        jump1.on()
        jump2.on()
        print ('turned both on')
    elif sys.argv[1].lower() == 'off':
        jump1.off()
        jump2.off()
        print ('turned both off')

print ("Jumper Currently: (%s,%s)"%(str(jump1.is_active),str(jump2.is_active)))

raw_input("Press enter to exit.")

Кто-нибудь знает способ сказать gpiozero, что аппаратное средство остается после выхода один? Этот вопрос подробно описывает похожую проблему, хотя и с другим модулем.

(Правка: оказывается, модуль gpiozero меняет направление вывода на вход, но не меняет выходную защелку, котораякак он возвращает старое состояние, когда направление вывода меняется на выход.)

1 Ответ

0 голосов
/ 05 декабря 2018

Я переписал, используя модуль RPi.GPIO вместо gpiozero.Это выглядит по-другому, но это было проще, чем поиск способа выполнить выход без очистки с помощью gpiozero.

Вот «эквивалентная» программа без очистки с помощью булавки.

#!/usr/bin/env python
from __future__ import print_function
import sys
import time
import RPi.GPIO as GPIO

# these pin numbers map have to change
# try the 'pinout' command from the bash prompt

pina = 17
pinb = 27


# set pins up:

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(pina, GPIO.OUT)
GPIO.setup(pinb, GPIO.OUT)


if len(sys.argv)>1:
    print ("Jumpers were: (%s,%s)"%  (str(GPIO.input(pina)),str(GPIO.input(pinb))))
    if sys.argv[1].lower() == 'on':
        GPIO.output(pina, GPIO.HIGH)
        GPIO.output(pinb, GPIO.HIGH)
        print ('turned both on')
    elif sys.argv[1].lower() == 'off':
        GPIO.output(pina, GPIO.LOW)
        GPIO.output(pinb, GPIO.LOW)
        print ('turned both off')

print ("Jumpers now: (%s,%s)"%    (str(GPIO.input(pina)),str(GPIO.input(pinb))))

#raw_input("Press enter to exit.")  # optional pause for testing

# Note:  I/O pins will remain at their last state.
...