RPi.GPIO прерывание не вызывает функцию достаточно долго - PullRequest
0 голосов
/ 08 ноября 2018

Итак, я пытаюсь создать ЖК-экран, чтобы иметь меню и набор различных функций, и он должен занимать 4 кнопки. Выбор, меню и вверх и вниз. Сейчас я просто пытаюсь поработать над кнопкой Меню. Я хочу, чтобы он всегда отображал часы, если не нажата кнопка меню. Но когда я нажимаю кнопку, она не остается на экране в течение 5 секунд, как это должно быть. Я понятия не имею, почему это не будет также. Я посмотрел на прерывание RPi и последовал за ним, но он все равно не заснул. «Привет» появляется даже на полсекунды. Я также использую ЖК-библиотеку Raspberry Pi Spy's, которую я могу связать, если необходимо Единственное, что я сделал, это изменил некоторые временные параметры, чтобы они соответствовали моим дисплеям, и добавил возможность добавлять текст в любую из четырех строк сразу, видя, что у меня есть дисплей 20х4. Если бы кто-то мог мне помочь, это было бы очень признательно.

Вот код:

#!usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
sys.path.append('/home/pi/Downloads')
import lcd

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
#GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)


lcd.lcd_init()

def start():
    for x in range(0,8):
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}>----TestOS----<{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}<>---TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-<>--TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}--<>-TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}---<>TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}----<TestOS>----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS<>---{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS-<>--{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS--<>-{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS---<>{]", 1)
        time.sleep(0.1)


    lcd.lcd_init()

    for x in range(0,120):
        lcd.lcd_byte(0xFF,True)

    time.sleep(5)
    lcd.lcd_init()


def Menu():
    lcd.lcd_init()
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    time.sleep(5)

def clock():
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I:%M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I %M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)

GPIO.add_event_detect(11, GPIO.FALLING, callback=Menu, bouncetime=100)

start()
try:
    while True:
        clock()

finally:
    lcd.lcd_init()
    lcd.GPIO.cleanup()
    GPIO.cleanup()

PS: lcd.lcd_init удваивается, чтобы очистить экран, поэтому я так его называю.

1 Ответ

0 голосов
/ 09 ноября 2018

Ваш метод clock (), работающий в бесконечном цикле, всегда переопределяет текст на дисплее со временем.

Вы должны остановить метод clock () при запуске функции Menu ().

Я добавил глобальную переменную в меню:

#!usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
sys.path.append('/home/pi/Downloads')
import lcd

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
#GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)

menupressed = False

lcd.lcd_init()

def start():
    for x in range(0,8):
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}>----TestOS----<{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}<>---TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-<>--TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}--<>-TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}---<>TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}----<TestOS>----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS<>---{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS-<>--{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS--<>-{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS---<>{]", 1)
        time.sleep(0.1)


    lcd.lcd_init()

    for x in range(0,120):
        lcd.lcd_byte(0xFF,True)

    time.sleep(5)
    lcd.lcd_init()


def Menu():
    global menupressed
    menupressed = True
    lcd.lcd_init()
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    time.sleep(5)
    menupressed = False

def clock():
    if(menupressed):
         return #when menu button is pressed, return - dont show nothing on display
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I:%M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I %M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)

GPIO.add_event_detect(11, GPIO.FALLING, callback=Menu, bouncetime=100)

start()
try:
    while True:
        clock()

finally:
    lcd.lcd_init()
    lcd.GPIO.cleanup()
    GPIO.cleanup()

Надеюсь, это было полезно

...