#python #python-3.x #time #raspberry-pi #infrared
Вопрос:
Я делаю часы и хочу иметь возможность переключаться между часами:минутами и минутами:секундами с помощью инфракрасного пульта дистанционного управления, но всякий раз, когда я использую пульт дистанционного управления, часы перестают работать и обновляют время только при использовании пульта дистанционного управления. Я включил части своего кода ниже, одна часть-это функция приема ИК-сигналов, а другая-повторяющаяся часть.
Функция :
def on_ir_receive(pin_n, bounce_time=150):
t0 = time.time()
data = []
while (time.time() - t0) < (bounce_time/1000.0):
data.append(GPIO.input(pin_n))
if len(data) < bounce_time:
return
rate = len(data) / (bounce_time / 1000.0)
pulses = []
i_break = 0
for i in range(1, len(data)):
if (data[i] != data[i-1]) or (i == len(data)-1):
pulses.append((data[i-1], int((i-i_break)/rate*1e6)))
i_break = i
out_bin = ""
for val, us in pulses:
if val != 1:
continue
if out_bin and us > 2000:
break
elif us < 1000:
out_bin = "0"
elif 1000 < us < 2000:
out_bin = "1"
try:
return int(out_bin, 2)
except ValueError:
return None
Та часть, которая ломается:
while True:
hours = time.strftime("%H", time.localtime())
minutes = time.strftime("%M", time.localtime())
seconds = time.strftime("%S", time.localtime())
if time_mode:
my_tube_1.set_digit(int(list(hours)[0]))
my_tube_2.set_digit(int(list(hours)[1]))
my_tube_3.set_digit(int(list(minutes)[0]))
my_tube_4.set_digit(int(list(minutes)[1]))
if not time_mode:
my_tube_1.set_digit(int(list(minutes)[0]))
my_tube_2.set_digit(int(list(minutes)[1]))
my_tube_3.set_digit(int(list(seconds)[0]))
my_tube_4.set_digit(int(list(seconds)[1]))
GPIO.wait_for_edge(11, GPIO.FALLING)
code = on_ir_receive(11)
if code:
if str(hex(code)) == "0xff6897":
time_mode = True
if str(hex(code)) == "0xffb04f":
time_mode = False
else:
print(str(hex(code)))
time.sleep(0.01)
Комментарии:
1. Ваша программа блокируется при вашем
wait_for_edge
звонке, потому что она ожидает перехода на pin-код 11, который происходит только при использовании пульта дистанционного управления. Вы должны обрабатывать свое собственное обнаружение границ с помощью флагов и обходить код приема, если края нет, но все равно зацикливаетесь.