Проект ультразвукового датчика Arduino

Я новичок в Arduino, и я пытаюсь сделать проект с ультразвуковым датчиком, я использую grove ultrasonic ranger, а не HC-SR04, и я уже сделал тест с расстоянием, и он работал очень хорошо, но теперь мне нужна помощь с кодом.

Мне нужно создать вектор, сохранить значения расстояния до после вычисления скорости через расстояние и время расчета, но в случае моего проекта его использовать в открытых местах, поэтому, будут времена, когда расстояние станет "максимум", потому что никто не в серии, поэтому мне нужно условие, чтобы исключить эти значения из массива (максимальное расстояние печатных когда датчик не чувствую ничего 516 см)
У меня нет опыта кодирования Arduino, поэтому, пожалуйста, помогите мне, в anex есть мой код для базового сканирования.

#include "Ultrasonic.h"

Ultrasonic ultrasonic(7);
void setup()
{
    Serial.begin(9600);
}
void loop()
{
    long RangeInCentimeters;
    Serial.println("The distance to obstacles in front is: ");

    // two measurements should keep an interval
    RangeInCentimeters = ultrasonic.MeasureInCentimeters();
    if(RangeInCentimeters > 400)
    Serial.print ("distancia nula");
    else
    Serial.print(RangeInCentimeters);//0~400cm
    Serial.println(" cm");
    delay(1000);
}

, 👍1

Обсуждение

вопрос в том, как это сделать, создать вектор, который сохранит расстояния выше 400 см и исключит остальные, @rokazz

Вам нужно расстояние **до** 400 см и игнорировать все остальное, или **более** 400 см и игнорировать все значения ниже 400 см?, @Tom


1 ответ


1

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

Если вы знаете, сколько точек данных будет записано, будет достаточно базового массива.

Что касается исключения недопустимых значений:

// Продолжаем пытаться получить действительную точку данных 
While (RangeInCentimeters > 512 && RangeInCentimeters < 400)
{
 delay(200);  // Минимальное значение этой задержки зависит от частоты дискретизации вашего датчика
 RangeInCentimeters = ultrasonic.MeasureInCentimeters();
}

//... Хранить данные в массиве/связанном списке/и т.д.

Я изменил ваш максимальный диапазон на 512, потому что это, скорее всего, максимальное реальное значение (2^9 = 512).

,

пока?......., @Juraj

почему бы не позволить циклу() замкнуться?, @Juraj

это для спортсменов по легкой атлетике, поэтому я сделал расчет, и он будет печатать около 10 ходов на каждом круге, я думаю о проблеме с памятью, на каждом круге массив размещает значения, вычисляет скорость и вставляет другой массив, затем сбрасывает массив, поэтому с 2 массивами, 1 для скорости и 1 для данных, сброс массива данных не решит проблему с памятью?, @rokazz

Наличие цикла while позволит вам уменьшить значение задержки внутри и получить следующее действительное измерение как можно скорее, вместо того, чтобы ждать полных 1000 мс. Кроме того, что в этом нет необходимости., @Rekamanon

@rokazz Только для 10 точек данных просто используйте массив. Однако я бы предложил изменить значение задержки, потому что за 10 секунд (время, необходимое для выполнения 10 измерений) бегун пройдет намного дальше, чем 512 см, @Rekamanon

да, время задержки будет 100 или 200, это зависит от точности результатов, @rokazz

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

@rokazz Это тоже сработало бы, но если им удастся пройти через диапазон обнаружения датчика менее чем за 100/200 мс, он их не обнаружит. Посмотрите на таблицу данных и определите частоту дискретизации, чтобы выяснить, насколько низкое значение задержки вы можете получить. Чем ниже он, тем меньше вероятность, что вы их пропустите., @Rekamanon