C++ 用于ardiuno供电湿度控制的带if语句的For循环
这是一个非常简单的问题,但我不完全确定如何将for循环合并到if语句中。背景:我有一个加湿器,我正试图根据房间的湿度自动调节。我用的是ardiuno,dht11湿度传感器和伺服。加湿器旋钮有三个设置(高-低-关),因此伺服有三个位置。我有运行的代码,使伺服适当地根据湿度水平。问题是它很容易波动。为了纠正这一点,我希望加入一个for循环,这样在湿度大于55的情况下,在60次一秒的迭代之后,伺服运动。我试图添加一个for循环,但它似乎不起作用 但这只是基于我所知道的一点编程的解决方案。如果有更好的解决方案,甚至是同样可行的替代方案,我很想知道。我目前正在学习机械工程,但我发现要真正制造出某种东西,需要有电子学和代码方面的背景。我正试图通过一系列的项目独立学习这两方面的知识,所以我非常渴望学习。希望这有助于解释为什么我要问这么简单的问题C++ 用于ardiuno供电湿度控制的带if语句的For循环,c++,c,arduino,C++,C,Arduino,这是一个非常简单的问题,但我不完全确定如何将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;iDHT.湿度
返回一个浮点值
,因此如果要进行比较,请首先将其存储在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
中。