【问题标题】:How to independently check more than one variable?如何独立检查多个变量?
【发布时间】:2021-04-21 18:56:06
【问题描述】:

这是有错误的代码部分:

  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,电机不转。

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

【问题讨论】:

  • 嗨语音笔记。为了可读性,我冒昧地进行了编辑。我确实将一些句子结构更改为我认为表达相同目标的内容,只是更清楚。如果我错了并且改变了你的意思,请接受我的道歉并随时edit撤消我的更改。
  • 我的印象是,由于 LED 所需的独立行为,即独立于湿度,您明确要求进行独立变量检查?请确认或澄清。
  • OP 需要学习如何处理en.wikipedia.org/wiki/Flowchart 的流程图。命令式语言(如 C 或 C++)遵循“好像”规则中的确切指令顺序。

标签: c++ if-statement variables arduino sensors


【解决方案1】:

您的逻辑检查一件事并做出反应,然后检查另一件事。
您可以同时检查两件事,确定 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);
}

这样,湿度决定不会覆盖温度决定,如果温度还没有导致它可能会决定使用电机。如果需要电机,将打开,否则关闭。

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

【讨论】:

    【解决方案2】:

    您可以在第一个 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("");
    }
    

    【讨论】:

    • 低温时红色LED灯亮。
    【解决方案3】:

    这里的问题是两个语句都在 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("");
      }
    

    所以电机确实开始旋转,但几乎立即被湿度中的 else 块 if...else 子句停止。

    要解决此问题,您需要重构代码以使用 OR ( || ) 检查这两个条件。

    If ( Temperature > 24 || Humidty > 10 )
    {
        //spin
        if ( Temperature > 24 )
        {
            //set LEDs
        }
    }
    else
    {
        // do not spin
    }
    

    您还需要一个嵌套的 if 子句来设置 LED,仅在温度 >24 的情况下。

    这样代码每次都会被执行

    Temparature > 24 or Humidty > 10
    

    【讨论】:

    • 请考虑 LED。
    • 我试图解释问题出在哪里。要处理 LED,需要内部的另一个 if 块来检查条件是否通过,温度高于 24。如果是,请设置 LED。
    • 是的,而且是正确的。但是,您的解决方案建议,如果以直接的方式应用,并不能解决 LED 应仅代表温度的问题。 IE。如果它与电机控制一起插入并且没有附加逻辑,则 LED 可能会在低温时亮起。此外,尽管这只是我的意见,但您的解决方案不符合 OP 要求“独立检查每个变量”。 (诚​​然,我有一个编辑。我希望你不会不同意我的观点。)
    • 至于问的问题,你是对的。但是在原则上,当有替代解决方案时创建标志并不是最好的选择,因为它降低了代码的可读性。 IMO 标志变量只能在无法创造良好条件的情况下使用。无论如何,我相信这两个答案都为作者所面临的问题提供了解决方案。我将编辑我的解决方案以考虑 LED。
    • 我没有要求您使用标志(尽管由于“独立”要求,我没有在我的答案中看到替代方案)。使用更复杂的逻辑树是可能的......
    【解决方案4】:

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

    免责声明:可能有一种更简洁的方法。

    //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("");
    }
    

    【讨论】:

      【解决方案5】:

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

      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 );
      

      这些条件是独立的,但您的操作取决于它们两者,因此您必须对两者执行逻辑运算。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多