ezButton вызов функции и выход из цикла

Всем привет
Пишу простое меню
Задача следующая, по нажатию кнопки вызываем функцию, а в ней по нажатии то же кнопки переходим опять в цикл loop()
но кнопка не срабатывает на выход, цикл выполняется и после нажатия, в чем проблема?
‘’’
#include <ezButton.h>
ezButton button(4);
int temp = 0;

void setup()
{
Serial.begin(9600);
button.setDebounceTime(50);
}

void loop()
{
button.loop();
if (button.isPressed())
{
Serial.println(“BUTTON”);
action();
delay(100);
}
}

void action()
{
while (button.isPressed())
{
temp++;
Serial.println(temp);
delay(500);
}
Serial.println(“exit”);
}
‘’’

Для начала вставьте код по правилам. Обратный апостроф на кнопке с буквой ё

1 лайк

Извините

#include <ezButton.h>
ezButton button(4);
int temp = 0;

void setup()
{
    Serial.begin(9600);
    button.setDebounceTime(50);
}

void loop()
{
    button.loop();
  if (button.isPressed())
{
    Serial.println("BUTTON");
    action();
    delay(100);
}
}

void action()
{
  while (button.isPressed())
{
    temp++;
    Serial.println(temp);
    delay(500);
}
    Serial.println("exit");
}

потому что вы написали бесконечный цикл
За обновление состояния кнопки отвечает вызов

Вы не вызываете его внутри функции, состояние isPressed() не обновляется и потому условие выхода из цикла никогда не наступает.

А вообще, цикл while() нужно запретить к использованию новичками.
Во-первых, они лепят его в 10 раз чаще, чем опытные программисты, в, главное, в девяти случаях из десяти используют неправильно

Я пробовал этот вариант, в таком случае, сразу выходит из цикла, не дожидаясь нажатия

значит думайте еще. Например о том, что у вас два нажатия - одно для входа, а другое для выхода. А это значит, что между входом и выходом кнопка должна быть отжата, а вы этого события в программе не ловите.

while (!button.isPressed())

Пока кнопка НЕ нажата, крутится бесконечный цикл. И button.loop() не забудьте

А вообще идея выхода из лупа в другой бесконечный цикл сама по себе порочна. Все прекрасно делается в самом лупе

“Порочно” как раз делать в самом loop. Цикл должен быть внешний. Не любой контроллер сможет работать с зацикленным внутри себя loop.

Криво работает в таком виде:

#include <ezButton.h>
ezButton button(4);
int temp = 0;

void setup()
{
    Serial.begin(9600);
    button.setDebounceTime(50);
}

void loop()
{
  button.loop();
  if (button.isPressed()){
    Serial.print("BUTTON");
    action();
    delay(100);
  }
}

void action()
{
  button.loop();
  while (!button.isPressed()){
    button.loop();
    temp++;
    Serial.println(button.isPressed());
    Serial.println(temp);
    delay(500);
  }
    Serial.println("exit");
    temp = 0;
}

button.loop(); нужно лепить и до и после while
Выходит из цикла только если кнопку зажать на пару секунд

Я понимаю что написал что то не правильно, поэтому и обратился за помощью.
Как лучше реализовать кнопку, в идеале конечно через ezButton
Спасибо за помощь!

Если вы учитесь, то наверное лучше посмотреть, почитать уроки по работе с кнопкой. Например у Гайвера. Работа с кнопками

еще раз - если вы хотели, чтобы программа сначала входила в функцию по нажатию, а потом выходила тоже ПО НАЖАТИЮ - то так и надо писать в коде.

В основном цикле проверяете кнопку. Если нажата - входите в функцию. В функции сначала ждете, чтобы кнопку ОТПУСТИЛИ, а уже потом снова ждете, пока кнопку НАЖМУТ ВТОРОЙ РАЗ.
А у вас в коде совсем другое.

Кроме того, использование оператора delay() крайне не рекомендуется при работе с кнопками. Используйте миллис.

Пошел читать теорию
По всей видимости мне понадобятся прерывания

Будут конструктивные вопросы вернусь
Всем спасибо

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

не очень понял, какая именно теория вам понадобилась, чтобы выполнить мои рекомендации в прошлом сообщении? Подождать, пока кнопку отпустят, а потом подождать, пока нажмут - неужто такая большая разница с тем, что вы уже делаете в коде?

Именно так и работает код у ТС - пока крутится внешний цикл, луп стоит

Нет, не нужно

void action()
{
  while (!button.isPressed()){
    Serial.println(button.isPressed());
    Serial.println(temp);
    button.loop();
    temp++;
  }
    Serial.println("exit");
    temp = 0;
}

А нефиг delay() туда лепить

Я не предлагал устраивать бесконечные циклы в loop(). Для обработки кнопок это не нужно

Это только часть общей программы.
В чем проблема прерываний, почему нет?