如何让Raspberry Pi 4B读取TSL237 LF传感器并统计10秒上升沿脉冲
TSL237传感器树莓派4B移植实现方案
现有代码问题分析
- 中断回调逻辑错误:你直接把计数函数传给了上升沿中断触发,相当于每次传感器跳变就执行一次完整计数流程,和Arduino里中断仅负责累加脉冲的逻辑完全不符
- 计数逻辑错误:原代码的10次while循环是瞬间执行完成,没有实现固定10秒的计时窗口
- 变量作用域错误:计数变量未加
self.前缀,访问的是局部变量,计数结果完全无效 - 缺少流程控制:没有实现「重置计数→计时10秒→读取计数」的完整测量流程
正确实现代码
import time import RPi.GPIO as GPIO # 引脚定义(使用BCM编号,若接线不同修改此处即可) TSL237_PIN = 16 # GPIO全局初始化 GPIO.setmode(GPIO.BCM) GPIO.setup(TSL237_PIN, GPIO.IN, pull_up_down=GPIO.PUD_OFF) class TSL237Sensor: def __init__(self, pin): self.pin = pin self.pulse_cnt = 0 # 注册上升沿中断,回调函数仅负责脉冲累加,对应Arduino的attachInterrupt配置 GPIO.add_event_detect(self.pin, GPIO.RISING, callback=self.add_pulse) def add_pulse(self, channel): # 中断回调逻辑,对应Arduino的add_pulse函数 self.pulse_cnt += 1 def get_frequency(self): # 对应Arduino的Frequency函数,固定10秒计数窗口 self.pulse_cnt = 0 # 等待10秒,期间中断自动累加脉冲数 time.sleep(10) return self.pulse_cnt if __name__ == "__main__": try: sensor = TSL237Sensor(TSL237_PIN) while True: pulse_num = sensor.get_frequency() print(f"10秒内累计脉冲数:{pulse_num}") # 对应Arduino loop里的5秒间隔 time.sleep(5) except KeyboardInterrupt: print("手动终止测量") finally: # 退出时清理GPIO配置,避免引脚占用报错 GPIO.cleanup()
使用说明
- 引脚对应:代码默认使用BCM编码的16号引脚,若你接线的物理引脚对应其他BCM编号,修改
TSL237_PIN的数值即可 - 运行权限:树莓派操作GPIO需要root权限,运行代码时需要加
sudo前缀,否则会报错 - 高频适配:如果你的传感器脉冲频率超过10KHz,可替换
RPi.GPIO为pigpio库,中断响应精度更高,计数更准确
内容的提问来源于stack exchange,提问作者Rasqule
相关产品推荐
相关产品推荐

