带Arduino的2个光电传感器读取速度,读取后显示速度

Reading Speed with 2 Photoelectric sensors with Arduino and show speed after reading

我有 2 个带 NPN 输出的光电传感器:查看数据 sheet 它实际上可能很低(第 14 页 NPN 输出):https://mouser.com/datasheet/2/307/e3fb_photoelectric-1189416.pdf 第 14 页。

2 个传感器相距 152.4 毫米。基本上,我想在第一个门被触发时启动一个计时器,并在第二个门被触发时结束,然后将设定的距离(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);
      }
    }

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

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

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);
}

编辑

如果你的传感器是低电平有效反转所有逻辑。

无效循环(){

  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);
}