Метод Arduino возвращает только 0 - PullRequest
0 голосов
/ 26 декабря 2018

Я написал простой метод, который должен генерировать 5-значный пароль, только с цифрами: 1, 2, 3, 4 (например: 42132)
Для этого я использую ESP32с 4 кнопками.Каждая кнопка представляет собой цифру.

Но когда я проверяю свой метод, она просто возвращает «00000».Проблема: метод не ждет, когда я нажму кнопку, он мгновенно возвращает 0. И я уже изменил метод x раз, и я просто не могу понять, почему он возвращает только 00000, не дожидаясь, пока я нажмуКнопки.

Я уже пытался использовать цикл for в методе, но результат был тот же.Он вернул '00000', так как метод не ждал, когда я нажму кнопки.

Мой код:

String pcode="";
int buttonid;

void loop() {

  for(int j=0; j< 5;) {

    pcode = pcode + passcode();
    j++;
  }

  if(pcode.length() == 5){

  Serial.println(pcode);

  }

}

static int passcode(){  

    buttonStateRED=digitalRead(redButton);

    buttonStateBLUE=digitalRead(blueButton);

    buttonStateYELLOW=digitalRead(yellowButton);

    buttonStateGREEN=digitalRead(greenButton);

    if(buttonStateRED == HIGH)
    {
      buttonid=1;
    }
    else if(buttonStateBLUE == HIGH)
    {
      buttonid=2;
    }
    else if(buttonStateYELLOW == HIGH)
    {
      buttonid=3;
    }
    else if(buttonStateGREEN == HIGH)
    {
      buttonid=4;
    }
  return buttonid;
}

Что мне нужно, так это то, что метод ждет, пока я нажму 5кнопки (например, кнопка 3, кнопка 2, кнопка 3, кнопка 1, кнопка 4 -> пароль = 32314).

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Вам нужна функция прерывания!Теперь, что за функция прерывания вы можете спросить?Это именно то, что вам нужно, эта функция срабатывает только в том случае, если выполнено какое-то утверждение!

Как его использовать?установите функцию «insert whilepressed» в своем коде, поместите функцию прерывания в вашу функцию цикла, программа будет работать по кругу, пока кто-нибудь не нажмет.

Почему вы должны это сделать?ну, в вашем коде вы просто запускаете цикл For внутри цикла, что означает, что нет триггера, который бы сообщал вашему коду, когда он должен начать получать информацию, которая ему нужна.Другим решением было бы поставить IF перед формой for, но вам придется иметь дело с проблемой времени, называемой волновым эффектом, поэтому лучшим решением для вас, безусловно, является функция прерывания.

Так что за функция? Это прямо здесь

Хотите узнать больше о перерывах? Существует видео, которое может вам помочь

0 голосов
/ 26 декабря 2018

Есть несколько проблем с вашим кодом:

  1. Вы никогда не писали код, который бы ожидал нажатия кнопки.
  2. Если кнопка не была нажата passcode(), простовозвращает последнюю нажатую кнопку.
  3. Однократное нажатие кнопки регистрируется как несколько нажатий кнопки.
  4. Вы также бесконечно сцепляетесь с pcode, что приводит к исчерпанию памяти и падению.

Чтобы исправить это, вам необходимо:

  1. Сделать passcode() вернуть некоторое значение, когда кнопка не была нажата.
  2. Игнорировать недействительную кнопку нажмитеили если он такой же, как последний (не добавляйте его к pcode).
  3. Когда вы получите 5 символов для кода и вам больше не нужны, очистите строку pcode.
String pcode = "";
int last_key = -1;

void loop() {
    int key = passcode();
    if (key != -1 && last_key != key) // if the button  was actually pressed
        pcode = pcode + key; // add key to code
    }
    last_key = key;

    if(pcode.length() == 5){
        Serial.println(pcode);
        pcode = ""; // reset the string
    }
}

static int passcode() {
    if (digitalRead(redButton) == HIGH)
        return 1;
    if (digitalRead(blueButton) == HIGH)
        return 2;
    if (digitalRead(yellowButton) == HIGH)
        return 3;
    if (digitalRead(greenButton) == HIGH)
        return 4;
    return -1; // no button was pressed
}

Код, вероятно, также нуждается в некотором debouncing .

0 голосов
/ 26 декабря 2018

Попробуйте эту модификацию,

int passcode(){

   buttonStateRED = LOW;
   buttonStateBLUE = LOW;
   buttonStateYELLOW = LOW;
   buttonStateGREEN = LOW;

   do {

           buttonStateRED=digitalRead(redButton);
           buttonStateBLUE=digitalRead(blueButton);
           buttonStateYELLOW=digitalRead(yellowButton);
           buttonStateGREEN=digitalRead(greenButton);

       }while(buttonStateRED != HIGH && buttonStateBLUE != HIGH && buttonStateYELLOW != HIGH && buttonStateGREEN != HIGH);

    if(buttonStateRED == HIGH)
    {
      buttonid=1;
    }
    else if(buttonStateBLUE == HIGH)
    {
      buttonid=2;
    }
    else if(buttonStateYELLOW == HIGH)
    {
      buttonid=3;
    }
    else if(buttonStateGREEN == HIGH)
    {
      buttonid=4;
    }

    return buttonid;
}

Нажмите на все кнопки, а также добавьте компонент задержки внутри цикла for, который вызывает метод пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...