树莓派Python推特按钮无响应求助:程序无报错却始终提示未按下按钮
解决按钮触发推文无响应的问题
嘿,作为Python和树莓派的新手,你遇到的这个问题其实很常见——你的程序只检查了一次按钮状态就直接结束了,根本没给你按下按钮的机会!
咱们来拆解一下问题:当你的程序运行到if GPIO.event_detected(7):这一行时,它只会当下检查一次引脚7有没有触发过下降沿事件。这时候你大概率还没来得及按按钮,所以程序直接走进else分支,打印“Not Pushed Button”后就退出了,自然不会响应后续的按钮操作。
下面给你几个可行的修改方案,你可以根据需求选一个:
方案1:用循环持续监听按钮状态
这个方案最简单,让程序一直运行,持续检查按钮是否被按下:
#!/usr/bin/env python import sys from twython import Twython import RPi.GPIO as GPIO import time # 别忘了导入time模块 GPIO.setmode(GPIO.BOARD) # 加上pull_up_down=GPIO.PUD_UP,同时设置消抖时间(比如200ms) GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP) apiKey = 'xxxxxxxxx' apiSecret = 'xxxxxxxxx' accessToken = 'xxxxxxxxxx' accessTokenSecret = 'xxxxxxxxx' api = Twython(apiKey,apiSecret,accessToken,accessTokenSecret) # 添加事件检测时加上消抖参数bouncetime GPIO.add_event_detect(7, GPIO.FALLING, bouncetime=200) tweetStr = "@raspberrytest34 deneme 1-2-3" print("等待按钮按下...") try: while True: if GPIO.event_detected(7): api.update_status(status=tweetStr) print("Tweeted: " + tweetStr) # 加个短延迟,避免重复触发 time.sleep(1) time.sleep(0.1) # 减少CPU占用 except KeyboardInterrupt: GPIO.cleanup() # 退出时清理GPIO资源 print("\n程序已退出")
方案2:用回调函数触发推文
这种方式更优雅,当按钮被按下时自动调用指定函数发推文:
#!/usr/bin/env python import sys from twython import Twython import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP) apiKey = 'xxxxxxxxx' apiSecret = 'xxxxxxxxx' accessToken = 'xxxxxxxxxx' accessTokenSecret = 'xxxxxxxxx' api = Twython(apiKey,apiSecret,accessToken,accessTokenSecret) tweetStr = "@raspberrytest34 deneme 1-2-3" def send_tweet(channel): """按钮按下时触发的回调函数""" api.update_status(status=tweetStr) print("Tweeted: " + tweetStr) # 绑定回调函数,同时设置消抖 GPIO.add_event_detect(7, GPIO.FALLING, callback=send_tweet, bouncetime=200) print("等待按钮按下...(按Ctrl+C退出)") try: while True: pass # 保持程序运行 except KeyboardInterrupt: GPIO.cleanup() print("\n程序已退出")
额外注意点
- 按钮消抖:机械按钮按下时会有信号抖动,所以一定要加上
bouncetime参数(单位毫秒),避免一次按动触发多次推文。 - 上拉电阻:用
pull_up_down=GPIO.PUD_UP可以让按钮在未按下时保持高电平,按下时变为低电平,这样GPIO.FALLING事件才能正确触发。 - 程序退出清理:加上
try-except捕获KeyboardInterrupt,退出时调用GPIO.cleanup(),避免GPIO资源占用。
内容的提问来源于stack exchange,提问作者raspberrytwitter
相关产品推荐
相关产品推荐

