Проблема с вашим кодом заключается в том, что он изменяет GPIO только при нажатии кнопки. Это потому, что getch()
То, что вы хотите, это
Чтобы получить желаемое поведение, необходимо, чтобы getch()
возвращало значение, даже если ни одна кнопка не нажата. Есть два способа сделать это
- nodelay : это заставляет getch () немедленно возвращаться независимо от того, нажата ли клавиша или нет, если она не нажата, она вернет curses.ERR
- halfdelay : это заставляет getch () ждать до установленного промежутка времени, если в этот период времени не нажимается ни одна клавиша, возвращается curses.ERR
Сходство заключается в том, что оба возвращают curses.ERR , когда ни одна кнопка не нажата, поэтому вам нужно добавить этот регистр в оператор if
#this will shut off the GPIO when nothing is pushed
elif char == curses.ERR:
GPIO.output(7,False)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(15,False)
Но этот код не будет работать, пока вы не выполните настройку. Замените режим cbreak на режим, который мы используем
Метод 1: нодлеев
Преимущество этого метода в том, что он почти мгновенный. Как только вы отпустите кнопку, бот должен остановиться.
Недостаток, это может потреблять много вычислительной мощности. Поскольку он будет выполнять цикл очень быстро, очень быстро устанавливать GPIO, быстро читать ключи и т. Д., Он будет выполнять много циклов, не выполняя при этом большой работы
screen = curses.initscr()
curses.noecho()
curses.nodelay(True)
screen.keypad(True)
Метод 2: полудержка
Преимущество этого метода в том, что он должен снизить нагрузку на процессор по сравнению с методом нодлаев.
Недостатком является задержка после отпускания ключа. Поэтому после того, как вы отпустите клавишу, бот продолжит выполнение предыдущей команды в течение некоторого времени (в моем примере кода 0,7 секунды), прежде чем он остановится
#the delay units are tenths of seconds, or deciseconds
#this is a .7 second delay 7*0.10sec = 0.7 seconds
delay_in_deciseconds = 7
screen = curses.initscr()
curses.noecho()
curses.halfdelay(delay_in_deciseconds)
screen.keypad(True)