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

如何让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()

使用说明

  1. 引脚对应:代码默认使用BCM编码的16号引脚,若你接线的物理引脚对应其他BCM编号,修改TSL237_PIN的数值即可
  2. 运行权限:树莓派操作GPIO需要root权限,运行代码时需要加sudo前缀,否则会报错
  3. 高频适配:如果你的传感器脉冲频率超过10KHz,可替换RPi.GPIO为pigpio库,中断响应精度更高,计数更准确

内容的提问来源于stack exchange,提问作者Rasqule

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:45:08