我编写了一个简单的方法,该方法应该生成一个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)。
答案 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)
您的代码有多个问题:
passcode()
,则仅返回上一次按下的按钮。pcode
,这将导致它用尽内存并崩溃。要解决此问题,您需要:
passcode()
返回一些值。pcode
)。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。