Arduino方法只返回0

Arduino方法只返回0,arduino,Arduino,我已经写了一个简单的方法,它应该生成一个5位数的密码,只包含数字:1、2、3、4(例如:42132) 为了做到这一点,我使用了带有4个按钮的ESP32。每个按钮代表一个数字 但当我测试我的方法时,它只返回“00000”。问题是:该方法没有等待我按下按钮,它会立即返回0。到现在为止,我已经改变了方法x次,我只是不明白为什么它只返回00000次,而不等待我按下按钮 我已经尝试在方法中使用for循环,但是结果是一样的。它返回“00000”,因为该方法没有等待我按下按钮 我的代码: 字符串pcode=”

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

但当我测试我的方法时,它只返回“00000”。问题是:该方法没有等待我按下按钮,它会立即返回0。到现在为止,我已经改变了方法x次,我只是不明白为什么它只返回00000次,而不等待我按下按钮

我已经尝试在方法中使用for循环,但是结果是一样的。它返回“00000”,因为该方法没有等待我按下按钮

我的代码:

字符串pcode=”“;
int-buttonid;
void循环(){
对于(int j=0;j<5;){
pcode=pcode+passcode();
j++;
}
如果(pcode.length()=5){
Serial.println(pcode);
}
}
静态int密码(){
ButtonStated=数字读取(红色按钮);
按钮状态蓝色=数字读取(蓝色按钮);
buttonStateYELLOW=数字读取(黄色按钮);
buttonStateGREEN=数字读取(绿色按钮);
如果(按钮状态==高)
{
buttonid=1;
}
否则如果(按钮状态蓝色==高)
{
buttonid=2;
}
否则如果(按钮状态黄色==高)
{
buttonid=3;
}
否则如果(按钮状态绿色==高)
{
buttonid=4;
}
返回按钮;
}
我需要的是,该方法等待我按下5个按钮(即按钮3、按钮2、按钮3、按钮1、按钮4-->密码=32314)。

尝试此修改

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循环中添加一个延迟组件。

您需要一个中断功能!现在您可能会问什么是中断函数?这正是您需要的,此函数仅在满足某个语句时触发

如何使用它?在代码中设置“insertwhilepressed”函数,将中断函数放在循环函数上,程序将循环运行,直到有人按下任何键为止

你为什么要这么做?在代码中,您只是在循环内部运行For,这意味着没有触发器来告诉代码何时应该开始获取所需的信息。另一个解决方案是在for之前加一个IF,但是你必须处理称为涟漪效应的时间问题,所以对你来说最好的解决方案肯定是一个中断函数

那么功能是什么呢


想了解更多关于中断的信息吗

您的代码存在多个问题:

  • 您从未编写过任何等待按钮按下的代码
  • 如果未按下按钮,则返回最后按下的按钮
  • 单个按钮按下将注册为多个按钮按下
  • 您还将无限期地连接到
    pcode
    ,这会导致它内存不足并崩溃
  • 要解决此问题,您需要:

  • 使
    passcode()
    在未按下按钮时返回一些值
  • 忽略无效的按钮按下,或者如果它与上一个按钮相同(不要将其添加到
    pcode
  • 当您获得代码的5个字符并且不再需要它时,清空
    pcode
    字符串
  • 字符串pcode=”“;
    int last_key=-1;
    void循环(){
    int key=passcode();
    if(key!=-1&&last_key!=key)//如果按钮被实际按下
    pcode=pcode+key;//将key添加到代码中
    }
    最后一个键=键;
    如果(pcode.length()=5){
    Serial.println(pcode);
    pcode=”“;//重置字符串
    }
    }
    静态整数密码(){
    如果(数字读取(红色按钮)=高)
    返回1;
    if(数字读取(蓝色按钮)=高)
    返回2;
    如果(数字读取(黄色按钮)=高)
    返回3;
    如果(数字读取(绿色按钮)=高)
    返回4;
    return-1;//未按下任何按钮
    }
    

    代码可能还需要一些。

    另外,请记住使用下降模式,因为您使用的是按钮,而且我假设它们接地良好,只有在按下并释放按钮后,中断中的下降模式才会运行!很抱歉,我没有退出,明白:/在我的设置中,我写了:attachInterrupt(数字插拔中断(红色按钮),密码,下降);附件中断(数字插针中断(蓝色按钮)、密码、下降);附件中断(数字插针中断(黄色按钮)、密码、下降);附件中断(数字插针中断(绿色按钮)、密码、下降);,现在它向我抛出了一个错误:从'int()()'到'void()()'[-fppermissive]的转换无效,没有延迟,当我按1x 3时它只执行例如“33333”。由于延迟,用户必须完全计时输入:/所以我认为这不是一个完美的解决方案