выполнение бесконечного цикла в ожидании ввода

У меня есть небольшой проект, над которым я работаю, он довольно простой, поэтому я надеюсь, что кто-нибудь сможет мне помочь.

Я использую raspberry pi, чтобы затемнить один светодиод с очень грубой ШИМ.

мой код ШИМ выглядит так:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.OUT)
frequency = 0.005
dwell = 0.0001
while True:
    time.sleep(frequency)
    GPIO.output(7, 1)
    time.sleep(dwell)
    GPIO.output(7, 0)

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

То, что я хотел бы сделать, это использовать что-то вроде

dwell=raw_input('brightness:')

так что, пока код PWM зацикливается, я могу ввести новое значение для задержки, чтобы отрегулировать яркость светодиода.

все мои усилия до сих пор приводят к одному из следующего:

a: цикл диммирования выполняется только один раз и останавливается в ожидании ввода b: цикл диммирования будет выполняться бесконечно, но дальнейший ввод невозможен

Может ли кто-нибудь из вас, замечательные люди, предоставить мне пример кода, который объясняет, как я могу этого добиться?

для тех, кто заинтересован, в конечном счете, что я хотел бы сделать, это установить значение задержки через сокеты и использовать лучшую форму выхода ШИМ для управления светодиодными светильниками. Шаги малыша :)


person Byron Hill    schedule 01.03.2015    source источник
comment
Вы хотите повторять до тех пор, пока ввод не будет иметь определенное значение?   -  person levi    schedule 01.03.2015
comment
я просто хочу, чтобы это продолжалось вечно, используя значение задержки. пользователь должен иметь возможность регулировать значение задержки в любое время, цикл должен просто продолжать работать и просто проверять значение задержки при каждом повторении.   -  person Byron Hill    schedule 01.03.2015


Ответы (1)


Похоже, вам нужна многопоточность!

# import the module
import threading

# define a function to be called in the other thread
def get_input():
    while True:
        dwell=raw_input()

# create a Thread object
input_thread=threading.Thread(target=get_input)

# start the thread
input_thread.start()

# now enter the infinite loop
while True:
    time.sleep(frequency)
    GPIO.output(7, 1)
    time.sleep(dwell)
    GPIO.output(7, 0)

Возможно, что-то связано с блокировками или семафоры или mutex...es (mutices?) здесь отсутствует, но я мало о них знаю. Такие простые вещи, кажется, работают для меня.

person KSFT    schedule 01.03.2015
comment
Боюсь, ваш пример у меня не сработал; он запросил ввод, установил яркость, но не разрешил дальнейший ввод - person Byron Hill; 01.03.2015
comment
Я уверен, что это опубликует в беспорядке, я не знаю, как отформатировать ответ - возможно, кто-то может помочь..... import threading import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO .setup(7, GPIO.OUT) частота = 0,005 задержки = 0,01 def get_input(dwell): delay=raw_input(Brightness: ) input_thread=threading.Thread(target=get_input(dwell)) input_thread.start() while True: time .sleep(частота) GPIO.output(7, 1) time.sleep(dwell) GPIO.output(7, 0) - person Byron Hill; 01.03.2015
comment
@ByronHill Вы можете легко изменить get_input(), чтобы продолжать запрашивать ввод. Я отредактирую свой пост. Кстати, вы можете заключать текст в обратные кавычки (`), чтобы отформатировать его как код в комментариях (или в вопросах/ответах). - person KSFT; 01.03.2015
comment
это тоже не работает, кажется, что цикл while в get_input() не позволяет вещам перейти к вызову потоков. Если я удалю время, я могу установить яркость (один раз), когда оно запрашивает ввод и продолжает запрашивать ввод, однако светодиод не загорается, предполагая, что поток не запускается. Я ценю ваше терпение :) - person Byron Hill; 01.03.2015
comment
@ByronHill У меня это работает. Попробуйте добавить оператор печати непосредственно перед созданием объекта потока, чтобы увидеть, дойдет ли он до этой точки. - person KSFT; 01.03.2015
comment
import threading import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(7, GPIO.OUT) frequency = 0.05 dwell = 0.01 def get_input(): while True: dwell=raw_input("Brightness: ") input_thread=threading.Thread(target=get_input()) input_thread.start() while True: time.sleep(frequency) GPIO.output(7, 1) time.sleep(dwell) GPIO.output(7, 0) Я пытался :( ` - person Byron Hill; 01.03.2015
comment
сделано, не печатается. мы застряли в то время как в get_input - person Byron Hill; 01.03.2015
comment
@ByronHill Это не имеет смысла. get_input() не вызывается до тех пор, пока не будет запущен второй поток, и никогда не вызывается в первом потоке. Вы, вероятно, ошиблись в чем-то перед моим кодом. Если вы мне не верите, переместите оператор печати до определения get_input(). - person KSFT; 01.03.2015
comment
Если бы я мог понять это проклятое форматирование, я мог бы точно показать вам свой код :( - person Byron Hill; 01.03.2015
comment
Переместите оператор печати перед определением get_input(). - person KSFT; 01.03.2015
comment
сделал это, он печатает. я также засунул его в цикл while в потоке (предположительно, это заполнило бы буфер моей печатью), это не .... - person Byron Hill; 01.03.2015
comment
Я могу публиковать сообщения только раз в 90 минут. это становится крайне неприятно :( - person Byron Hill; 01.03.2015