Использование инфракрасного пульта дистанционного управления на часах для переключения между режимами

#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, который происходит только при использовании пульта дистанционного управления. Вы должны обрабатывать свое собственное обнаружение границ с помощью флагов и обходить код приема, если края нет, но все равно зацикливаетесь.