HC-SR04

Тема в разделе "Arduino & Shields", создана пользователем Уыфгдщм, 15 май 2018.

  1. Уыфгдщм

    Уыфгдщм Нерд

    Ребят, в чем проблема? Надо чтобы выводилось "STOP" пока расстояние <= 7. Но почему-то программа не выходит из цикла, после увеличения расстояния.
    Код (C++):
    byte trig = 18, echo = 19;
    int cm, duration;
    void setup() {
      Serial.begin(9600);
      activate();
      Serial.println("START");
    }

    void loop() {
      delay(10000);
    }
    int count(byte trig, byte echo){
    digitalWrite(trig, LOW);
    delayMicroseconds(5);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    pinMode(echo, INPUT);
    duration = pulseIn(echo, HIGH);
    cm = (duration/2) / 29.1;
    return cm;
    }
    void activate(){
    unsigned short int distance = count(trig, echo);
      while(distance <= 7) {
        Serial.println(distance);
        unsigned short int distance = count(trig, echo);
        delay(100);
         Serial.println("STOP");
      }
    }
     
     
  2. SergeiL

    SergeiL Оракул Модератор

    А Вы внимательно посмотрите на Ваш loop() ;)
    Там кроме пазы в 10 секунд ничего нет.
     
  3. Уыфгдщм

    Уыфгдщм Нерд

    Это и не должно выполняться циклически, только один раз в начале программы
     
  4. SergeiL

    SergeiL Оракул Модератор

    Ну как написано, так, наверное, и выполняется:
    Код (C++):
    void activate(){
    unsigned short int distance = count(trig, echo);
      while(distance <= 7) {
        Serial.println(distance);
        unsigned short int distance = count(trig, echo);
        delay(100);
         Serial.println("STOP");
      }
    }
    Расстояние у Вас измеряется один раз, потом Вы крутитесь в цикле, если расстояние <= 7.
    Перенесите опрос состояния:
    Код (C++):
     distance = count(trig, echo);
    в цикл, и будет Вам счастье :)
     
    Последнее редактирование: 15 май 2018
  5. SergeiL

    SergeiL Оракул Модератор

    Посмотрел внимательней,
    Просто поменяйте в цикле:
    Код (C++):
    while(distance <= 7) {
        Serial.println(distance);
        unsigned short int distance = count(trig, echo);
        delay(100);
         Serial.println("STOP");
      }
    на:
    Код (C++):
    while(distance <= 7) {
        Serial.println(distance);
        distance = count(trig, echo);
        delay(100);
      }
      Serial.println("STOP");

     
    А то Вы заводите новую локальную переменную, которая не проверяется в условии цикла :)
    И еще перенесите:
    Код (C++):
    Serial.println("STOP");
    за цикл.
    Хотя в вопросе:
    тогда оставляем в цикле. :)
     
    Последнее редактирование: 16 май 2018
    arkadyf нравится это.
  6. SergeiL

    SergeiL Оракул Модератор

    А еще проще так:
    Код (C++):
    void activate()
    {
      unsigned short int distance;
      do
      {
        distance = count(trig, echo);
        Serial.println(distance);
        delay(100);
        Serial.println("STOP");
      } while(distance <= 7);
     }
     
    Последнее редактирование: 16 май 2018
    Уыфгдщм нравится это.
  7. b707

    b707 Гуру

    народ, все что вы советуете - не поможет ТС. Он же пишет "программа не выходит из цикла, после увеличения расстояния."
    То есть, насколько я понял - ему надо, чтобы в какой-то момент расстояние сначала было больше 7, а когда снизится ниже этого порога - выводился "СТОП".
    Поправьте меня, но не один из предложенных кусков кода так работать не будет.

    Или если я неправильно понял задачу - пусть ТС пояснит.