Помогите найти ошибку в коде.

Тема в разделе "Arduino & Shields", создана пользователем duinoob, 24 фев 2018.

  1. duinoob

    duinoob Нуб

    #include <Ultrasonic.h> // подключаем библиотеку

    Ultrasonic ultrasonic(12, 11); // Trig - 12, Echo - 11

    int a;
    int b = 10;//влево
    int c = 9;//вправо
    int d;
    int e;
    int f = 3;//вперёд
    int g = 6;//назад
    void setup() {
    Serial.begin(9600); // инициализация послед. порта
    pinMode(b, OUTPUT);
    pinMode(c, OUTPUT);
    pinMode(f, OUTPUT);
    pinMode(g, OUTPUT);
    }

    void loop() {
    digitalWrite(f, HIGH);//вперёд
    float dist_cm = ultrasonic.Ranging(CM); // дистанция в см
    Serial.println(dist_cm); // выводим дистанцию в порт
    int a = random(0,2);
    Serial.println(a);







    if(dist_cm < 30 && a == 0){//машинка поворачивает влево
    int d = dist_cm;
    digitalWrite(b, HIGH);
    delay(2000);
    int e = dist_cm;
    }
    if(e < d){ ////////////не работает даже при истинном условии//////////
    digitalWrite(b, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);//едет назад
    delay(2000);
    digitalWrite(g, LOW);
    digitalWrite(b, HIGH);//сворачивает в прежнюю сторону
    digitalWrite(f, HIGH);
    delay(2000);
    int d = 0;
    int e = 0;

    Serial.println('////////////////////////////////////////////////////////////////'); //поиск ошибки
    }
    digitalWrite(b, LOW);







    if(dist_cm < 30 && a == 1){ //машинка поворачивает вправо
    int d = dist_cm;
    digitalWrite(c, HIGH);
    delay(2000);
    int e = dist_cm;
    }
    if(e < d){ ////////////не работает даже при истинном условии//////////
    digitalWrite(c, LOW);
    digitalWrite(f, LOW);//едет назад
    digitalWrite(g, HIGH);//влево
    delay(2000);
    digitalWrite(g, LOW);
    digitalWrite(c, HIGH);//сворачивает в прежнюю сторону
    digitalWrite(f, HIGH);
    delay(2000);
    int d = 0;
    int e = 0;
    Serial.println('////////////////////////////////////////////////////////////////////'); //поиск ошибки
    }
    digitalWrite(c, LOW);
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    2016-12-03_20-50-08.png
     
    NikitOS нравится это.
  3. mcureenab

    mcureenab Гуру

    Дайте переменным осмысленные имена.

    Вероятно объявление неиспользуемых локальных переменных сделано по недоразумению

    Код (C++):
    int d = 0;
    int e = 0;
     
  4. mcureenab

    mcureenab Гуру

    Тут автор наверняка хотел изменить глобальные переменные d и e, а не объявить неиспользуемые локальные переменные d и e

    Код (C++):
    int d = dist_cm;
    digitalWrite(b, HIGH);
    delay(2000);
    int e = dist_cm;
     
  5. duinoob

    duinoob Нуб

    это просто тщетные попытки найти ошибку
    исходный код:
    int d = dist_cm;
    digitalWrite(b, HIGH);
    delay(2000);
    if(dist_cm < d){}
     
  6. duinoob

    duinoob Нуб

    Если что, ардуино просто не воспринимает неработающую часть кода
     
  7. NikitOS

    NikitOS Король шутов Администратор

    Я тоже не воспринимаю Ваш код. Его просто нет
     
  8. duinoob

    duinoob Нуб

    Всё перепробовал и всё равно не работает как надо
    на f постоянно подаётся напряжение,
    мигает то b, то c
     
  9. duinoob

    duinoob Нуб

    Код (C++):
    if(dist_cm < 30 && a == 0){//машинка поворачивает влево
    int d = dist_cm;
    digitalWrite(b, HIGH);
    delay(2000);
    int e = dist_cm;
        if(e < d){ ////////////не работает даже при
        истинном условии//////////
        digitalWrite(b, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, HIGH);//едет назад
        delay(2000);
        digitalWrite(g, LOW);
        digitalWrite(b, HIGH);//сворачивает в прежнюю
        сторону
        digitalWrite(f, HIGH);
        delay(2000);
        int d = 0;
        digitalWrite(b, LOW);}}


    Это код с самого начала(его часть).
     
  10. mcureenab

    mcureenab Гуру

    Это ваш код.

    Код (C++):

    // int d = dist_cm;
    // int e = dist_cm;
    //  if(e < d)
        if(dist_cm < dist_cm) { // это условие всегда ложно
     
  11. mcureenab

    mcureenab Гуру

    Вы не попробовали правильный вариант :(
     
    duinoob нравится это.
  12. duinoob

    duinoob Нуб

    Возможно
     
  13. duinoob

    duinoob Нуб

    Я только сейчас это нашел и исправил на
    Код (C++):
      if(dist_cm < 30 && a == 0){//машинка поворачивает влево
        float d = ultrasonic.Ranging(CM);
        digitalWrite(b, HIGH);
        delay(2000);
      }
         if(ultrasonic.Ranging(CM) <= d){//если перед ней появилась стена
            digitalWrite(b, LOW);
            digitalWrite(f, LOW);
            digitalWrite(g, HIGH);//едет назад
            delay(2000);
            digitalWrite(g, LOW);
            digitalWrite(b, HIGH);//сворачивает в прежнюю сторону
            digitalWrite(f, HIGH);
            delay(2000);
            float d = 0;
         
      Serial.println("dfubdryufnftygnggyuvynbjgfytigumgynukh");
          }
            digitalWrite(b, LOW);


    Но все равно не работает
     
  14. duinoob

    duinoob Нуб

  15. mcureenab

    mcureenab Гуру

    Не пойму, вы различаете оператор присваивания и оператор объявления переменной с инициализацией? Такое ощущение, что нет.

    float d = ultrasonic.Ranging(CM);

    это совсем не то же самое что

    d = ultrasonic.Ranging(CM);

    Избавьтесь от неиспользуемых переменных.

    Код (C++):
      if(dist_cm < 30 && a == 0){//машинка поворачивает влево
        float d = ultrasonic.Ranging(CM);  // локальная переменная d не используется
        digitalWrite(b, HIGH);
        delay(2000);
      }
     
     
    duinoob нравится это.
  16. duinoob

    duinoob Нуб

    Спасибо, все заработало
    Я просто нуб как видите
     
  17. duinoob

    duinoob Нуб

    А что происходит если я её не убираю?
     
  18. mcureenab

    mcureenab Гуру

    далее происходит сравнение с глобальной переменной d, которая вероятно 0.0 ( тут я не вижу где она изменяется).

    Код (C++):
         if(ultrasonic.Ranging(CM) <= d){// Тут d глобальная переменная. Какое её значение Х.З.
    Переменную можно оставить, но это просто мусор в коде и пустая трата времени.
     
  19. duinoob

    duinoob Нуб

    Я просто учусь пока. Это мой первый проект.
    Если что, это проект самоповорачивающейся машинки.
     
  20. mcureenab

    mcureenab Гуру

    Тут float d это не изменение глобальной переменной int d. Что вы хотели этим сказать - Х.З.
     
    Последнее редактирование: 24 фев 2018