Работа с ультразвуковыми датчиками

У меня есть небольшая проблема борьбы с ультразвуковым датчиком Я хочу простую вещь , когда датчик считывает Высокий импульс , а затем после него низкий импульс , включается светодиод , поэтому я пытаюсь сделать это с расстоянием 5 см и флагом, но это доза не работает помогите мне, пожалуйста!

    #define echoPin 5
    #define trigPin 7
    int GREEN = 2;
    int YELLOW = 3;
    int RED = 4;
    int pos = 0;
    int flag = 0 ;
    long duration;
    int distance;
    void setup() {

  // put your setup code here, to run once:
    pinMode(GREEN, OUTPUT);
    pinMode(YELLOW, OUTPUT);
    pinMode(RED, OUTPUT);
    pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
    pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
     }
    
    void loop() {
    
    ultra();
    
    if ( distance <= 5 && flag == 0)
    {//H
      flag = 1 ;}
    } //high pulse (When the distance <=5)
    
    if ( distance >5 && flag == 1)
    {//L
      red_light(); }
    
    }//the led should turned on when low pulse appears (When the distance >5)  
    
    void red_light()
    { digitalWrite(GREEN, LOW);
    digitalWrite(YELLOW, LOW);
    digitalWrite(RED, HIGH); }
    
    void ultra()
    { digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration*0.034/2; }

   
//this is my code

, 👍0

Обсуждение

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

нет , красный светодиод должен загореться , когда( расстояние становится меньше 5 см, а затем после этого становится больше 5 см), я пытаюсь включить светодиод после того, как получаю ( высокий сигнал, а затем НИЗКИЙ)., @Majd Ramadan

и да, я хочу, чтобы он был включен навсегда . теперь ты меня понимаешь ?, @Majd Ramadan

почему у вас есть две закрывающие скобки для первого цикла " if "в функции" void ()"?, @ArduinoFan

Да, теперь это ясно. Не могли бы вы дать подробное описание, что на самом деле происходит (вместо "это не работает) с вашим кодом? Или вы получаете ошибку во время компиляции? Если да, пожалуйста, предоставьте полное сообщение об ошибке. PS: Вы неправильно используете термины ВЫСОКИЙ сигнал и НИЗКИЙ сигнал, что немного сбивает с толку. ВЫСОКИЕ и НИЗКИЕ значения относятся к цифровому сигналу на штыре, а не к измеренной длине импульса. Таким образом, вы хотите вызвать свой код, когда длина импульса обходит отметку на 5 см. Вы не хотите, чтобы вызвать его после низкого сигнала., @chrisl

что на самом деле происходит с этим кодом, когда я кладу что-то рядом с датчиком <= 5 , светодиод горит без того , чтобы я удалил эту штуку , но я хочу, чтобы светодиод был включен, когда я поставлю затем removr эту штуку, как я должен это сделать ?, @Majd Ramadan

@goodarduinocode это синтаксическая ошибка, но это не проблема., @Majd Ramadan


1 ответ


1

что на самом деле происходит с этим кодом , когда я кладу что-то рядом с датчиком <= 5 , индикатор горит без того, чтобы я снимал эту вещь, но я хочу, чтобы светодиод включался, когда я кладу, а затем снимаю эту вещь

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

В настоящее время ваш код измеряет расстояние так быстро, как только может. Измерение-это то, что занимает наибольшее время за одну итерацию функции loop (). Таким образом, вы получаете много-много измерений в секунду. Но такие измерения расстояния всегда являются шумными, что означает, что значения изменяются случайным образом в определенном диапазоне. Когда вы помещаете объект перед датчиком, вы ожидаете, что значения просто уменьшатся, но на самом деле они иногда снова увеличиваются на 1 или 2 значения из-за шума. Таким образом, измеренные значения могут выглядеть примерно так (только воображаемые для наглядности, а не реальные значения):

5.4 --> 5.2 --> 4.99 --> 5.001 --> 4.89 --> 4.90 --> 4.5

В целом значения снижаются, но вы всегда сравниваете текущее значение с фиксированным порогом в 5 см. Когда шум просто снова повысит значение, пока вы проходите 5 см, вы получите ложный результат "поставил и снова удалил". При этом вероятность возникновения шума действительно высока, так как вы часто его измеряете, а ультразвуковые датчики не точны с точностью до миллиметров. Вы даже можете несколько раз пройти расстояние в 5 см из-за шума.

Существуют некоторые возможности для снижения уровня шума или его устранения.

  • Гистерезис: Первое, что я бы здесь реализовал, - это гистерезис. Это означает, что вы устанавливаете расстояние "положить", отличное от расстояния "удалить". Например, вы можете использовать 5 см в качестве расстояния для регистрации того, что объект помещен перед датчиком, но затем вы ждете, пока расстояние превысит 7 см, чтобы фактически считать объект "удаленным". Вам нужно выбрать разницу между расстояниями, большими, чем шум (вы можете выяснить это, экспериментируя). Этот принцип также используется непосредственно с зашумленными цифровыми сигналами на входных выводах ардуино. Arduino Uno будет рассматривать напряжения выше примерно 2,6 В как цифровое 1 (высокий сигнал), а значение ниже 2,1 В как цифровое 0 (НИЗКИЙ сигнал) (взято из таблицы данных ATmega328P, который является микроконтроллером на Arduino Uno, предполагая, что контроллер работает на 5 В, как в Arduino Uno). В электрических терминах это называется триггером Шмитта.

    Для реализации этого вы можете просто изменить пороговые значения в своих операторах if.

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

  • Если время реакции не имеет большого значения, вы можете уменьшить частоту измерений, чтобы последующие измерения расстояния уже находились на большом расстоянии друг от друга, чтобы шум создавал ложные триггеры. Это хуже, чем другие решения, так как это также зависит от того, как быстро вы помещаете объект перед датчиком, но это действительно легко реализовать (просто вызов функции задержки() или лучше использовать функцию millis (), как в примере BlinkWithoutDelay для неблокирующего кода).

Я бы сначала реализовал гистерезис. Затем, если разница в расстояниях, необходимая для хорошей работы, слишком велика для вас, вы можете взять среднее значение кратного значения, чтобы уменьшить шум.


И просто для протокола, как уже было сказано в комментариях: в вашем первом заявлении if есть дополнительная закрывающая скобка}, которой там быть не должно.

,