C++ 用于ardiuno供电湿度控制的带if语句的For循环

C++ 用于ardiuno供电湿度控制的带if语句的For循环,c++,c,arduino,C++,C,Arduino,这是一个非常简单的问题,但我不完全确定如何将for循环合并到if语句中。背景:我有一个加湿器,我正试图根据房间的湿度自动调节。我用的是ardiuno,dht11湿度传感器和伺服。加湿器旋钮有三个设置(高-低-关),因此伺服有三个位置。我有运行的代码,使伺服适当地根据湿度水平。问题是它很容易波动。为了纠正这一点,我希望加入一个for循环,这样在湿度大于55的情况下,在60次一秒的迭代之后,伺服运动。我试图添加一个for循环,但它似乎不起作用 但这只是基于我所知道的一点编程的解决方案。如果有更好的解

这是一个非常简单的问题,但我不完全确定如何将for循环合并到if语句中。背景:我有一个加湿器,我正试图根据房间的湿度自动调节。我用的是ardiuno,dht11湿度传感器和伺服。加湿器旋钮有三个设置(高-低-关),因此伺服有三个位置。我有运行的代码,使伺服适当地根据湿度水平。问题是它很容易波动。为了纠正这一点,我希望加入一个for循环,这样在湿度大于55的情况下,在60次一秒的迭代之后,伺服运动。我试图添加一个for循环,但它似乎不起作用

但这只是基于我所知道的一点编程的解决方案。如果有更好的解决方案,甚至是同样可行的替代方案,我很想知道。我目前正在学习机械工程,但我发现要真正制造出某种东西,需要有电子学和代码方面的背景。我正试图通过一系列的项目独立学习这两方面的知识,所以我非常渴望学习。希望这有助于解释为什么我要问这么简单的问题

#include <dht.h>
#include <Servo.h>
Servo myservo;//create servo object to control a servo

dht DHT;

#define DHT11_PIN 7 // pin for humidity sensor ( also measure temp)

void setup() {
    myservo.attach(9);//attachs the servo on pin 9 to servo object
    myservo.write(0);//statting off position at 0 degrees
    delay(1000);//wait for a second
    Serial.begin(9600);

}

void loop() {
    int chk = DHT.read11(DHT11_PIN); // the follow is just so that I can     see the readings come out properly
    Serial.print("Temperature = ");
    Serial.println(DHT.temperature);
    Serial.print("Humidity = ");
    Serial.println(DHT.humidity);
    delay(500);

    if (DHT.humidity > 55) // here is where my code really begins
    {
        for (int i=0; i>60; i++); // my goal is to execute the follow code after the statement above has been true for 60 one second iterations 
    {
        myservo.write(0);//goes to off position
        delay(1000);//wait for a second
    }
} else if (DHT.humidity > 40 ) {
        for (int i=0; i>60; i++); // same thing here
        myservo.write(90);//goes to low position
        delay(1000);//wait for a second
}


else
{
     for (int i=0; i>60; i++);
     myservo.write(180);//goes to high position
     delay(1000);
}
} // end of void loop()
#包括
#包括
伺服myservo//创建伺服对象以控制伺服
dht-dht;
#定义湿度传感器的DHT11_引脚7//引脚(同时测量温度)
无效设置(){
myservo.attach(9);//将针脚9上的伺服连接到伺服对象
myservo.write(0);//在0度处的定位
延迟(1000);//等一下
Serial.begin(9600);
}
void循环(){
int chk=DHT.read11(DHT11_PIN);//下面的内容只是为了让我能够正确地看到读数
串行打印(“温度=”);
串行打印LN(DHT温度);
Serial.print(“湿度=”);
串行打印LN(DHT湿度);
延迟(500);
if(DHT.weathy>55)//这里是我的代码真正开始的地方
{
for(int i=0;i>60;i++);//我的目标是在上述语句为真60次1秒迭代后执行以下代码
{
myservo.write(0);//转到关闭位置
延迟(1000);//等一下
}
}否则,如果(DHT.湿度>40){
for(inti=0;i>60;i++);//这里也是一样
myservo.write(90);//转到低位
延迟(1000);//等一下
}
其他的
{
对于(inti=0;i>60;i++);
myservo.write(180);//进入高位
延迟(1000);
}
}//void循环()的结束

仅针对您的问题,以下行不正确:

for (int i=0; i>60; i++);
两件事: 1) for循环中的第二条语句描述了它执行的条件。按照它的编写方式,它只会在i>60时执行(根据注释,这不是您想要的)。 2) for语句后面的分号使下一个块不关联

将该行更正为以下内容:

for (int i=0; i<60; i++)

for(int i=0;i
DHT.湿度
返回一个
浮点值
,因此如果要进行比较,请首先将其存储在
int
中,然后进行比较。

我猜您正在尝试在湿度水平上进行去反弹,需要在相同的范围内保持一段时间

首先,我定义了转换函数来将湿度级别映射到状态

#define HUMID_OFF 1
#define HUMID_LOW 2
#define HUMID_HIGH 3

byte state_conv (float humid_level){
     if (humid_level > 55) return HUMID_OFF ;
     else if (humid_level > 40 )  return HUMID_LOW ;
     else   return HUMID_HIGH ;
}
其次,我将检查状态的变化,并在当前状态稳定时使用millis()计算时间。如果计算时间长于阈值,则更改实际状态

 /*Global variable*/
byte actual_state;
byte flag_state;
void setup (){
// Do things that necessary
    float humid = dht.readHumidity();
    /*Initialize value*/
    actual_state = state_conv(humid);
    flag_state= state_conv(humid);
}

void loop(){
    static unsigned long timer = millis();
    float humid = dht.readHumidity();
    byte crr_state = state_conv(humid);
    if (crr_state != actual_state ){// if state is  changing
        if (flag_state != crr_state){
            /if crr_state change form last iteration then reset timer
            flag_state = crr_state;/
             timer = millis();
        }
        else if (millis() - timer > 10000){
            //if crr_state not change for 10000 ms (10 second)
            actual_state  = crr_state; // update actual state to crr_state
        }
    }
    // After this use actual_state to control servo
    if (actual_state == HUMID_OFF ){
        myservo.write(0);//goes to off position
    }
    else if (actual_state == HUMID_LOW ){
        myservo.write(90);//goes to low position
    }
    else if (actual_state == HUMID_HIGH ){
        myservo.write(180);//goes to high position
    }

}

请依次缩进代码。您的
for
循环有两个问题:第一个是条件,第二个是分号。for(int i=0;i>60;i++);//这将永远不会循环,试试看,我已经完成了这两项,并且没有看到任何变化。在一次条件为真的迭代后,伺服仍然会移动。谢谢你。我做了更正,但它仍然不工作。我在常规的ardiuno IDE中工作,所以我如何设置更高的警告级别?欢迎这样做。你的答案是不正确的在与另一个
int
进行比较之前,无需将
float
存储到
int
中。