Скорость чтения с 2 фотоэлектрическими датчиками с Arduino и отображение скорости после чтения

У меня есть 2 фотоэлектрических датчика с выходом NPN: Глядя на лист данных, он может быть НИЗКИЙ (стр. 14 Выход NPN): https://mouser.com/datasheet/2/307/e3fb_photoelectric-1189416.pdf стр. 14.

Два датчика расположены на расстоянии 152,4 мм друг от друга. В основном я хочу запустить таймер, когда срабатывают первые ворота, и закончить, когда срабатывают вторые ворота, а затем разделить заданное расстояние (152,4 мм) на время, которое нужно пройти между каждым воротом, и вывести скорость в секундах в метрах. Датчики питаются от источника питания 24 В постоянного тока, выходное напряжение NPN может достигать 3 В постоянного тока от коллектора. Сначала я протестировал датчик, чтобы включить мигание встроенного светодиода, когда объект находится перед датчиком, и смог запустить светодиод:

    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. Я несколько раз корректировал уравнение, но, похоже, не получил ничего, что имеет смысл. Любая помощь приветствуется. Спасибо!


person MDbow    schedule 16.03.2020    source источник


Ответы (1)


Логика кода не кажется правильной. Из вашего объяснения, если вы уверены, что состояние срабатывания ВЫСОКОЕ, мой код будет таким.

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);
}
person M lab    schedule 02.05.2020
comment
Я попробую это, когда вернусь, посмотрю, работает ли он, и дам вам знать, спасибо M lab - person MDbow; 04.05.2020
comment
Теперь кажется, что идет обратный отсчет, вывод последовательного монитора просто печатает скорость, уменьшающуюся каждый раз, независимо от того, срабатывают ли ворота. - person MDbow; 05.05.2020
comment
Что у вас на выходе датчика при срабатывании? - person M lab; 05.05.2020
comment
Какое выходное напряжение? это то, что вы имели ввиду? - person MDbow; 05.05.2020
comment
Я имею в виду логический выход, когда датчик обнаруживает объект, он будет высоким или низким? - person M lab; 05.05.2020
comment
Глядя на таблицу данных, на самом деле это может быть НИЗКИЙ (стр. 14 Выход NPN): mouser.com/datasheet/2/307/e3fb_photoelectric-1189416.pdf - person MDbow; 08.05.2020
comment
пожалуйста, добавьте эту информацию в свой вопрос - person M lab; 08.05.2020
comment
Спасибо, похоже, работает намного лучше, скорость кажется немного высокой, поэтому я собираюсь еще раз взглянуть на свою настройку, еще раз спасибо! - person MDbow; 09.05.2020
comment
Посмотрел мою настройку и забыл, что я меняю расстояние между датчиками, теперь это работает! - person MDbow; 10.05.2020
comment
О, поздравляю! - person M lab; 10.05.2020