Время между двумя датчиками ИК-луча

Я работаю с двумя наборами ИК-лучей, их нужно разместить на расстоянии 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;
    }
  }
}

, 👍0

Обсуждение

Нужно правильно разместить код. Пожалуйста, отредактируйте и добавьте как минимум 4 пробела перед каждой строкой., @CrossRoads

Вы не получите значимого результата с процессором с частотой 16 МГц, где каждый такт занимает 62,5 наносекунды, а скорость света практически мгновенна на коротких расстояниях. time_interval, вероятно, также должен быть плавающим., @CrossRoads

@CrossRoads, причем тут скорость света?, @Juraj

Да, неважно. Я думаю, что вы близки к запуску и фиксации логики состояния, просто мне кажется, нужно немного больше подумать. Например, здесь вы никогда не вычисляете интервал, который вы печатаете, if (trigger2 == 0) { // Функция скорости работы триггер2 = 1; время окончания = микрос(); // Экономия времени при срабатывании датчика 2 digitalWrite(LEDPIN, LOW); // время, необходимое для прохождения между двумя ИК-лучами // делим на 1000000, чтобы преобразовать микросекунды в секунды Serial.println(интервал_времени); }, @CrossRoads


2 ответа


0

Вы никогда не рассчитываете временной_интервал, который печатаете. Добавьте это после линии времени окончания

  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


1

Вы пытались напечатать интервал в нижней части функции setup(), используя FinishTime, еще до того, как вы его использовали. К счастью, перед запуском программы время завершения будет инициализировано равным нулю, поэтому арифметический результат будет нулевым, хотя и бессмысленным.

В цикле() вы никогда не завершали вычисление интервала перед попыткой его распечатать.

Если вообще ничего не печатается, проверьте проводку и убедитесь, что ваш код получает триггеры. Вы не показали свою проводку, поэтому мы не можем помочь вам отладить ее, если с ней тоже возникнут проблемы.

,