使用Arduino的2个光电传感器读取速度,并在读取后显示速度



我有两个具有NPN输出的光电传感器:从数据表上看,它实际上可能是低的(第14页NPN输出(:https://mouser.com/datasheet/2/307/e3fb_photoelectric-1189416.pdf第14页。

两个传感器相隔152.4 mm放置。基本上,我想在第一个闸门触发时启动计时器,在第二个闸门触发后结束,然后将设定距离(152.4毫米(除以每个闸门之间的行程时间,并以米秒为单位输出速度。传感器由24 VDC电源供电,来自集电极的NPN输出电压可高达3V DC。我首先测试了传感器,以在传感器前面有物体时触发板载LED闪烁,并能够触发LED:

const int sensorPin = 3; // photoelectric sensor
const int ledPin = 13;
boolean state1 = LOW; // state at startup
void setup() {
pinMode(sensorPin, INPUT_PULLUP); // sensor input with internal pullup 
resistor enabled
pinMode(ledPin, OUTPUT); // initialize digital pin 13 as an output.
}
void loop() {
state1 = digitalRead(sensorPin);
if (state1 == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}

所以看起来电压在正确的范围内,可以读取为HIGH或LOW。

所以接下来我试着读速度。代码如下:

const int PE_01 = 2;
const int PE_02 = 3;
unsigned long start, finish, speed;
float elapsed;
boolean state1 = LOW; //state at startup
boolean state2 = LOW; //state at startup
void setup() {
// Initialize the serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(PE_01, INPUT_PULLUP); //sensor input with internal pullup 
resistor enabled
pinMode(PE_02, INPUT_PULLUP); //sensor input with internal pullup 
resistor enabled
}
void loop() {
state1 = digitalRead(PE_01);
state2 = digitalRead(PE_02);
// time = millis ();
if (state1 == HIGH){
start = millis();
}
if (state2 == HIGH) {
finish = millis();
}
elapsed = finish - start;
speed = 76200/elapsed; // unit distance (micro meters) and time (milli 
seconds)
Serial.print("initial time (ms) = ");
Serial.println(start);
Serial.print("final time (ms) = ");
Serial.println(finish);
Serial.print("Speed of object (M/s) = ");
Serial.println(speed);
delay(500);
}

然而,我在串行监视器中看到的是:

10:31:07.632 -> initial time (ms) = 15502
10:31:07.666 -> final time (ms) = 15502
10:31:07.666 -> Speed of object (M/s) = 4294967295
10:31:08.109 -> initial time (ms) = 16002
10:31:08.144 -> final time (ms) = 15502
10:31:08.178 -> Speed of object (M/s) = 0

4294967295在不存在对象时显示,而在存在对象时似乎输出0。我已经调整了这个等式几次了,但我似乎没有得到任何有意义的东西。非常感谢您的帮助。非常感谢。

代码的逻辑似乎不正确。根据你的解释,如果你确定触发状态为HIGH,我的代码将是这样的。

void loop() {
if (digitalRead(PE_01)== HIGH){// Check if first sensor trigged
unsigned long start = millis();
while(digitalRead(PE_02)== LOW);// Wait until second sensor trigged
unsigned long finish = millis();
float speed = 76200.0f/float(finish - start ); 
Serial.print("initial time (ms) = ");
Serial.println(start);
Serial.print("final time (ms) = ");
Serial.println(finish);
Serial.print("Speed of object (M/s) = ");
Serial.println(speed);
delay(500);
}

编辑

如果传感器处于低电平激活状态,则反转所有逻辑。

void loop(({

if (digitalRead(PE_01)== LOW){// Check if first sensor trigged
unsigned long start = millis();
while(digitalRead(PE_02)== HIGH);// Wait until second sensor trigged
unsigned long finish = millis();
float speed = 76200.0f/float(finish - start ); 
Serial.print("initial time (ms) = ");
Serial.println(start);
Serial.print("final time (ms) = ");
Serial.println(finish);
Serial.print("Speed of object (M/s) = ");
Serial.println(speed);
delay(500);
}

最新更新