Как получить показания на последовательном мониторе каждые 10 секунд?

Я делаю свой последний проект, и здесь я использую код, который я использую. Согласно коду, я получу выход датчика в последовательном мониторе. Но я хочу читать один раз за 10 мс. Поскольку последовательный монитор не может работать с этим разрешением, мне нужно сохранить показания в массиве, а затем вывести массив в последовательный монитор или любым другим способом. Помогите мне в изменении кода.

Код выглядит следующим образом:

 /* 
   The circuit:
  * VCC connection of the sensor attached to +5V
  * GND connection of the sensor attached to ground
  * TRIG connection of the sensor attached to digital pin 2
  * ECHO connection of the sensor attached to digital pin 4
 */

const int trigPin = 2;
const int echoPin = 4;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()
{
  long duration, cm;

  pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);

  cm = microsecondsToCentimeters(duration);

  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(100);
}

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29 / 2;
}
2 голоса | спросил qriousgirl 20 J000000Wednesday16 2016, 13:39:28

2 ответа


2

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

Основная структура вашего кода:

  • Навсегда:
    • Отправить ping
    • Подождите, пока понг
    • Распечатайте результат
    • Задержка на 100 мс (или другое время, которое вы выберете)

И вы ожидаете получить результат каждые (задержка) миллисекунды.

Однако вы не будете. Фактически вы получите результат каждый раз , где это время определяется как 100 мс + время отправки и получения пинга.

Итак, если для получения понга требуется 11,6 мс (200 см, предел большинства контактных датчиков), тогда вы также задерживаетесь на 100 мс, вы получите в итоге 111,6 мс между каждой печатью. Это еще хуже, если понг никогда не возвращается - тогда pulseIn() будет ждать до секунды, прежде чем вернуться. Вы можете, конечно, уменьшить это, чтобы сказать 15 мс, добавив параметр таймаута в соответствии с руководство

Когда вы уменьшаете задержку печати до 10 мс, вы фактически рискуете отсрочить более чем в два раза больше, чем вы ожидаете (21,6 мс вместо 10 мс).

Вместо этого вам нужно использовать millis(), чтобы проверить, чтобы увидеть , если пришло время распечатать что-то , чтобы не важно, как долго должен был прибыть понг, если это не будет превышать время, которое вы хотите получить между отпечатками, иначе оно будет задерживаться независимо.

ответил Majenko 20 J000000Wednesday16 2016, 17:06:37
0

Да, это не должно быть проблемой, помните, что delay(time) - миллисекундовая команда, поэтому, если вы хотите получить чтение каждый 10ms, просто введите delay(10) и не delay(100). Как упоминается выше, вы не должны иметь проблем с каналом последовательного мониторинга скорости 9600 бод, показывающим данные каждые 10 мс.

Кроме того, я бы настоятельно рекомендовал проверить библиотеку NewPing ( https: //bitbucket.org/teckel12/arduino-new-ping/wiki/Home ) которая представляет собой библиотеку обновлений для ультразвукового датчика расстояния, который, как я полагаю, вы используете на основе вашего кода. При этом вы можете отправлять до 30 «пингов» в секунду, поэтому, если вышеупомянутое решение не исправит это для вас, это определенно должно быть.

ответил Jonathan A 20 J000000Wednesday16 2016, 14:19:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132