arduino - 在 Arduino 中使用 for 循环锁定用户
问题描述
我在使用数字密码锁项目的代码时遇到问题。我设法让它大部分工作,但有一个部分让我感到困惑。有一组 6 个开关、2 个按钮、一个绿色 LED 和一个红色 LED。开关可以按任何顺序打开或关闭。使用第一个按钮(使用引脚 8)设置订单后,它将存储为一系列 6 个变量。这部分工作正常。
下一部分是检查每个变量是否等于其对应的开关,当按下第二个按钮(引脚 12)时。如果全部是,则绿色 LED 亮起。否则,用户再尝试 2 次。如果用户输入错误的开关系列 3 次,则它们将被锁定 10 秒。这是我无法正确使用 for 循环的地方。我正在使用 Tinkercad 的块编码系统,但我不知道如何关闭循环。到目前为止,这是整个代码:
int switch0 = 0;
int switch1 = 0;
int switch2 = 0;
int switch3 = 0;
int switch4 = 0;
int switch5 = 0;
int switchChecker = 0;
int i = 0;
void setup()
{
pinMode(8, INPUT);
pinMode(A5, INPUT);
Serial.begin(9600);
pinMode(A4, INPUT);
pinMode(A3, INPUT);
pinMode(A2, INPUT);
pinMode(A1, INPUT);
pinMode(A0, INPUT);
pinMode(12, INPUT);
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
}
void loop()
{
// this records the values of all 6 switches on 1st
// button press
if (digitalRead(8) == HIGH) {
switch0 = digitalRead(A5);
Serial.println(switch0);
switch1 = digitalRead(A4);
Serial.println(switch1);
switch2 = digitalRead(A3);
Serial.println(switch2);
switch3 = digitalRead(A2);
Serial.println(switch3);
switch4 = digitalRead(A1);
Serial.println(switch4);
switch5 = digitalRead(A0);
Serial.println(switch5);
}
// when the 2nd button is pressed, a for loop is
// started to check if the switches are the same
// order
if (digitalRead(12) == HIGH) {
for (i = 1; i <= 3; i += 1) {
if (digitalRead(A5) == switch0 && (digitalRead(A4) == switch1 && (digitalRead(A3) == switch2 && (digitalRead(A2) == switch3 && (digitalRead(A1) == switch4 && digitalRead(A0) == switch5))))) {
i = 3;
}
}
}
// if the conditions are met, the for loop closes
// and the green LED turns on
if (i == 3) {
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
} else {
delay(10000); // Wait for 10000 millisecond(s)
}
}
最后,如果我想让用户在初始锁定后 3 次错误尝试后被锁定,并将延迟设置为一定的时间,我该怎么做呢?
解决方案
您可以创建一个计算错误尝试次数的全局变量,而不是 for 循环。然后,如果它等于 3,则调用延迟:
char wrongAttemps = 0;
void loop()
{
// this records the values of all 6 switches on 1st
// button press
if (digitalRead(8) == HIGH) {
switch0 = digitalRead(A5);
Serial.println(switch0);
switch1 = digitalRead(A4);
Serial.println(switch1);
switch2 = digitalRead(A3);
Serial.println(switch2);
switch3 = digitalRead(A2);
Serial.println(switch3);
switch4 = digitalRead(A1);
Serial.println(switch4);
switch5 = digitalRead(A0);
Serial.println(switch5);
}
// when the 2nd button is pressed,
// check if the switches are the same order
if (digitalRead(12) == HIGH) {
if (digitalRead(A5) == switch0 && digitalRead(A4) == switch1
&& digitalRead(A3) == switch2 && digitalRead(A2) == switch3
&& (digitalRead(A1) == switch4 && digitalRead(A0) == switch5
) {
// right combination
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
} else {
// wrong combination
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
wrongAttemps++;
if (wrongAttemps == 3) {
delay(10000);
wrongAttemps = 0; // reset attemps
}
}
}
}
推荐阅读
- javascript - 输入起始日期时更改起始日期
- javascript - Facebook Messenger 机器人问题
- mysql - 插入多列表 laravel
- javascript - 在firestore时间戳上对对象javascript / typescript数组进行排序
- python - ModuleNotFoundError:“没有名为‘pymongo’的模块
- testing - 如何加载测试Alexa的技能
- php - 检查PHP字符串是否包含操作字符
- ruby-on-rails-5 - 如何使用活动存储将图像上传字段添加到 active_admin
- ruby-on-rails - 在 Rails API for React 中从外部表中查询数据的最佳实践
- php - 如何隐藏html元素?