Цикл с использованием IRremote и как из него выйти

Rebel28
Offline
Зарегистрирован: 23.08.2016

Вечер в хату, господа! 

Есть два ̶с̶т̶у̶л̶а̶ сервопривода на кронштейне, есть ИК-приемник и пульт (еще есть лазер, но для сути дела он не важен). Я написал небольшой скетч, для управления сервомоторами с помощью нескольких кнопок пульта (шаг в нужную сторону, возврат к исходному положению итд). 

Нужно сделать, чтобы при нажатии на кнопку запускался цикл, в котором будет происходить различный «Адъ и Израиль» но, при нажатии любой другой кнопки все это дело должно было выходить из цикла. 

Проблема состоит в том, что при запущеном цикле, ну никак не получается считать значение с применика и использовать его для прерывания цикла. Функция 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); 
        }

Пожалуйста, укажите мне на мой фейл в коде или подскажите способ решения (если он вообще существует).

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ну, и как можно узнать, что нажата какая-то кнопка, если ты в цикле?

Lictor
Offline
Зарегистрирован: 01.10.2015

Клапауций 232 пишет:

ну, и как можно узнать, что нажата какая-то кнопка, если ты в цикле?

 

Прерывания в массы?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В цикле 27-32 никто не меняет значение results. А что нужно сделать, чтобы считать код и вставить этот код перед строкой 32, например? Намекаю, строка 01. Причем не просто вставить строку, но и дождаться нажатия кода, иначе из цикла сразу выпадет, потому что resume сбрасывает значения предыдущего полученного кода.

Если же нужно, чтобы "цикл" постоянно крутился, тогда нужно организовать 24-32 по-другому, без использования в условии results.value, а флаг, который срасывается, если принят ИК код не тот, что нужно.

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lictor пишет:

Прерывания в массы?

кнопку "Reset".

*да, уж - лепим делеи, загоняем их в цикл и, что бы эту обезумевшую курицу с отрубленной головой остановить, давим её трактором прерывания.

Rebel28
Offline
Зарегистрирован: 23.08.2016

kisoft пишет:

В цикле 27-32 никто не меняет значение results. А что нужно сделать, чтобы считать код и вставить этот код перед строкой 32, например? Намекаю, строка 01. Причем не просто вставить строку, но и дождаться нажатия кода, иначе из цикла сразу выпадет, потому что resume сбрасывает значения предыдущего полученного кода.

Уже пробовал использовать irrecv.decode(&results), но получается как то громоздко да еще и цикл прерывается. Потом прочитал Ваш комментарий и узнал, что это resume, оказывается, сбрасывает значения. Большое спасибо, не знал этой особенности!

kisoft пишет:

Если же нужно, чтобы "цикл" постоянно крутился, тогда нужно организовать 24-32 по-другому, без использования в условии results.value, а флаг, который срасывается, если принят ИК код не тот, что нужно.

Вот это кстати интересная идея, только надо придумать как ее реализовать.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Rebel28 Вот я и пытался передать идею, чтобы что то ты сделал своими руками, так интересней, нежели тебе дадут готовое решение ;)

А реализовать достаточно просто, снаружи цикла устанавливается флаг. Цикл, пока флга установлен повторяется бесконечно. Внутри цикла, только если принят ИК код и он не совпадает с нужным, делаем выход из цикла или сбрасываем флаг. А уж внутри цикла делам что угодно. resume делаем только если принят ИК код, иначе не сбрасываем, а то будет плохо.

Текст метода resume можно  найтив файле ieRecv.cpp в библиотеке. Да, я наврал, value там не сбрасывается, sorry. И всё равно, лучше его не использовать (я про value).

Удачи!

Rebel28
Offline
Зарегистрирован: 23.08.2016

kisoft, готовых решений мы не ищем, так не интересно) 

Кстати, value не совсем сбрасывается, он передает значение 0xFFFFFFFF, как при нажатии и удержании кнопки, к примеру. Я тогда думал, что оно остается неизменным, и все время ориентировался на value != значение_нажатой_кнопки, а оно, оказывается, после первой итерации цикла менялось на "0xFFFFFFFF".