Время между двумя датчиками ИК-луча
Я работаю с двумя наборами ИК-лучей, их нужно разместить на расстоянии X. Моя цель — измерить скорость. Я хотел бы измерить время между первым ИК-лучом и вторым лучом, когда луч сломается.
Я не уверен, что происходит, у меня нет времени на последовательный порт, но светодиоды включаются и гаснут так, как я хотел.
Помогите мне узнать время между двумя датчиками ИК-луча.
Это датчик, который я использую — ИК-датчики прерывания Adafruit и я работаю с Mega2560.
#define LEDPIN 13
int startPin = 8, finishPin = 5;
unsigned long starttime = 0, finishtime, time_interval;
float distance = 1, Speed; // Рассчитанная скорость
int trigger1 = 0; // Датчик 1
int trigger2 = 0; // Датчик 2
int sensor1State; // Статус датчика 1
int sensor2State; // Статус датчика 2
void setup() {
pinMode(startPin, INPUT_PULLUP); // Датчик 1 как вход
digitalWrite(startPin, HIGH); // Включаем подтягивание
pinMode(finishPin, INPUT_PULLUP); // Вход датчика 2s
//digitalWrite(finishPin, HIGH); // Включаем подтягивание
pinMode(LEDPIN, OUTPUT);
time_interval = ((finishtime - starttime) / 1000000);
Serial.println(time_interval);
}
void loop() {
sensor1State = digitalRead(startPin); // Читаем состояние ИК-датчика 1:
if (sensor1State == LOW) // Проверяем, не сломан ли ИК-луч датчика 1
{
if (trigger1 == 0 && trigger2 == 0) // Проверяем, не сработали ли оба датчика
{
starttime = micros(); // Экономия времени при срабатывании датчика 1
digitalWrite(LEDPIN, HIGH);
trigger1 = 1; // Предотвращаем повторное срабатывание датчика 1
}
}
if (trigger1 == 1) {
sensor2State = digitalRead(finishPin); // Проверяем, не сломан ли ИК-луч датчика 2
if (sensor2State == LOW) {
// Проверяем, что сработал датчик 1, а не датчик 2
if (trigger2 == 0) {
// Функция скорости работы
trigger2 = 1;
finishtime = micros(); // Экономия времени при срабатывании датчика 2
digitalWrite(LEDPIN, LOW);
// время, необходимое для прохождения между двумя ИК-лучами // делим на 1000000, чтобы преобразовать микросекунды в секунды
Serial.println(time_interval);
}
// Сбрасываем оба датчика
trigger1 = 0;
trigger2 = 0;
}
}
}
@Ish, 👍0
Обсуждение2 ответа
Вы никогда не рассчитываете временной_интервал, который печатаете. Добавьте это после линии времени окончания
if (trigger2 == 0) {
// Функция скорости работы
trigger2 = 1;
finishtime = micros(); // Экономия времени при срабатывании датчика 2
digitalWrite(LEDPIN, LOW);
// время, необходимое для прохождения между двумя ИК-лучами // делим на 1000000, чтобы преобразовать микросекунды в секунды
Serial.println(time_interval);
}
Спасибо за ответ, у меня раньше так было, до сих пор не работает, у меня нет времени, не понимаю, что происходит ??, @Ish
недействительный цикл() { Sensor1State = digitalRead (startPin); // Читаем состояние ИК-датчика 1: if (sensor1State == LOW) // Проверяем, не сломан ли ИК-луч датчика 1 { if (trigger1 == 0 && Trigger2 == 0) // Проверяем, не сработали ли оба датчика { время начала = микрос (); // Экономия времени при срабатывании датчика 1 Serial.println(время начала); digitalWrite(LEDPIN, ВЫСОКИЙ); триггер1 = 1; // Предотвращаем повторное срабатывание датчика 1 } } если (триггер1 == 1) { Sensor2State = digitalRead(finishPin); // Проверяем, не сломался ли ИК-луч датчика 2, @Ish
} если (триггер1 == 1) { Sensor2State = digitalRead(finishPin); если (sensor2State == НИЗКИЙ) { если (триггер2 == 0) { триггер2 = 1; время окончания = микрос (); // Экономия времени при срабатывании датчика 2 Serial.println(время окончания); digitalWrite(LEDPIN, LOW); time_interval = ((время окончания - время начала) / 1000000); Serial.println(интервал_времени); }, @Ish
мой провод в порядке, я жестко подключаю провод, grd и 5 В. Мой первый код, который я написал, работает с ним, когда я добавил условие, он больше не работает - я не добавлял никакого резистора, как вы думаете, в этом причина того, что это не так работающий,, @Ish
пожалуйста, не помещайте код в комментарии... никто это не прочитает... добавьте код к своему вопросу (убедитесь, что отступ от него составляет не менее 4 пробелов, чтобы он отображался как «код»), @jsotola
Вы пытались напечатать интервал в нижней части функции setup(), используя FinishTime, еще до того, как вы его использовали. К счастью, перед запуском программы время завершения будет инициализировано равным нулю, поэтому арифметический результат будет нулевым, хотя и бессмысленным.
В цикле() вы никогда не завершали вычисление интервала перед попыткой его распечатать.
Если вообще ничего не печатается, проверьте проводку и убедитесь, что ваш код получает триггеры. Вы не показали свою проводку, поэтому мы не можем помочь вам отладить ее, если с ней тоже возникнут проблемы.
- Почему Arduino сбрасывается во время управления двигателями?
- Записать массив на SD
- Ошибка компиляции кода (tv-b пропал)
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Использование VS1838B с Arduino
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
Нужно правильно разместить код. Пожалуйста, отредактируйте и добавьте как минимум 4 пробела перед каждой строкой., @CrossRoads
Вы не получите значимого результата с процессором с частотой 16 МГц, где каждый такт занимает 62,5 наносекунды, а скорость света практически мгновенна на коротких расстояниях. time_interval, вероятно, также должен быть плавающим., @CrossRoads
@CrossRoads, причем тут скорость света?, @Juraj
Да, неважно. Я думаю, что вы близки к запуску и фиксации логики состояния, просто мне кажется, нужно немного больше подумать. Например, здесь вы никогда не вычисляете интервал, который вы печатаете, if (trigger2 == 0) { // Функция скорости работы триггер2 = 1; время окончания = микрос(); // Экономия времени при срабатывании датчика 2 digitalWrite(LEDPIN, LOW); // время, необходимое для прохождения между двумя ИК-лучами // делим на 1000000, чтобы преобразовать микросекунды в секунды Serial.println(интервал_времени); }, @CrossRoads