C++ 如何独立检查多个变量?

C++ 如何独立检查多个变量?,c++,if-statement,variables,arduino,sensors,C++,If Statement,Variables,Arduino,Sensors,这是代码中出现错误的部分: int value = analogRead(LM351); float Temperature = value * 500.0 / 1023.0; lcd.setCursor(6,0); lcd.print(Temperature); lcd.setCursor(11,1); int value1 = analogRead(LM352); float Humidity = value1 * 500.0 / 1023.0; lcd.s

这是代码中出现错误的部分:

  int value = analogRead(LM351);
  float Temperature = value * 500.0 / 1023.0;
  lcd.setCursor(6,0);
  lcd.print(Temperature); 
  lcd.setCursor(11,1);
  int value1 = analogRead(LM352);
  float Humidity = value1 * 500.0 / 1023.0;
  lcd.setCursor(10,1);
  lcd.print(Humidity); 
  

  if (Temperature > 24){
    digitalWrite(motor, HIGH);
    digitalWrite(LedRed, HIGH);
    digitalWrite(LedGreen, LOW);
    lcd.print("");
  }
  else {
    digitalWrite(motor, LOW);
    digitalWrite(LedRed, LOW);
    digitalWrite(LedGreen, HIGH);
    lcd.print("");
  }
  
  if (Humidity > 10){
    digitalWrite(motor, HIGH);
    lcd.print("");
  }
  else {
    digitalWrite(motor, LOW);
    lcd.print("");
  }
  
   delay(1000);
}
右侧,如果温度超过24或湿度超过10,电机应旋转。但是当我运行这个代码时,只有当湿度超过10时,马达才会旋转。但当湿度低于10度,温度高于24度时,电机不会旋转


原因是我在逐个检查变量,是否有一种方法可以独立地检查每个变量?

您可以在第一个if-else语句中包括这两个条件:

if (Temperature > 24 || Humidity > 10){
    digitalWrite(motor, HIGH);
    digitalWrite(LedRed, HIGH);
    digitalWrite(LedGreen, LOW);
    lcd.print("");
}
else {
    digitalWrite(motor, LOW);
    digitalWrite(LedRed, LOW);
    digitalWrite(LedGreen, HIGH);
    lcd.print("");
}

这里的问题是这两个语句都在if…else子句中

让我们以温度高于24,湿度低于10为例

程序进入温度if块,检查条件,然后通过,因此执行if子句中的块,如下所示:

