ЖК-дисплей Пульсирующее сообщение

Я подключил ЖК-дисплей к проекту, над которым работаю. У меня много входов/выходов, и я хочу отображать разные сообщения в зависимости от состояния входов. Теперь, прежде чем я начну усложнять / добавлять больше оборудования. Мне нужна помощь. Когда никакие входы не активны, я хочу, чтобы на ЖК-дисплее отображалось сообщение «Ожидание ввода», а после получения одного ввода я хочу отобразить «Вход один активен». В настоящее время я использую цикл while true, но проблема возникает, когда я очищаю ЖК-дисплей, так как каждый раз, когда он зацикливается, текст на экране пульсирует. Есть ли лучший способ сделать это вне цикла while true?

Вот мой текущий код

import I2C_LCD_driver
import time
import pigpio

mylcd = I2C_LCD_driver.lcd()

Debounce = 0.5

Input23 = 23
Input24 = 24
Input17 = 17
Output18 = 18
Output4 = 4

pi_GPIO = pigpio.pi()
pi_GPIO.set_mode(Input23, pigpio.INPUT)
pi_GPIO.set_pull_up_down(Input23 , pigpio.PUD_UP)
pi_GPIO.set_mode(Input24, pigpio.INPUT)
pi_GPIO.set_pull_up_down(Input24 , pigpio.PUD_UP)
pi_GPIO.set_mode(Input17, pigpio.INPUT)
pi_GPIO.set_pull_up_down(Input17 , pigpio.PUD_UP)
pi_GPIO.set_mode(Output18, pigpio.OUTPUT)
pi_GPIO.set_mode(Output4, pigpio.OUTPUT)

while True:

    if pi_GPIO.read(Input23):
        pi_GPIO.write(18, 0)
        mylcd.lcd_clear()
        mylcd.lcd_display_string("Input 1 Active", 1)
        time.sleep(Debounce)
    else:
        pi_GPIO.read(Input23)
        pi_GPIO.write(18, 1)
        mylcd.lcd_clear()
        mylcd.lcd_display_string("Awaiting Input", 1)
        mylcd.lcd_display_string("Detection", 2)
        time.sleep(Debounce)

person Bradley    schedule 18.11.2018    source источник
comment
Отличный вопрос. вы можете подумать, может ли аудитория на raspberrypi.stackexchange.com располагать дополнительной информацией?   -  person JoSSte    schedule 18.11.2018


Ответы (1)


Когда я делал что-то подобное с Arduino, я использовал флаг. В этом случае мне действительно нужно было иметь эквивалент While True:, потому что это основной процесс платы и должен был выполняться в бесконечном цикле при включенном питании.

Проблема, с которой вы столкнулись (я предполагаю), заключается в том, что каждый раз, когда цикл сталкивается со следующим кодом, вы создаете импульс:

mylcd.lcd_clear()
mylcd.lcd_display_string(...)

Любое простое (хотя и неэлегантное) исправление для этого похоже на (это Python 3, который работает немного иначе для итераций словаря, чем 2.7) this. У меня не было возможности проверить это (поэтому я, вероятно, что-то пропустил/допустил опечатки), но, надеюсь, вы поняли идею:

inputs = {"Input17": False,
          "Input23": False,
          "Input24": False}

while True:

    change_in_input = False

    # check for change in inputs
    for input in inputs:
        if bool(pi_GPIO.read(input)) != bool(inputs[input]):
            change_in_input = True
            # update inputs based on change(s)
            inputs[input] = pi_GPIO.read(input)

    if change_in_input:
        if not any(inputs.values()):
            pi_GPIO.write(18, 1)
            mylcd.lcd_clear()
            mylcd.lcd_display_string("Awaiting Input", 1)
            mylcd.lcd_display_string("Detection", 2)
        elif inputs["Input23"]:
            pi_GPIO.write(18, 0)
            mylcd.lcd_clear()
            mylcd.lcd_display_string("Input 1 Active", 1)

    time.sleep(Debounce)
person NotAnAmbiTurner    schedule 18.11.2018
comment
Когда вход 23 имеет значение False, у меня есть красный светодиод, показывающий, как только он становится истинным, он меняется на зеленый. Спасибо за изменения, но ЖК-дисплей все еще пульсирует из-за того, что mylcd.lcd_clear() находился в цикле while true. - person Bradley; 18.11.2018
comment
Он не должен по-прежнему пульсировать — весь смысл not_awaiting_input_displayed в том, что весь блок кода пропускается, когда на дисплее уже отображается «Ожидание ввода». Можете ли вы связать документы для ЖК-дисплея, который вы используете? Цвет ЖК-дисплея управляется оператором pi_GPIO.write()? - person NotAnAmbiTurner; 18.11.2018
comment
Он пульсирует между «Ожидание ввода» и «Обнаружение»? Возможно ли, чтобы time.sleep выключил ЖК-дисплей на мгновение? - person NotAnAmbiTurner; 18.11.2018
comment
Ожидание входа кажется нормальным, странно, я знаю... Только когда я активирую вход, вход 1 активен, импульсы - person Bradley; 18.11.2018
comment
Та же проблема. Пока Input23 получает ввод, вы будете нажимать clear, а затем redisplay. Существуют общие шаблоны для работы с подобными вещами (arduino.stackexchange.com/questions/532/), но, не зная больше, трудно сказать, какой из них Лучший. Похоже, вам нужна общая функция, чтобы определить, изменились ли входные данные с момента последнего цикла. - person NotAnAmbiTurner; 18.11.2018