未到达案例陈述的所有分支
Not reaching all branches of a case statement
我的项目是一个使用 RF 密钥卡的固定螺栓。它检查是否按下解锁或锁定按钮,还检查锁是否已锁定。我对各种选择使用案例陈述。我认为由于某种原因锁定状态没有改变,因为我只收到案例 2 和案例 4。
我将输出动作淡化为每种情况下的指示灯闪烁(情况 1 闪烁一次,情况 2 闪烁两次,依此类推)
每个 case 执行后都会改变布尔锁状态(locked = true)
代码
/*
This code will open a deadbolt
with RF remote or buttons and
knows the position of the lock
based on last action
12 RF/Button lock
13 RF/Button unlock
10 button lock
11 button unlock
8 Buzzer
9 Servo
A0 Servo location
4 LED lock
5 LED unlock
*/
const int lockrf = 12; //input to lock rf
const int ulockrf = 13; //input to unlock rf
const int butlock = 10; // button lock
const int butulock = 11; // button unlock
const int ulockled = 4; //led in lock button
const int lockled = 2; //led in ulock button
#include <Servo.h>
boolean lockstate = true;
void setup()
{
Servo deadbolt;
deadbolt.attach(9);
pinMode(butlock,INPUT);
pinMode(butulock,INPUT);
pinMode(ulockrf,INPUT);
pinMode(lockrf,INPUT);
pinMode(ulockled,OUTPUT);
pinMode(lockled,OUTPUT);
}
void loop()
{
//variables for code
int lockdeg = 0;
int ulockdeg = 90;
int lock_case = 0;
digitalWrite(ulockled,LOW);
digitalWrite(lockled,LOW);
if (digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH && lockstate == true ) // locked press lock
{
lock_case=1;
}
if (digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH && lockstate == false) // ulocked press lock
{
lock_case=2;
}
if (digitalRead(ulockrf)==HIGH || digitalRead(butulock)==HIGH && lockstate == true) // locked press ulock
{
lock_case=3;
}
if (digitalRead(ulockrf)==HIGH || digitalRead(butulock)==HIGH && lockstate == false) // ulocked press ulock
{
lock_case=4;
}
switch(lock_case)
{
case 1:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(10);
lockstate=true;
break;
}
case 2:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
lockstate=true;
break;
}
case 3:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
lockstate=false;
break;
}
case 4:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(ulockled,LOW);
delay(10);
lockstate=false;
break;
}
}
}
您的问题是运算符优先级。 Arduino 遵循 C 语言优先级,其中 && 在 || 之前计算。例如,这意味着您的第一个 if 语句被评估为好像您有这样的括号:
digitalRead(lockrf)==HIGH ||
(digitalRead(butlock)==HIGH && lockstate == true)
这里发生的事情是,如果lockrf为高,前两个if语句的both都为真,所以你先将lock_case设置为1,然后设置为2 . 当 ulockrf 很高时,您会得到类似的效果。这就是为什么您只得到案例 2 和案例 4 的原因。
要解决此问题,请添加括号以消除歧义:
if ((digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH)
&& lockstate == true )
如果有任何疑问,良好的编程习惯建议使用括号。
我的项目是一个使用 RF 密钥卡的固定螺栓。它检查是否按下解锁或锁定按钮,还检查锁是否已锁定。我对各种选择使用案例陈述。我认为由于某种原因锁定状态没有改变,因为我只收到案例 2 和案例 4。
我将输出动作淡化为每种情况下的指示灯闪烁(情况 1 闪烁一次,情况 2 闪烁两次,依此类推)
每个 case 执行后都会改变布尔锁状态(locked = true)
代码
/*
This code will open a deadbolt
with RF remote or buttons and
knows the position of the lock
based on last action
12 RF/Button lock
13 RF/Button unlock
10 button lock
11 button unlock
8 Buzzer
9 Servo
A0 Servo location
4 LED lock
5 LED unlock
*/
const int lockrf = 12; //input to lock rf
const int ulockrf = 13; //input to unlock rf
const int butlock = 10; // button lock
const int butulock = 11; // button unlock
const int ulockled = 4; //led in lock button
const int lockled = 2; //led in ulock button
#include <Servo.h>
boolean lockstate = true;
void setup()
{
Servo deadbolt;
deadbolt.attach(9);
pinMode(butlock,INPUT);
pinMode(butulock,INPUT);
pinMode(ulockrf,INPUT);
pinMode(lockrf,INPUT);
pinMode(ulockled,OUTPUT);
pinMode(lockled,OUTPUT);
}
void loop()
{
//variables for code
int lockdeg = 0;
int ulockdeg = 90;
int lock_case = 0;
digitalWrite(ulockled,LOW);
digitalWrite(lockled,LOW);
if (digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH && lockstate == true ) // locked press lock
{
lock_case=1;
}
if (digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH && lockstate == false) // ulocked press lock
{
lock_case=2;
}
if (digitalRead(ulockrf)==HIGH || digitalRead(butulock)==HIGH && lockstate == true) // locked press ulock
{
lock_case=3;
}
if (digitalRead(ulockrf)==HIGH || digitalRead(butulock)==HIGH && lockstate == false) // ulocked press ulock
{
lock_case=4;
}
switch(lock_case)
{
case 1:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(10);
lockstate=true;
break;
}
case 2:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
lockstate=true;
break;
}
case 3:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
lockstate=false;
break;
}
case 4:
{
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(lockled,LOW);
delay(500);
digitalWrite(lockled,HIGH);
delay(500);
digitalWrite(ulockled,LOW);
delay(10);
lockstate=false;
break;
}
}
}
您的问题是运算符优先级。 Arduino 遵循 C 语言优先级,其中 && 在 || 之前计算。例如,这意味着您的第一个 if 语句被评估为好像您有这样的括号:
digitalRead(lockrf)==HIGH ||
(digitalRead(butlock)==HIGH && lockstate == true)
这里发生的事情是,如果lockrf为高,前两个if语句的both都为真,所以你先将lock_case设置为1,然后设置为2 . 当 ulockrf 很高时,您会得到类似的效果。这就是为什么您只得到案例 2 和案例 4 的原因。
要解决此问题,请添加括号以消除歧义:
if ((digitalRead(lockrf)==HIGH || digitalRead(butlock)==HIGH)
&& lockstate == true )
如果有任何疑问,良好的编程习惯建议使用括号。