if (Temperature > 24){
    digitalWrite(motor, HIGH);
    digitalWrite(LedRed, HIGH);
    digitalWrite(LedGreen, LOW);
    lcd.print("");
接下来,它检查湿度if子句中的条件,因为湿度低于10,所以它没有通过,所以它执行else块:

 else {
    digitalWrite(motor, LOW);
    lcd.print("");
  }
因此,电机确实开始旋转,但几乎立即被湿度为if…else的else块停止

要解决这个问题,您需要重构代码,用或(| |)检查这两个条件

您还需要一个嵌套的if子句,以便仅在温度>24时设置LED

这样,每次都会执行代码

Temparature > 24 or Humidty > 10

您的逻辑检查一件事并作出反应,然后检查另一件事。
你可以同时检查两种情况,从4种情况中找出一种,然后做出反应, 或者一件接一件地检查,但只做决定,而不是立即作出反应,然后再作出反应

我想你会特别问关于分开检查的问题,所以还是做决定吧

// no decisions yet
bool NeedMotor = false;

if (Temperature > 24)
{ 
    NeedMotor = true;
    digitalWrite(LedRed, HIGH);
    digitalWrite(LedGreen, LOW);
    lcd.print("");
} else
{
    digitalWrite(LedRed, LOW);
    digitalWrite(LedGreen, HIGH);
    lcd.print("");
}
  
if (Humidity > 10){
    NeedMotor = true;
    lcd.print("");
} else
{
    lcd.print("");
}

if (NeedMotor)
{
    digitalWrite(motor, HIGH);
} else
{
    digitalWrite(motor, LOW);
}
这样,湿度决定不会覆盖温度决定,它只是可能决定在温度尚未导致的情况下使用电机。如果需要电机,则将其打开,否则将关闭


注意,我不确定lcd打印的目的。我将其保留在代码中。

我将从反转逻辑开始,条件的两个共同点是,当它们都低于阈值时,它们都处于关闭状态,如果在两者都不低于阈值时满足条件,则打开风扇,然后使用嵌套的条件语句检查温度

免责声明:可能有一种更干净的方法可以做到这一点

//If the temperature or humidity are below threshold then
//turn off the motor and the red LED, and turn on the green LED
if(Temperature <= 24 && Humidity <= 10)
{
  digitalWrite(motor, LOW);
  digitalWrite(LedRed, LOW);
  digitalWrite(LedGreen, HIGH);
}
else //the temperature or humidity are above threshold
{
  //turn on the motor
  digitalWrite(motor, HIGH);
  
  //if the temperature is above threshold turn off the Green LED
  //and turn on the red led
  if (Temperature > 24)
  {
    digitalWrite(LedRed, HIGH);
    digitalWrite(LedGreen, LOW);
  }
  //if the humidity and temperature are both above threshold and the
  //temperature falls back below threshold, invert the LEDs.
  else
  {
    digitalWrite(LedRed, LOW);
    digitalWrite(LedGreen, HIGH);
  }

  //clear the LCD
  lcd.print("");
}
//如果温度或湿度低于阈值,则
//关闭电机和红色LED,然后打开绿色LED

if(Temperature您确实描述了所需的代码,但没有在实际代码中实现它

bool MotorRequired = (Temperature > 24) || (Humidity >10);
或单独:

bool MotorRequired = (Temperature > 24);

MotorRequired = MotorRequired || (Humidity >10);
当到达可使用电机的点时

if(MotorRequired)
   // power motor on
else
   // power motor off
可以是较短的无分支:

digitalWrite(motor, (MotorRequired) ? HIGH : LOW );
这和

if(Temperature > 24 || Humidity >10)
所以整个逻辑看起来像

digitalWrite(motor, (Temperature > 24 || Humidity >10) ? HIGH : LOW );

这些条件是独立的,但你的行动取决于两者,所以你必须对两者进行逻辑运算。

可以在低温下获得红色LED。请考虑LED。我试图解释问题的所在。如果需要内部的块,就必须处理LED。如果条件到期,Tempera就需要检查。真值高于24。如果是,则设置LED。是且正确。但是,如果以直接方式应用您的解决方案,则无法解决LED应仅表示温度的问题。即,如果将其与电机控制一起插入,并且没有附加逻辑,则LED可能在低温下亮起。此外,如果h这只是我的意见,您的解决方案不符合OPs要求“独立于其他变量检查每个变量”。(诚然,我有一个编辑。我希望您不要不同意我的意见。)至于所问的问题,你是对的。但从原则上讲,在有替代解决方案时创建标志并不是最好的选择,因为它会降低代码的可读性。IMO标志变量只应在无法创建良好条件的情况下使用。无论如何,我相信这两个答案都能解决问题我正面临着这个问题。我会编辑我的解决方案来考虑LED。我不要求你使用标志(虽然我没有看到一个备选答案,因为“独立”的要求)。。使用更复杂的逻辑树是可能的…您好Voicenotes。为了可读性,我自由编辑了一些句子结构。我确实将一些句子结构更改为我认为表达相同目标的句子结构,只是更清楚。如果我错了,并且改变了您的意思,请接受我的道歉,并随意撤销我的更改。我得到印象中,你是明确要求自变量检查,因为所需的独立行为的LED,即独立于湿度?请确认或澄清。OP需要学习如何流程图。命令式语言,如C或C++遵循精确的指令顺序内的“仿佛”规则。
digitalWrite(motor, (Temperature > 24 || Humidity >10) ? HIGH : LOW );