Скрипт Raspberry Pi python не выключает светодиод

(первый пост) Я только что настроил raspberry pi 3 с просмотром монитора на своем ноутбуке через соединение Wi-Fi.

Я установил два светодиодных индикатора и один кнопочный переключатель на макетной плате.

Я могу включить мигающие огни, но не могу выключить последовательность той же кнопкой.

У меня такое чувство, что я неправильно заканчиваю цикл while. Все еще учусь, поэтому любая помощь будет принята с благодарностью.

Вот мой код:

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT, initial=0) # Blue LED
GPIO.setup(17, GPIO.OUT, initial=0) # Orange LED
GPIO.setup(7, GPIO.IN) # Button switch

onoff = 0

try:
    while onoff ==1:
        if onoff==1:
            GPIO.output(25, 1)
            GPIO.output(17, 0)
            time.sleep(0.2)
            GPIO.output(25, 0)
            GPIO.output(17, 1)
            time.sleep(0.2)
        if GPIO.input(7)==1:
            if onoff==0:
                onoff = 1
            else:
                onoff = 0

except KeyboardInterrupt:
    GPIO.cleanup()

person VRninja    schedule 11.01.2017    source источник
comment
Вы устанавливаете onoff на 0, а затем проверяете onoff на 1 для цикла while. Он никогда не войдет в это   -  person Avantol13    schedule 11.01.2017


Ответы (2)


Возможно, вы захотите использовать событие, как показано здесь или здесь .

По сути, событие — это то, что прерывает нормальную работу. В этом случае я предполагаю, что ваш код переменной onoff предназначен для действия в качестве переключателя «вкл-выкл», чтобы определить, выполнять ли эту часть кода с выводами.

Решением будет бесконечный цикл по коду, который вы хотите выполнить, но выполнять его только в том случае, если onoff равно 1 (True). Каждый раз, когда нажимается кнопка в 7, ваш код будет «прерван» и будет вызываться другая функция, переключающая onoff в противоположное состояние. Тогда ваш код может выглядеть примерно так:

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT, initial=0) # Blue LED
GPIO.setup(17, GPIO.OUT, initial=0) # Orange LED
GPIO.setup(7, GPIO.IN) # Button switch

onoff = 0

def on_off_switch(channel):
    # Flip between 0 (False) and 1 (True)
    onoff = not onoff

# This "event" calls on_off_switch whenever it detects a rising edge on 7
GPIO.add_event_detect(7, GPIO.RISING, callback=on_off_switch)

try:
    # Infinite loop
    while True:
        # Only do stuff if onoff is 1 (True)
        if (onoff):
            GPIO.output(25, 1)
            GPIO.output(17, 0)
            time.sleep(0.2)
            GPIO.output(25, 0)
            GPIO.output(17, 1)
            time.sleep(0.2)

except KeyboardInterrupt:
    GPIO.cleanup()
person Avantol13    schedule 11.01.2017

Ваш цикл while работает только тогда, когда onoff == 1. Когда вы нажимаете кнопку в первый раз, она устанавливается на 0, поэтому цикл завершается, и дальнейшие проверки ввода кнопки не выполняются. Вы хотите, чтобы ваш цикл был бесконечным (т.е. while True: ) и, следовательно, прерывался только с помощью KeyBoardInterrupt.

person jez    schedule 11.01.2017
comment
Я хотел бы, чтобы кнопка выключала светодиоды, а также клавиатуру. - person VRninja; 11.01.2017