hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..

Как зациклить выполнение функции, пока не нажата другая кнопка на пульте?

Доброй ночи. Делаю полицейскую мигалку на arduino. Все подключил, набросал простенький код:
Код

#include <IRremoteInt.h>
#include <IRremote.h>
#include <boarddefs.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

IRrecv irrecv(4);
int ledGreen1 = 2;
int ledRed1 = 3;
int w = 50;

decode_results results;

void setup() {

  irrecv.enableIRIn();
  pinMode(ledGreen1,OUTPUT);
  pinMode(ledRed1,OUTPUT);
}

void loop() {
//  digitalWrite(led,HIGH);
//  delay(100);
//  digitalWrite(led,LOW);
//  delay(100);

   //modeBlinkRed();

   if(irrecv.decode(&results))
   {
    switch(results.value)
    {
      case 0xFFB24D:
        modeBlinkRed();
        break;
      case 0xFF6897:
        modeBlinkGreen();
        break;
      case 0xFF2AD5:
        modeBlinkAll();
        break;
    }
    irrecv.resume();
   }

}

void modeBlinkGreen()
{
    for(int i=0;i<6;i++)
  {
    blinkGreen();
  }
  delay(1000);
}

void modeBlinkRed()
{
  for(int i=0;i<6;i++)
  {
    blinkRed();
  }
  delay(1000); 
}

void modeBlinkAll()
{
  for(int i=0;i<5;i++)
  {
    blinkGreen();
  }
  for (int i=0;i<5;i++)
  {
    blinkRed();
  } 
}


void blinkGreen()
{
  digitalWrite(ledGreen1,HIGH);
  delay(w);
  digitalWrite(ledGreen1,LOW);
  delay(w);
  
}

void blinkRed()
{
  digitalWrite(ledRed1,HIGH);
  delay(w);
  digitalWrite(ledRed1,LOW);
  delay(w); 
}


Столкнулся с такой проблемой здесь:
void loop() {
   if(irrecv.decode(&results))
   {
    switch(results.value)
    {
      case 0xFFB24D:
        modeBlinkRed();
        break;
      case 0xFF6897:
        modeBlinkGreen();
        break;
      case 0xFF2AD5:
        modeBlinkAll();
        break;
    }
    irrecv.resume();
   }
}

Если я нажимаю первую кнопку, выполняется функция modeBlinkRed(), вторую - modeBlinkGreen(), третью - modeBlinkAll(). Проблема в том, что функция выполняется только один раз, а мне нужно, что-бы функция выполнялась в цикле, пока не будет нажата другая кнопка на пульте( то есть не будет выбран другой режим).
Догадываюсь, что здесь решение простое, но в голове что-то ничего не приходит, поздно наверное уже)

PS: На переменную w не обращайте внимание, это что-бы быстро настроить частоту мигания.
PS2: Знаю что в полицейских синие, или синие и красные мигалки, просто синего светодиода под рукой не было)
  • Вопрос задан
  • 623 просмотра
Решения вопроса 1
PavelK
@PavelK
Доброй ночи.
Запоминайте состояние в глобальной переменной.
int mode = 0xFF2AD5;
void loop() {

    if(irrecv.decode(&results)) { //-- Обработку нажатия лучше вообще вынести в прерывание и не использовать delay()
      mode =  results.value;
      irrecv.resume();
    }

    switch(mode) {
      case 0xFFB24D: modeBlinkRed(); break;
      case 0xFF6897: modeBlinkGreen(); break;
      case 0xFF2AD5:  modeBlinkAll();  break;
    }      
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
не буду отвечать из-за модератора
Есть отличный язык - граф состояний. Советую посмотреть одну из реализаций на Матлабе - Управляющая логика (StateFlow). On-line курс (надо устанавливать MatLab, Simulink и StateFlow).
Затем можно получить код для Ардуино.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы