Кнопка переключения режимов для switch и delay в этих режимах
- Войдите на сайт для отправки комментариев
Пт, 02/01/2015 - 15:09
С Новым Годом!
учусь прогать, наткнулся на такую проблемку:
есть одна кнопка, при нажатии переключает режимы, switch смотрет значение режима и включает нужную функцию, но, все функции используют delay и при нажатии кнопки не всегда происходит переключение режимов, они переключаются, только тогда, когда кнопка нажата в момент окончания цикла режима.
как сделать чтоб при нажатии кнопки режим переключался не зависимо от режимов и количества delay в них?
С Новым Годом!
учусь прогать, наткнулся на такую проблемку:
есть одна кнопка, при нажатии переключает режимы, switch смотрет значение режима и включает нужную функцию, но, все функции используют delay и при нажатии кнопки не всегда происходит переключение режимов, они переключаются, только тогда, когда кнопка нажата в момент окончания цикла режима.
как сделать чтоб при нажатии кнопки режим переключался не зависимо от режимов и количества delay в них?
Я хоть и сам новичок в этом, но, думаю, код бы свой выложить неплохо было, чтобы знающие люди посмотели))
http://arduino.ru/Reference/AttachInterrupt
http://robocraft.ru/blog/arduino/45.html
http://compblog.vlukyanov.com/?p=435
вот мой код, я так понял нужно сделать прерывания, но если я беру switch в функцию и эту функцию прописываю в attachInterrupt то у меня вообще ниодин режим не работает
А не проще для начала отказаться от delay
и ещё я не понял с пинами на прерывания: я сейчас пытаюсь с одной кнопкой научиться, а если мне нужно к UNO 4 кнопки подключить и все с прерываниями, у меня это не выйдет?
читаем описание
Избавляемся от delay и зачем вам вообще прерывания
я бы с удовольствием избавился от delay()
но почитав пример, я так и не понял, как мне это сделать.
вот моя функция мигания к примеру
вроде ничего сложного, но я не понял как мне переключать свечение светодиодов без delay()
это я привел простой пример, а так у меня функции намного сложней так как это управлялка ws2812 светодиодами
я бы с удовольствием избавился от delay()
но почитав пример, я так и не понял, как мне это сделать.
вот моя функция мигания к примеру
вроде ничего сложного, но я не понял как мне переключать свечение светодиодов без delay()
это я привел простой пример, а так у меня функции намного сложней так как это управлялка ws2812 светодиодами
Суть в следующем - delay() в течении определенного промежутка времени ничего не делает. Вообще ничего. Но если вы найдете способ отсчитывать определенный промежуток времени, и по его окончании что-то делать (учитывая, что функция loop() работает циклически) - вы сможете обойстичь без delay().
Даю подсказку - вам нужна точка отсчета, и нужно знать сколько времени прошло, с момента определения этой точки. Вторая подсказка - millis().
да, я этот пример с millis() и пробывал, но оно у меня циклично очень мега быстро перебирает режим работы, может delay(500) и разница между точкой отсчета (millis() + 500 > текущее) совсем не те величины? может для millis() нужны другие величины чем у delay ?
и ещё вопрос, если я все режимы переведу в временные, то к примеру режим эффекта, который длится в цикле 20 сек, я смогу переключить в любой момент, или всеже прийдется ждать конца цикла этой функции мигания?
да, я этот пример с millis() и пробывал, но оно у меня циклично очень мега быстро перебирает режим работы, может delay(500) и разница между точкой отсчета (millis() + 500 > текущее) совсем не те величины? может для millis() нужны другие величины чем у delay ?
и ещё вопрос, если я все режимы переведу в временные, то к примеру режим эффекта, который длится в цикле 20 сек, я смогу переключить в любой момент, или всеже прийдется ждать конца цикла этой функции мигания?
Как насчет посчитать время всего цикла.
Допустим это 2 сек = 2000 мс = looptime.
Смотрим текущее время millis() и берем остаток от деления на время цикла looptime = 2000 мс
Т.е. у нас всегда будет число time = millis() % looptime в диапазоне от 0 до 2000.
Ну, надеюсь, в целом идея понятна.
да, я этот пример с millis() и пробывал, но оно у меня циклично очень мега быстро перебирает режим работы, может delay(500) и разница между точкой отсчета (millis() + 500 > текущее) совсем не те величины? может для millis() нужны другие величины чем у delay ?
и ещё вопрос, если я все режимы переведу в временные, то к примеру режим эффекта, который длится в цикле 20 сек, я смогу переключить в любой момент, или всеже прийдется ждать конца цикла этой функции мигания?
Вопрос не понятен.
Изменил пример:
нужно инициализировать нулем.
да... идея и логика мне понятна, но, что-то у меня ничего с временем не получается, диоды бешено мигают, и ещё дляменя мало понятно, как быть, если у меня лента и включаю я диоды циклом for
да... идея и логика мне понятна, но, что-то у меня ничего с временем не получается, диоды бешено мигают, и ещё дляменя мало понятно, как быть, если у меня лента и включаю я диоды циклом for
Если в данном конкретном случае delay() тоже мешает, то нужно отказаться от цикла for() в пользу while().
Вы не могли бы с нуля, step-by-step, пояснить, что хотите получить? Дайте ссылку на библиотеку. Тяжело вникать в обрывки кода, не понимая общей картины...
да... идея и логика мне понятна, но, что-то у меня ничего с временем не получается, диоды бешено мигают, и ещё дляменя мало понятно, как быть, если у меня лента и включаю я диоды циклом for
Почитайте то, что я выше написал. У вас будет таймер на сколько хотите в необходимом диапазоне без использования задержек и без прерываний если использовать остаток от деления текущего времени на число.