Всем привет!
Столкнулся с такой проблемой. В схеме 2 кнопки. С помощью библиотеки “GyverButton.h” хочу этими кнопками включать выполнение функций. Функции цикличные с циклом While(1) - это обязательно. В примере 4 функции, каждая для мигания отдельного светодиода. Сначала мигание делал через delay, потом переделал на millis - не помогло. Включать функцию могу только через RESET. Так все работает. Но хотелось, чтобы при работающей одной функции, по нажатию на другую кнопку, включалась другая. Короче вопрос: куда воткнуть “break” или в While(1) вместо “1” нужно, что-то другое… По всякому извращался, не получается, только через сброс можно другую функцию включить… Схема вот
Вариант 1, правильный:
Никаких внутренних бесконечных циклов. Каждая функция является задачей и вызывается периодически (каждые 100 мс или сколько вам нужно), выполняет один цикл и завершается. В этом случае запуском/остановкой задачи можно управлять кнопками, опрашиваемыми в loop(); Управление задачами описано здесь
Вариант 2, костыльный:
Отслеживание кнопок выносится в отдельную функцию, которая вызывается не только в loop(), но и в каждой из функций в ее бесконечном цикле и, соответственно, позволяет не терять управление
Вариант 4:
«Повесить» кнопку на прерывание. В прерывании выставлять флаг. В цикле(ах) этот флаг отслеживать и вызывать break.
ЗЫ: всё, кроме 3го - можно считать костылями. Но 4й - наиболее «правильный костыль» (если кнопка одна или по количеству пинов с внешними прерываниями).
Давайте всё же, как просил наш участник @WladDrakula проявим терпимость и НЕ будем предполагать то, чего не знаем. Ну вот хочется ТС так делать - ну пусть делает, в чем дело?
Спросил он «как решить проблему его» - отвечаем. Если знаем.
ЗЫ: На этом «этапе»: на самом деле, отсеиваются лентяи, неучи, халявщики и просто тупые. Зачем нарушать процесс?))
Ее нужно вызывать только если была удержана кнопка 2. А значит кроме собственно миллиса нужен еще и флаг активности задачи. В общем ссылку на тему по управлению задачами я ему еще в #2 дал ))