arduino + IR пульт
- Войдите на сайт для отправки комментариев
Сб, 03/09/2016 - 08:02
Уважаемые коллеги подскажите пожалуйста! Есть ардуино, IR пульт, лента ws2812.
Пультом переключаю эффекты. Если нажата одна кнопка (на пульте) переходим к эффекту номер 1, если другая к эффекту номер 2 и т.д.
ВОПРОС как добиться переключения на другой эффект (пультом) не дожидаясь окончания того эффекта который сейчас крутится. (если кнопка на пульте не нажата эффект бесконечен(например перелив)).
Уважаемые коллеги подскажите пожалуйста! Есть ардуино, IR пульт, лента ws2812.
Пультом переключаю эффекты. Если нажата одна кнопка (на пульте) переходим к эффекту номер 1, если другая к эффекту номер 2 и т.д.
ВОПРОС как добиться переключения на другой эффект (пультом) не дожидаясь окончания того эффекта который сейчас крутится. (если кнопка на пульте не нажата эффект бесконечен(например перелив)).
Прерыванием
http://arduino.ru/Reference/AttachInterrupt
ну или в цикле постоянно вставляя строку опроса кнопки с таймингом не меньше 0,2 секунды иначе будет неудобно кнопки давить, но такое решения вообще не айс, и применяется только когда ноги прерываний заняты
Спасибо. Но тогда возникает другой вопрос. Если использовать аппаратные прерывания - где брать управляющий сигнал (для срабатыван ия прерывания)? Или нужно прерывание по таймеру?
Может, хоть скетч покажете? А то ведь там и от него много зависит.
Вова, это неполный скетч и он не даёт ответа на главные вопросы. Давайте я попробую их сформулировать.
Вот, смотрите, пришла команда запустить эффект, например rainbow. Вот он запустился в строке 18. Теперь вопрос:
1) функция rainbow будет работать пока эффект не кончится? И только потом программа перейдёт к строке 19? Или
2) функция rainbow асинхронная - она запускает эффект, а основная программа спокойно продолжается дальше.
От это собственно и зависит что Вам делать. Если (1), то чтение новой команды надо вставлять в функции эффектов, т.к. строка 6 не выплнится пока эффект не закончится. А если (2), то надо научиться просто прерывать эффект.
Понимаете?
По той информации, что Вы дали ничего не скажешь.
Вообщето 1. Я просто 2 не умею. Подскажите где почитать или пример посмотреть
Ну, Вы хоть текст-то дайте полный, сколько просить-то можно?
Что за функция Wheel в строках 70 и 82? Где она определена?
Я нашёл функцию Wheel в примере библиотеки.
В связи с этим у меня вопрос: Вы специально надо мною издеваетесь? Я Вас дважды просил привести полный скетч, Вы привели, но опять неполный!
А теперь смотрите. Я реально хотел Вам помочь. Но чтобы привести кусок кода надо, чтобы он хотя бы компилировался. Ради этого я:
1) скачал и поставил библиотеку (у меня её не было)
2) завел проект для Ваше скетча
и ... убедился, что он не компилируется из-за того, что Вы дали его неполным! Т.е. моё время ушло в трубу просто потому, Вы либо не понимаете значения слова "полный", оибо Вам лень продвинуть мыша на несколько строк при копировании, либо ... Вы просто издеваетесь.
Скажите, кому нужно решить Вашу проблему мне или Вам? Подсказка: мне нахрен не нужно. Так какого же ... Вы специально создаёте мне в этом трудности? Ну, когда дважды попросил дать полный код, можно же было и дать!
Так Вам нужно решение Вашей проблемы или Вы просто подразнить тут всех зашли?
Дико ПРОШУ ПРОЩЕНИЯ !!!
не скопировалась последняя фунция
вот полный код
все проверил - компилируется
еще раз извиняюсь!!!
Попрбоуйте вот так. Только никому не говорите, что это я писал. Написано, чтобы минимизировать изменения в Вашем коде, сам бы я писал совсем по-другому. Везде, где я менял что-то я вставил комментарий /*!*/ - разбирайтесь.
По идее должна заработать, но мне проверять не на чем, так что если чего - постарайтесь описать проблему повнятнее.
спасибо за помощь!
блок 39-41 я понял как и зачем.
в боке 24-31 есть ошибка.
переменная "weGotSignal" в 27 строке всегда =0
проверял поставив посе этой строки - Serial.println(weGotSignal);
еси поставить - Serial.println(results.value); то тоже 0
копаю дальше :-)
спасибо за помощь!
блок 39-41 я понял как и зачем.
в боке 24-31 есть ошибка.
переменная "weGotSignal" в 27 строке всегда =0
проверял поставив посе этой строки - Serial.println(weGotSignal);
еси поставить - Serial.println(results.value); то тоже 0
копаю дальше :-)
Значит неправильно отрабатывает irrecv.decode. Где-то мы её обидели.
Можно уточнить, она что вообще ни разу не становится true или первый раз становится. а потом всегда 0?
всегда 0
Вы уверены, что сигнал реально приходит. Какая разница был у Вас вызов в loop или мы его в отдельную функцию вынесли? Если сигнал есть, он должен приходить. Проверьте, приходит ли сигнал. И это, Вы точно больше ничего не меняли. Просто если раньше сигнал ловился, то и сейчас ему не с чего не ловиться. Хотя бы в первый праз.
загружаю 1 скетч -работает
2- нет
1 и 2 - это точно то, что Вы мне давали и я Вам давал? Ничего не менялось. Если хоть что-то трогали, лучше выложите оба свежих скетча
1и 2 скопированно из форума в новые проекты. Посе этого в своем скече вынес из loop в отдельную функцию, там все работает. УВАЖАЕМЫЙ ЕвгенийП огромное спасибо за наводку. Теперь понятно куда копать.
Есть одна маленькая просьба (если возможно). Вы написали "Только никому не говорите, что это я писал. Написано, чтобы минимизировать изменения в Вашем коде, сам бы я писал совсем по-другому." Можно както пояснить (не текстом кода, а идеей)(учусь писать сам, но часто для изучения использую принципы "Бритвы Оккама"- использую для пробы готовые куски кода)
Хорошо, что разобрались. Идея-то простая - в любом цикле и при любой задержке спрашивать, а не пришло ли чего. так ведь?
Как бы я делал, я завтра расскажу, постараюсь не забыть.
Видимо забыл все таки...
А ведь, точно! Забыл!
Но, если ТС не напомнил, значит и не надо :)))))))))
Доброго времени суток! Буду очень благодарен за помощь!
У меня возникла аналогичная проблема: приходиться ждать завершения цикла для смены скорости этого же эффекта, только в моем случае управление происходит через com-порт.
Никак не могу понять как работает эта функция:
Вот код моего скетча:
На маленьких значениях "wait" цикл быстро завершается, но когда значение "wait" больше 10 приходиться ждать.
Не пойму как прерывать этот цикл. Вроде придумываю алгоритм - а он не работает.