如何让 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)
我的传感器在 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)