Arduino方法仅返回0

时间:2018-12-26 01:16:16

标签: arduino

我编写了一个简单的方法,该方法应该生成一个5位数的密码,只包含数字:1、2、3、4(例如:42132)
为此,我使用带有4个按钮的ESP32。每个按钮代表一个数字。

但是当我测试我的方法时,它只返回'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 :(得分:0)

尝试此修改,

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循环内添加一个延迟组件,该组件调用密码方法。

答案 1 :(得分:0)

您需要一个中断功能!现在您可能会问什么是中断功能?正是您所需要的,该函数仅在满足某些条件时才触发!

如何使用?在代码中设置“ insertwhilepressed”功能,将中断功能放在循环功能上,直到有人按下任何按钮,程序都会循环运行。

为什么要这么做?好吧,在您的代码中,您仅在循环内部运行了For,这意味着没有触发器可以告诉您的代码何时应该开始获取所需的信息。另一个解决方案是将IF放在for之前,但您必须处理称为波纹效应的时间问题,因此,最适合您的解决方案肯定是中断函数。

那么功能是什么? This one right here

想了解更多有关打扰的信息吗? There is a video that might help you

答案 2 :(得分:0)

您的代码有多个问题:

  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