python - RPi.GPIO 中断调用函数的时间不够长
问题描述
所以我正在尝试设计一个 LCD 屏幕来拥有一个菜单和一堆不同的功能,它应该有 4 个按钮。一个选择、一个菜单和一个向上和向下。现在我只是想在菜单按钮上工作。我希望它始终显示时钟,除非按下菜单按钮。但是当我按下按钮时,它不会在屏幕上停留 5 秒钟。我也不知道为什么它也不会。我已经查看了 RPi 中断并跟踪了它,但它仍然不会留下来。“嗨”出现不到半秒。我还在使用树莓派间谍的 LCD 库,如果需要,我可以链接它。我所做的唯一一件事就是修改一些计时内容以匹配我的显示器,并添加了一次向四行中的任何一行添加文本的功能,因为我有一个 20x4 显示器。
这是代码:
#!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 加倍清除屏幕,这就是我这么称呼它的原因。
解决方案
您的方法 clock() 在无限循环中运行,始终会随时间覆盖显示的文本。
当 Menu() 函数运行时,您必须停止 clock() 方法。
我按下了全局变量菜单:
#!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()
希望对您有所帮助
推荐阅读
- python - HDFStore高效使用指南
- mysql - 创建mysql触发器以在更新行后更新特定列
- windows - Gradle:无法连接到 Windows 上的 Kotlin 守护程序
- wpf - 如何绕圆旋转直线的终点,同时保持起点固定。在 WPF 中
- qt5 - 在某些窗口管理器上关闭 Qt5 应用程序时出现段错误
- c++ - 如何在 gtkmm3 中动态命名小部件变量?
- javascript - 未捕获的类型错误:无法设置未定义的属性“isEditMode”
- java - 我们如何在单行中打印循环输出?
- ios - 如何在不遇到无限循环的情况下调整 NSError 初始化
- android - 使用 volley 和 json 未提供的图像解析 json