如何让 raspberry pi 4b 读取 TSL237 LF 传感器?

How can I get raspberry pi 4b to read a TSL237 LF sensor?

我的传感器在 Arduino UNO 上工作。我在翻译代码时遇到问题。 我可以让 pi 接收来自传感器的输入,但我不确定如何让它在特定时间(10 秒)内读取上升脉冲以提供一定数量的脉冲。

在此代码中,arduino 在 10 秒的延迟期间仍在接收来自传感器的脉冲,但数量会根据通过的光量而变化,这正是我想要的。我想让 pi 做同样的事情。

还请大家谅解,我是新手,如果能详细解释一下,不胜感激。

#define TSL237  2
volatile unsigned long pulse_cnt = 0;


void setup() {
 attachInterrupt(0, add_pulse, RISING);
 pinMode(TSL237, INPUT);
 Serial.begin(9600);
}

void add_pulse(){
  pulse_cnt++;
  return;
}

unsigned long Frequency() { 
    
 pulse_cnt = 0;
 delay(10000);// this delay controlls pulse_cnt read out. longer delay == higher number
   // DO NOT change this delay; it will void calibration.
 unsigned long frequency = pulse_cnt;
 return (frequency);
 pulse_cnt = 0;    
 }
void loop() {
   unsigned long frequency = Frequency();
   Serial.println(frequency);
   delay(5000);
      
}

这是我在 MU 中尝试过的方法,但我没有那么熟练。

import threading
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

TSL237 = 16

GPIO.setup(TSL237, GPIO.IN, pull_up_down=GPIO.PUD_OFF)


class TSL237():
    def __init__(self,TSL237):
        self.TSL237 = TSL237



    def Frequency(self):
        self.pulse = 0
        i=0
        while i < 10:
            i += 1
            if GPIO.input(TSL237):
               pulse += 1

        return self.pulse

Reading = TSL237(TSL237)
GPIO.add_event_detect(TSL237, GPIO.RISING, Reading.Frequency())


#threading.Thread(target=TSL237(Frequency)).start()

您混淆了中断代码和读出代码。 arduino 代码中的 Frequency 方法只是等待一定时间(10 秒)让滴答声增加。但是,滴答的实际增加发生在中断处理程序中 add_pulse

在 python 代码中,Frequency 方法现在是中断处理程序,您也在其中等待某个事件。这不起作用,因为中断处理程序在活动时不会再次触发。

将您的代码更改为类似这样的代码(未经测试,因为我没有这样的传感器)

import threading
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

TSL237Pin = 16

GPIO.setup(TSL237Pin, GPIO.IN, pull_up_down=GPIO.PUD_OFF)


class TSL237():
    def __init__(self, pin):
        self.pin = pin
        self.pulses = 0

    def OnRisingEdge(self):
        self.pulses += 1 # Increase the pulse count and immediately return

    def Frequency(self):
        self.pulses = 0 # Reset pulse count
        time.sleep(10) # wait 10 seconds
        return self.pulses # return new value of pulse count

Reading = TSL237(TSL237Pin)
GPIO.add_event_detect(TSL237Pin, GPIO.RISING, callback=Reading.OnRisingEdge)

result = Reading.Frequency()
print(result)