Цикл с использованием IRremote и как из него выйти
- Войдите на сайт для отправки комментариев
Вечер в хату, господа!
Есть два ̶с̶т̶у̶л̶а̶ сервопривода на кронштейне, есть ИК-приемник и пульт (еще есть лазер, но для сути дела он не важен). Я написал небольшой скетч, для управления сервомоторами с помощью нескольких кнопок пульта (шаг в нужную сторону, возврат к исходному положению итд).
Нужно сделать, чтобы при нажатии на кнопку запускался цикл, в котором будет происходить различный «Адъ и Израиль» но, при нажатии любой другой кнопки все это дело должно было выходить из цикла.
Проблема состоит в том, что при запущеном цикле, ну никак не получается считать значение с применика и использовать его для прерывания цикла. Функция irrecv.resume(); не работает, либо (что вероятнее) ничего не возвращает (по крайней мере в нужное место). Вот кусочек моего г*внокода в части void.loop, для примера:
if (irrecv.decode(&results)) { switch (results.value) { case 0xFFA25D: // Эта часть про лазер она нам не нужна, просто как пример LED_ON = !LED_ON; if (LED_ON) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } break; case 0xFF02FD: //кнопка "влево" servo1.write(pos1-step); break; case 0xFF9867: //кнопка "вправо" servo1.write(pos1+step); break; case 0xFFE01F: //кнопка "вверх" servo2.write(pos2+step); break; case 0xFF906F: //кнопка "вниз" servo2.write(pos2-step); break; case 0xFF6897: //вот эта кнопка должна запускать цикл while (results.value == 0xFF6897){ irrecv.resume(); delay (2000); servo1.write(120); servo2.write(110); delay (1000); servo1.write(120); servo2.write(91); }
Пожалуйста, укажите мне на мой фейл в коде или подскажите способ решения (если он вообще существует).
ну, и как можно узнать, что нажата какая-то кнопка, если ты в цикле?
ну, и как можно узнать, что нажата какая-то кнопка, если ты в цикле?
Прерывания в массы?
В цикле 27-32 никто не меняет значение results. А что нужно сделать, чтобы считать код и вставить этот код перед строкой 32, например? Намекаю, строка 01. Причем не просто вставить строку, но и дождаться нажатия кода, иначе из цикла сразу выпадет, потому что resume сбрасывает значения предыдущего полученного кода.
Если же нужно, чтобы "цикл" постоянно крутился, тогда нужно организовать 24-32 по-другому, без использования в условии results.value, а флаг, который срасывается, если принят ИК код не тот, что нужно.
Прерывания в массы?
кнопку "Reset".
*да, уж - лепим делеи, загоняем их в цикл и, что бы эту обезумевшую курицу с отрубленной головой остановить, давим её трактором прерывания.
В цикле 27-32 никто не меняет значение results. А что нужно сделать, чтобы считать код и вставить этот код перед строкой 32, например? Намекаю, строка 01. Причем не просто вставить строку, но и дождаться нажатия кода, иначе из цикла сразу выпадет, потому что resume сбрасывает значения предыдущего полученного кода.
Уже пробовал использовать irrecv.decode(&results), но получается как то громоздко да еще и цикл прерывается. Потом прочитал Ваш комментарий и узнал, что это resume, оказывается, сбрасывает значения. Большое спасибо, не знал этой особенности!
Если же нужно, чтобы "цикл" постоянно крутился, тогда нужно организовать 24-32 по-другому, без использования в условии results.value, а флаг, который срасывается, если принят ИК код не тот, что нужно.
Вот это кстати интересная идея, только надо придумать как ее реализовать.
Rebel28 Вот я и пытался передать идею, чтобы что то ты сделал своими руками, так интересней, нежели тебе дадут готовое решение ;)
А реализовать достаточно просто, снаружи цикла устанавливается флаг. Цикл, пока флга установлен повторяется бесконечно. Внутри цикла, только если принят ИК код и он не совпадает с нужным, делаем выход из цикла или сбрасываем флаг. А уж внутри цикла делам что угодно. resume делаем только если принят ИК код, иначе не сбрасываем, а то будет плохо.
Текст метода resume можно найтив файле ieRecv.cpp в библиотеке. Да, я наврал, value там не сбрасывается, sorry. И всё равно, лучше его не использовать (я про value).
Удачи!
kisoft, готовых решений мы не ищем, так не интересно)
Кстати, value не совсем сбрасывается, он передает значение 0xFFFFFFFF, как при нажатии и удержании кнопки, к примеру. Я тогда думал, что оно остается неизменным, и все время ориентировался на value != значение_нажатой_кнопки, а оно, оказывается, после первой итерации цикла менялось на "0xFFFFFFFF".