未到达案例陈述的所有分支

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 )

如果有任何疑问,良好的编程习惯建议使用括号。