Как кнопкой прервать бесконечный цикл While?

Для 328 атмеги это таки перебор ))

1 лайк

Выше уже сказали об этом, но уж если “так уж прям уж” обязательно, то что-то такое придётся делать в каждой функции))

Спойлер
void loop() {
  Leds1();
}


void Leds1() {
  
  static bool OFF = true;

  while (1) {
    butt1.tick();
    if (butt1.isClick())    //при клике по 1 кнопке - вкл./выкл функция  void Leds1()
      OFF = !OFF;
    if (OFF)
    {
      digitalWrite(7, LOW);
      return;
    }
    if (millis() - currentTime > 300) { // проверяем, сколько прошло миллисекунд
      currentTime = millis();
      ledState = !ledState; // меняем состояние светодиода на противоположное
      digitalWrite(7, ledState); // включаем или выключаем светодиод
    }
  }
}

Так тоже не работает… Чтобы включить другую функцию, нужно отключить уже запущенную. Отключается так же как включалась: кликом включалась - кликом по той же кнопке выключается, удержанием включалась - удержанием той же кнопки выключается, и только потом можно запускать другую. Да еще работает через раз… RESETом удобнее получается :face_with_diagonal_mouth:

А что ты хотел? Использование delay() и бесконечные циклы до добра не доведут (особенно если не умеешь этим пользоваться)…

Если хочешь чтобы было «хорошо» - перечитай тему. @v258 хорошее решение предлагал.

:rofl: понятно, что не схема. Но видно же все? :wink:

Да, примерно как тут:

:wink:

А вот это схема:

Сравнили…

Ну или вот Ардуино Нано, если тебе так понятнее:

Умничать конечно прикольно… Но никто так и не ответил или просто упустил главный вопрос “Как нажатием кнопки прервать цикл While?” ну и одновременно запустить другой процесс. Неужели это такая сложная и трудоемкая задача…? Я так не думаю, и конечно со временем найду решение. Спасибо всем конечно за то что переживаете за развитие новичков, но острить и отсылать на другие ресурсы… Зачем тогда задавать здесь вопросы, если ответы все равно искать нужно в других местах?

Ответов более 4х вариантов было дано.

Тут два варианта.
Или всё надоест и забросишь.
Или будешь развиваться и сам поймёшь.

Надеюсь на второй вариант. Поэтому - удачи! :slight_smile:

Совесть имейте. А что я вам в сообщении #2 написал? Если вам нужен готовый код, так обращайтесь в платный раздел. Если хотите бесплатно - придется думать своей головой. Подсказки даны, пользуйтесь

ТС, родное сердце! Тебе в сообщении №2 V258 ответил сразу. Остальное - наше развлечение. Это же наш форум? Ты не станешь претендовать на оспаривание нашего права развлекаться так и там, где нам нравится?

У 258 в ответе есть Вариант, который он назвал “костыльный”, но для тебя он самый простой.

У 340 кварц на 12Hz и атмеги на 16Hz это что то новенькое для понимания)))

:joy:
А я и не глянул на неё, первую попавшуюся в интернете взял :smiley:

Вот они, «подставщики»: Arduino Nano: описание, подключение, схема, характеристики | ВИКИ

Нет, не видно.
Когда перед глазами принципиальная схема, по ней сразу видно, как она работает.
А когда монтажная - чтобы понять, как она работает, нужно самому по монтажной восстановить принципиальную.
Вот и возникает вопрос: кто именно должен из монтажной делать принципиальную.
По логике - ТС, т.к. это именно ему нужно. Читателю то это зачем?
А если ТС это не нужно, так с какой стати остальным напрягаться?

Никто не ответил именно потому, что это не нужно. От слова “совсем”.
Нужно перепроектировать скетч так, чтобы мысли о прерывании while даже не возникало.

Нету такой задачи. Это не задача, а прямое следствие Вашей ошибки. Исправьте ошибку и задача исчезнет (не будет решена, а именно исчезнет).

Задавать вопросы затем, чтобы наставили на путь истинный. А если Вы к этому не готовы, то - да, незачем задавать вопросы.

Можно всё сделать, и блоху подковать. Но будет ли она нормально прыгать?
Переключение - одной кнопкой

Спойлер
byte btnStat = 0;
.
.
.
void loop() {
  Leds1();
  Leds2();
}


void Leds1() {
  static unsigned long currentTime1; // переменная времени
  static boolean ledState1 = 0; // переменная состояния светодиода
 
  while (1) {

    butt1.tick();
    if (butt1.isClick())
    { //при клике по 1 кнопке переключаются/выключаются по очереди функции Leds1() и Leds2()
      btnStat++;
      if (btnStat > 2)
        btnStat = 0;
    }
    if (btnStat == 1)
    {

      if (millis() - currentTime1 > 150) { // проверяем, сколько прошло миллисекунд
        currentTime1 = millis();
        ledState1 = !ledState1; // меняем состояние светодиода на противоположное
        digitalWrite(7, ledState1); // включаем или выключаем светодиод

      }
    }
    else {
      digitalWrite(7, LOW);
      return;
    }


  }
}

void Leds2() {
  static unsigned long currentTime2; // переменная времени
  static boolean ledState2 = 0; // переменная состояния светодиода

  while (1) {

    butt1.tick();
    if (butt1.isClick())    //
    {
      btnStat++;
      if (btnStat > 2)
        btnStat = 0;
    }
    if (btnStat == 2)
    {
      if (millis() - currentTime2 > 300) { // проверяем, сколько прошло миллисекунд
        currentTime2 = millis();
        ledState2 = !ledState2; // меняем состояние светодиода на противоположное
        digitalWrite(6, ledState2); // включаем или выключаем светодиод

      }
    }
    else
    {
      digitalWrite(6, LOW);
      return;
    }

  }
}
1 лайк

Всем спасибо! Прошу прощения, если задел чьи-то нежные чувства :wink:
В чужой монастырь, как говорится…

Работает. И while(1) получается не помеха. Только не понятно, почему после мигания последнего светодиода, при нажатии на кнопку 1-й не загорается, а гаснет последний. А уже при следующем нажатии - загорается первый… Можно пояснить, если не затруднит.