树莓派3搭配PIR传感器写入新Unix时间戳问题求助
问题分析与解决
你遇到的时间戳重复问题,根源其实很直观:你把获取时间戳的代码Variable = int(time.time())放在了程序初始化阶段,只执行了一次!所以不管PIR传感器检测到多少次运动,写入文件的都是程序启动时的那个固定时间戳,自然所有记录都一模一样啦。
修正后的代码
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO_PIR = 11 print "PIR Module Test (CTRL-C to exit)" GPIO.setup(GPIO_PIR,GPIO.IN) Current_State = 0 Previous_State = 0 try: print "Waiting for PIR to settle ..." while GPIO.input(GPIO_PIR)==1: Current_State = 0 print " Ready" while True : Current_State = GPIO.input(GPIO_PIR) if Current_State==1 and Previous_State==0: print "Motion detected" Previous_State=1 # 每次检测到运动时才实时获取当前时间戳 current_timestamp = int(time.time()) # 用with语句自动管理文件,避免手动关闭可能出现的异常 with open("textFile.txt", 'a+') as file: file.write(str(current_timestamp) + "\n") elif Current_State==0 and Previous_State==1: print " Ready" Previous_State=0 time.sleep(0.01) except KeyboardInterrupt: print " Quit" GPIO.cleanup() # 退出时清理GPIO资源,避免后续使用异常
关键修改说明
- 将时间戳的获取逻辑移到运动检测的分支内部,确保每次触发运动时,都会重新抓取当前的Unix时间戳,而不是用程序启动时的固定值。
- 改用
with语句操作文件,它会在代码块执行完毕后自动关闭文件,比手动调用file.close()更可靠,能避免因程序意外中断导致的文件未关闭问题。 - 添加了
GPIO.cleanup(),这是树莓派GPIO编程的好习惯,按下Ctrl+C退出时会清理GPIO资源,防止后续使用GPIO引脚时出现异常。
另外提一句:你的代码是Python 2的语法(比如print没有括号),如果后续切换到Python 3,记得把print语句改成print()函数形式哦。
内容的提问来源于stack exchange,提问作者joshphill
相关产品推荐
相关产品推荐

