Выход из цикла по нажатию кнопки

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 21 дек 2022.

  1. Максим B

    Максим B Гуру

    Всем привет. Пытаюсь реализовать выход из цикла по нажатию кнопки, кусок кода ниже. Не получается отловить нажатие кнопки в цикле WHILE. В функцию заходит, все работает, а вот выйти не получается.

    Код (Text):

    #include <GyverButton.h>
    ....
    void mode_display_h1(){ // функция отображения режим H1
            while (flag1 = true) {
              if (butt4.isClick()) {flag1 = false; Serial.println("exit"); numMenu = 0;}  // вот этот кусок кода не работает
              int t_d = 5; //время мерцания индикаторов
              show_h();
              digitalWrite(DIGIT_1PIN,HIGH);
              digitalWrite(DIGIT_2PIN,LOW);
              digitalWrite(DIGIT_3PIN,LOW);
              digitalWrite(DIGIT_4PIN,LOW);
              delay(t_d);
              show_number(1);
              digitalWrite(DIGIT_1PIN,LOW);
              digitalWrite(DIGIT_2PIN,HIGH);
              digitalWrite(DIGIT_3PIN,LOW);
              digitalWrite(DIGIT_4PIN,LOW);
              delay(t_d);
              show_min();
              digitalWrite(DIGIT_1PIN,LOW);
              digitalWrite(DIGIT_2PIN,LOW);
              digitalWrite(DIGIT_3PIN,HIGH);
              digitalWrite(DIGIT_4PIN,HIGH);
              delay(t_d);
            }
    }


    void loop() {
      butt1.tick();   /чтение кнопок
      butt2.tick();
      butt3.tick();
      butt4.tick();

     switch (numMenu) {
        case 0: display_digits_off(); break;
        case 1: mode_display_time();  break;
      }
     
      if (butt1.isClick()) {numMenu = 1;}
      if (butt1.isHolded()) {mode_display_h1(); flag1 = true;}
    }

     

    СПАСИБО
     
    Niko.lay нравится это.
  2. fogary

    fogary Гик

    Вероятно, пока работает цикл while(), метод butt4.tick() не вызывается и статус butt4.isClick() не изменяется.
     
    Максим B нравится это.
  3. Airbus

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

    Так он из этого цикла while (flag1 = true) никогда и не выйдет.
    Может не = a ==? Ну или так while (flag1)
     
    Максим B, Ariadna-on-Line и issaom нравится это.
  4. parovoZZ

    parovoZZ Гуру

    а почему оно должно работать? Операция присваивания всегда возвращает true. Поэтому твой цикл вечен и выхода из него не будет НИКОГДА. А
    очевидно равен false. Потому и нет печати в порт.
     
    Максим B и Рокки1945 нравится это.
  5. Максим B

    Максим B Гуру

    Да это логично, что он вечен, просто думал, может есть какой-то способ из него выйти, - в общем буду переделывать логику.
     
  6. Максим B

    Максим B Гуру

    =))) Спасибо, не сразу понял в чем прикол, правильно ведь как только я поменял флаг, в цикл я больше не захожу, просто мне казало, что все что в () скобках тоже будет доделано, ну т.е. изменил флаг, вывел в консоль, сменил переменную и дальше все.
     
  7. parovoZZ

    parovoZZ Гуру

    написать логически верный код.
    Если синтаксис верен и компилятор ни на что не ругается, это вовсе не значит, что код верен логически.

    Выйти из цикла на сях можно, как минимум, двумя способами.
     
    Максим B нравится это.
  8. Airbus

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

    Так не пробовал?
     
    Максим B и Ariadna-on-Line нравится это.
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Синтаксис проверьте, а не логику !!! То бишь - грамматическую ошибку найдите. Это язык программирования, а не школьная арифметика. Если синтаксис не верный, то логика "автоматически" меняется.
    а = в означает - присвоить ДЛЯ переменной А значение ОТ переменной В.
    а == в означает - сравнить значения А и В. И если они равны - результат сравнения = true.
    ПС. Это стандартная ошибка "перехожденцев" от школьной арифметики или Бейсика.
     
    Последнее редактирование: 22 дек 2022
    Максим B нравится это.
  10. parovoZZ

    parovoZZ Гуру

    с синтаксисом здесь всё нормально, в противном случае компилятор не соберёт проект.
    выражение присваивания
    Код (C++):
    flag1 = true
    всегда возвращает true. И в этом нет никакой синтаксической ошибки.

    как раз-таки в ней и проблема. Выражение
    Код (C++):
    while (flag1 = true)
    равносильно
    Код (C++):
    while (true)
    и ты не поверишь - здесь тоже нет никакой ошибки. Ни синтаксической, ни логической, т.к. именно так организуется цикл main(). Но в контексте рассматриваемой задачи данное выражение логически не верно.
     
  11. Рокки1945

    Рокки1945 Гуру

    А почему у него сначала функция вызывается а потом флаг взводиться?
    Это что реально работает?
    if (butt1.isHolded()) {mode_display_h1(); flag1 = true;}
     
  12. parovoZZ

    parovoZZ Гуру

    зайди в debug mode и полистай программу по шагам.
     
    Максим B нравится это.
  13. Рокки1945

    Рокки1945 Гуру

    да нахрена оно мне упало
    я вообще так не делаю никогда - разве в метод нельзя отправлять аргумент в круглых скобках
     
    Максим B нравится это.
  14. parovoZZ

    parovoZZ Гуру

    а в коде есть метод?

    а зачем тогда спрашиваешь? Код синтаксически верен, поэтому он
     
    Максим B нравится это.
  15. Рокки1945

    Рокки1945 Гуру

    о да ты попал
    .isClick() .tick() и холдед - это все методы объекта butt1 для какой-то там гайверксой библии
     
    Максим B нравится это.
  16. parovoZZ

    parovoZZ Гуру

    и какая связь между гайверской библией и флагом flag1?
     
    Максим B нравится это.
  17. Рокки1945

    Рокки1945 Гуру

    да никакой - ты победил пошли спать завтра на работу рано
     
    Максим B нравится это.
  18. parovoZZ

    parovoZZ Гуру

    если ты про это
    то здесь сперва вызывается функция
    Код (C++):
    mode_display_h1();
    а после того, как из неё вернётся управление в основной код, отработает инструкция
    Код (C++):
    flag1 = true;
     
    Максим B нравится это.
  19. Airbus

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

    Ему ненадо он с Вахты приехал целыми днями дома поэтому и висит здесь 24/7
     
    Максим B нравится это.
  20. parovoZZ

    parovoZZ Гуру

    у меня не вахтовый режим работы и никуда я ещё не приехал)
     
    Максим B нравится это.