Не выходит из цикла while

Тема в разделе "Arduino & Shields", создана пользователем totoshkin, 4 авг 2021.

  1. totoshkin

    totoshkin Нуб

    Всем привет. Код принимает значение через Serial, сравнивает и запускает один из циклов While. Дальше в процессе этого цикла, если прислать новое значение, то код игнорит его либо считает, что это еще первоначальное значение и не происходит выход из While. Подскажите пожалуйста, в чем проблема?
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(7, 8); // RX, TX

    char val;
    int const PinA1 = 5;  // (ШИМ) вывод 5 соединен с выводом А1
    int const PinA2 = 6;  // (ШИМ) вывод 6 соединен с выводом А2
    byte speed = 10;


    void setup()
    {
      delay(1000); // ждём пока загрузится
      Serial.begin(9600);  //Скорость порта для связи Arduino с компьютером
      Serial.println("Goodnight moon!");
      mySerial.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
      //mySerial.println("AT");

      pinMode(PinA1, OUTPUT); // установите контакты на выход
      pinMode(PinA2, OUTPUT);

      digitalWrite(PinA1, 0);
      digitalWrite(PinA2, 0);

    }

    void loop() {
      if (mySerial.available() > 0)
      {
        val = mySerial.read();
        if (val=='H')      
         {
          while (val=='H'){
          delay(1000);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, speed);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(10000);
          digitalWrite(PinA1, speed);
          digitalWrite(PinA2, 0);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(15000);
       
          mySerial.available();
             val = mySerial.read();
              if ( val == 'A')  break;
            }
           }
          }
       

        if (val=='C')
          {
          while(val=='C'){
          delay(1000);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, speed);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(25000);
          digitalWrite(PinA1, speed);
          digitalWrite(PinA2, 0);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(25000);

          }
        }
      }
     
     
  2. parovoZZ

    parovoZZ Гуру

    почитать книжку по циклам и понять, какая тут написана дичь.
    Прежде, чем писать код, необходимо разработать алгоритм работы программы. А для этого необходимо научиться эти алгоритмы составлять. А лучше всего алгоритмы писать на листке бумаги.
    Ну и изучить минимальные основы работы микроконтроллера. Хотя бы по видео на ютубе.
     
  3. totoshkin

    totoshkin Нуб

    [​IMG] Алгоритм я понимаю, но реализовать не сильно получается. Проблема в том, что любой принятый символ считается как правильный и происходит выбор цикла. Почему-то не происходит сравнение...
     

    Вложения:

    • qkefs.png
      qkefs.png
      Размер файла:
      77,5 КБ
      Просмотров:
      107
    Последнее редактирование: 4 авг 2021
  4. parovoZZ

    parovoZZ Гуру

    я не силён в дуриновских функциях, поэтому как с ними правильно работать не скажу. А вот алгоритмически программа составлена не верно. Считывать значение с сериала и производить на основании этого значения какие-то действия необходимо в двух разных процедурах.
    Delay - избавиться!!!!! Оно блокирует вообще всю работу.
    Резюме - весь код переписать. Этот обсуждать и дорабатывать бессмысленно.
     
  5. totoshkin

    totoshkin Нуб

    я понимаю, что это говнокод, но это вообще мой второй раз и для разовго проекта, что называется по-быстрому.
     
  6. totoshkin

    totoshkin Нуб

    хорошо. вопрос задам так: почему любой принятый символ считается правильным? Даже, если я отправляю 'A'
     
    Последнее редактирование: 4 авг 2021
  7. Airbus

    Airbus Радиохулиган Модератор

    Потому что не ноль. Ноль не правильный. Хотя что значит неправильный? Зачем у Вас while? Там if нужен. Точнее if else if
     
    Последнее редактирование: 4 авг 2021
  8. totoshkin

    totoshkin Нуб

    Мне нужно чтобы цикл выполнялся по кругу, пока не пришлешь другое значение.
     
  9. totoshkin

    totoshkin Нуб

    К for я не хочу привязываться, потому что неизвестно какое число брать для сравнения. Проект таймер полива. Включили, прислали значение и в зависимости от этого значения запустился один из двух циклов и работал пока не пришлешь неправильное значение. Вот мой алгоритм.
     
  10. totoshkin

    totoshkin Нуб

    В случае if else, код выполнится один раз и нужно будет снова отправлять что-то в сериал. Поэтому он не подходит.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Внимательно смотрим вот на это и отвечаем на вопрос:
    Код (C++):
        if (val=='C')
          {
          while(val=='C'){
                delay(1000);
                digitalWrite(PinA1, 0);
                digitalWrite(PinA2, speed);
                delay(25);
                digitalWrite(PinA1, 0);
                digitalWrite(PinA2, 0);
                delay(25000);
                digitalWrite(PinA1, speed);
                digitalWrite(PinA2, 0);
                delay(25);
                digitalWrite(PinA1, 0);
                digitalWrite(PinA2, 0);
                delay(25000);
          }
        }
     
    Кто, когда, где и при каких обстоятельствах изменит переменную val внутри данного цикла?

    А если никто и никогда не изменит, то с чего бы циклу заканчиваться?
     
    SergeiL, arkadyf, Daniil и ещё 1-му нравится это.
  12. totoshkin

    totoshkin Нуб

    я сделал тестово для первого цикла, если бы на нем получилось, то перенес и на второй
     
  13. parovoZZ

    parovoZZ Гуру

    с такими знаниями решать подходит/не подходит как-то очень рано.
     
  14. totoshkin

    totoshkin Нуб

    буду рад, если объясните почему я не прав тогда
     
  15. parovoZZ

    parovoZZ Гуру

    Не понимаю, в чём проблема? Любая программа выполняется по кругу, иначе МК уйдёт на последний адрес и либо там встанет, либо уйдёт на ресет. Это как компилятор код организует.
     
  16. totoshkin

    totoshkin Нуб

    Переписал, выполнился первый и второй if и все. В val получается сохраняется на один раз о чем я и говорил. Нужно каждый раз присылать val
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(7, 8); // RX, TX

    char val;
    int const PinA1 = 5;  // (ШИМ) вывод 5 соединен с выводом А1
    int const PinA2 = 6;  // (ШИМ) вывод 6 соединен с выводом А2
    byte speed = 10;


    void setup()
    {
      delay(1000); // ждём пока загрузится
      Serial.begin(9600);  //Скорость порта для связи Arduino с компьютером
      Serial.println("Goodnight moon!");
      mySerial.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
      //mySerial.println("AT");

      pinMode(PinA1, OUTPUT); // установите контакты на выход
      pinMode(PinA2, OUTPUT);

      digitalWrite(PinA1, 0);
      digitalWrite(PinA2, 0);

    }

    void loop() {
      if (mySerial.available() > 0)
      {
        val = mySerial.read();
        if (val=='H')
        {
          delay(1000);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, speed);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(10000);
          digitalWrite(PinA1, speed);
          digitalWrite(PinA2, 0);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(15000);
          }
          if (val=='C');
          {
          delay(1000);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, speed);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(10000);
          digitalWrite(PinA1, speed);
          digitalWrite(PinA2, 0);
          delay(25);
          digitalWrite(PinA1, 0);
          digitalWrite(PinA2, 0);
          delay(15000);
          }
        }
      }
     
  17. parovoZZ

    parovoZZ Гуру

    кому присылать?

    что значит эта фраза? Значение в переменной хранится до тех пор, пока не будет перезаписано или не будет уничтожена сама переменная.
     
  18. parovoZZ

    parovoZZ Гуру

    что переписал??? В какой порт отправляется символ? В serial или в myserial?
     
  19. parovoZZ

    parovoZZ Гуру

    я же написал
    ДЛЯ КОГО????????
     
  20. totoshkin

    totoshkin Нуб

    В Serial приходит по Bluetooth значение "text" и записывается в val, проходит 2 ifa и останавливается. Значит она уничтожается или перезаписывается? Причем в val больше ничего не приходит.