Странные вещи с Switch Case Arduino - PullRequest
0 голосов
/ 12 ноября 2019

Ну, я знаю, это звучит довольно странно, но я сделал код в Arduino, который работает, когда я просто использую оператор if для каждого параметра. Но это то, для чего нужны переключатели, поэтому я попробовал это, и по какой-то странной причине он входит и выполняет код для standbyStatus==0 и для standbyStatus==1, но для standbyStatus==2 или default ничего не выполняется вообще. Обратите внимание, что переменная standbyStatus установлена ​​на 2 с помощью кода для статуса 1. Я могу проверить это на последовательном мониторе, но тест Serial.print("case 2.1"); в коде 2 не появляется. Только END of standbymanager. Опять же, когда я использую if, все работает как надо. Сначала код с if, а затем тот же код, что и в случае переключения:

Кроме того, этот метод вызывается снова и снова. Это мой цикл.

void loop() 
{
  t= millis();
  newAudio();
  calcAudioScale();
  if(standbyStatus==0){changeLEDs();}
  standbymanager();
}

Этот метод в основном проверяет, есть ли какой-то звук для 40 мс или sth, и если нет, он изменится на standbyStatus One, который плавно уменьшаетсяиз светодиодов, которые будут прерваны, если есть звук, но если нет, он изменится на standbyStatus Two, который является просто постоянным светом и проверяет каждую секунду, есть ли звук. Если это так, он изменится на ноль stabdbyStatus.

Код # 1 «ЕСЛИ»:

void standbymanager()
{          
  if(standbyStatus==0)
  {
            Serial.print(" ");
            Serial.print("case0");
            if(audio[standbyTrigger]<0)
            {
              idleCounter++;
            }
            if(idleCounter>40)
            {
              standbyStatus = 1;
            }
  }

    if(standbyStatus==1)
  {
            Serial.print(" ");
            Serial.print("case1");
            idleCounter = 0;
            float power = 0;
            for(int i=0; i<100; i++)
            {
              if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  return;
                }
              power = i/100;
              analogWrite(red, 255 - r*power);
              analogWrite(green, 255 - g*power);
              analogWrite(blue, 255 - b*power);
              delay(20); 
            }
            standbyStatus = 2;
            return;
  }

    if(standbyStatus==2)
  {
            Serial.print(" ");
            Serial.print("case 2.1");
            if(audio[standbyTrigger]>10)
                {
                  standbyStatus = 0;
                  return;
                }
            analogWrite(red, 255 - r);
            analogWrite(green, 255 - g);
            analogWrite(blue, 255 - b);
            Serial.print(" ");
            Serial.print("case2.2");
            delay(1000);
           return;
  }
  Serial.print(" ");
            Serial.print("END of StandbyManager");
}

Код # 2 «Случай переключения»

void standbymanager()
{          
  switch(standbyStatus)
  {
    case 0:
            Serial.print(" ");
            Serial.print("case0");
            if(audio[standbyTrigger]<0)
            {
              idleCounter++;
            }
            if(idleCounter>40)
            {
              standbyStatus = 1;
            }
            break;

    case 1:
            Serial.print(" ");
            Serial.print("case1");
            idleCounter = 0;
            float power = 0;
            for(int i=0; i<100; i++)
            {
              if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  break;
                }
              power = i/100;
              analogWrite(red, 255 - r*power);
              analogWrite(green, 255 - g*power);
              analogWrite(blue, 255 - b*power);
              delay(20); 
            }
            standbyStatus = 2;
            break;

    case 2:
            Serial.print(" ");
            Serial.print("case 2.1");
            if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  break;
                }
            analogWrite(red, 255 - r);
            analogWrite(green, 255 - g);
            analogWrite(blue, 255 - b);
            Serial.print(" ");
            Serial.print("case2.2");
            delay(1000);
            break;

    default:
            standbyStatus=0;
            Serial.print(" ");
            Serial.print("default");
            delay(1000); 
            break;
  }
  Serial.print(" ");
            Serial.print("END of StandbyManager");
}

1 Ответ

0 голосов
/ 12 ноября 2019

Я полагаю, что ошибки происходят из case 1:

  • переменные не могут быть объявлены внутри case оператора
  • break внутри forне нарушайте оператор switch

Вы можете изменить его на:

case 1: 
{
        Serial.print(" ");
        Serial.print("case1");
        idleCounter = 0;
        float power = 0;
        bool flag = false;
        for(int i=0; i<100; i++)
        {
          if(audio[standbyTrigger]>0)
            {
              standbyStatus = 0;
              flag = true;
              break;
            }
          power = i/100;
          analogWrite(red, 255 - r*power);
          analogWrite(green, 255 - g*power);
          analogWrite(blue, 255 - b*power);
          delay(20); 
        }
        if (flag == false) {
           standbyStatus = 2;
        }
        break;
}
...