You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:20