Код проверки не работает в Arduino - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в Arduino. И я пытаюсь создать программу, которая получает ИК-коды от пульта телевизора, использует их в качестве 4-значного кода доступа, загорающегося светодиодом при нажатии каждой кнопки. А потом сравнивать код с жестко закодированным. В этом случае 1234. Я сделал функцию, чтобы убедиться, что введенное значение равно проходу. Если это так, зажгите зеленый светодиод, а в противном случае загорится красный. Однако, даже если я введу правильный код, загорается только красный светодиод. Вот весь мой код, так как я не уверен, какая его часть вызывает проблемы:

const int pass[4] = {1, 2, 3, 4};
int value[4] = {};
int digitNum = 0;
int input;


void loop() 
{
  value[digitNum] = input; //where input is a number between 0 and 9
  digitNum++;
  if(digitNum == 1){
    lightFirstLed(); 
  }
  else if(digitNum == 2){
    lightSecondLed();
  }
  else if(digitNum == 3){
    lightThirdLed();
  }
  else if(digitNum == 4){
    lightFourthLed();
    verify();
  }
}

void verify()
{
  bool falseCharacter = false;
  for(int i = 0; i <= 4; i++){
    if(value[i] != pass[i]){
      falseCharacter = true;
    }
  }
  if(!falseCharacter){
    lightGreenLed();
  }
  else{
    lightRedLed();
  }
}

Функции в виде света * На самом деле Led делает то, что должен. Я попытался изменить функцию проверки вокруг, в результате чего зеленый индикатор стал всегда светящимся. Я занимаюсь этим часами и начинаю чувствовать себя разрозненным.

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

Полный код и дизайн приведены по ссылке на симулятор Autodesk: https://www.tinkercad.com/things/0keqmlhVqNp-mighty-leelo/editel?tenant=circuits?sharecode=vVUD2_4774Lj4PYXh6doFcOqWUMY2URIfW8VXGxutRE= РЕДАКТИРОВАТЬ: теперь сброс не работает

1 Ответ

0 голосов
/ 29 октября 2018

Ваш for цикл в verify обращается за пределы массива:

const int pass[4] = {1, 2, 3, 4};
int value[4] = {};

for(int i = 0; i <= 4; i++){
    if(value[i] != pass[i]){
        falseCharacter = true;
    }
}

Измените i <= 4 на i < 4.Кроме того, когда falseCharacter установлен на true, break из цикла:

for(int i = 0; i < 4; i++)
{
    if(value[i] != pass[i])
    {
        falseCharacter = true;
        break;
    }
}

Обновление

Вам необходим оператор else вloop:

void loop(void)
{
    if(irrecv.decode(&results))
    {
        if (results.value == powBtn)
        {
            reset();
        }
        else if (results.value == zeroBtn)
        {
            input = 0;
        }
        else if (results.value == oneBtn)
        {
            input = 1;
        }
        else if (results.value == twoBtn)
        {
            input = 2;
        }
        else if (results.value == threeBtn)
        {
            input = 3;
        }
        else if (results.value == fourBtn)
        {
            input = 4;
        }
        else if (results.value == fiveBtn)
        {
            input = 5;
        }
        else if (results.value == sixBtn)
        {
            input = 6;
        }
        else if (results.value == sevenBtn)
        {
            input = 7;
        }
        else if (results.value == eightBtn)
        {
            input = 8;
        }
        else if (results.value == nineBtn)
        {
            input = 9;
        }
        else
        {
            return; /*** !!! Unrecognized Value !!! ***/
        }

        value[digitNum] = input;
        digitNum++;
        if(digitNum == 1)
        {
            digitalWrite(LED1, HIGH);
        }
        else if(digitNum == 2)
        {
            digitalWrite(LED2, HIGH);
        }
        else if(digitNum == 3)
        {
            digitalWrite(LED3, HIGH);
        }
        else if(digitNum == 4)
        {
            digitalWrite(LED4, HIGH);
            verify();
        }
        else
        {
            if (results.value == powBtn)
            {
                reset();
            }
        }

        // Receive the next value
        irrecv.resume();
    }
}
...