Arduino прерывает функцию задержки

в моем следующем проекте я использую 4 светодиода с задержкой (10000). Мне нужна функция для отмены этого цикла и повторного запуска с новым значением задержки, например. 100.

Я включил прерывания, и когда я нажал кнопку, задержка изменилась на 100 ПОСЛЕ раунда. Мне нужно подождать 10 секунд. Можно ли перезапустить функцию цикла с новыми значениями?


person colastar    schedule 28.10.2014    source источник
comment
Иногда ответ «Нет», и вы напортачили с реализацией. Попробуйте еще раз, на этот раз уточнив требования.   -  person Ignacio Vazquez-Abrams    schedule 28.10.2014


Ответы (1)


Ничего себе, это было грубо Игнасио По крайней мере, быть полезным.

Вы можете сделать это, но не так, как вы реализовали.

Задержка не годится для использования в этом случае. Гораздо лучший способ реализации — использовать цикл while следующим образом:

int delayLED = 10000;

int beginMillis = millis();

while( millis() - beginMillis < delayLED)
{
    // insert the code for your "interrupt" here
    // kinda like this
    if(button pressed)
    {
        delayLED = 100;
        break;
    }
}

Это просто шаблон, а не полный ответ. Дайте мне знать, если у вас есть дополнительные вопросы.

Удачного кодирования!

person djUniversal    schedule 28.10.2014
comment
И я бы добавил: посмотрите на примеры! Первый туториал всегда делается с arduino — как мигать светодиодом с задержкой, а второй — без. Прежде чем пытаться терять время, попробуйте узнать, как что-то работает... - person frarugi87; 29.10.2014
comment
Не уверен, о каком примере вы говорите, но, конечно, сама функция задержки на веб-сайте arduino.cc имеет хорошую запись о том, что она не используется для кода синхронизации. Я думаю, что это совершенно правильный вопрос для тех, кто плохо знаком с Arduino. Изучают ли они это на примерах (?), в документации или задавая вопрос на веб-сайте, подобном этому. - person djUniversal; 29.10.2014
comment
Я на самом деле столкнулся с той же проблемой, и мне было интересно, нет ли другого пути? Что мне не нравится в этом решении, так это то, что если прерывание вызывается после оценки переменной флага, то функция выполнит то, что мы не хотим выполнять. Кстати, это похоже на некий пул. Есть ли способ раскрутить стек функции или просто указать на другую адресную память, когда мы находимся в вызове прерывания? Я хочу быть уверен, что это действительно возможно, и могу ли я сломать свой чип, делая это? - person Mr Bonjour; 03.03.2015
comment
Нет объединения. Это постоянно оценивается на основе текущего Millis(). Я не понимаю, почему вы думаете, что это сломает ваш чип, в любом случае такие оценки происходят постоянно. Причина, по которой это было написано таким образом, заключается в том, что OP хотел прервать текущее время и немедленно начать новое время. Эта функция делает это, зацикливая каждый цикл, чтобы, если новое время задержки прошло, она немедленно оценивала и запускала новое время. Что именно ты пытаешься сделать? - person djUniversal; 03.03.2015