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