我想在Arduino上每Y秒执行一次X秒的函数。
我试图以恒定速率(每分钟1摄氏度)控制阻力加热一些水,所以我想的是:我会测量它的速率是多少。运行一整分钟,然后我将其调整到所需的速率。
让我们说它每分钟加热5摄氏度,所以我想激活阻力60/5秒,但不是一次全部,我想要每12秒激活一次阻力1秒无论如何保持速度不变(如果一天太冷,太热,如果我更换我的设备等)。
你们认为这是可能的吗?如果没有,任何想法我怎么能让它工作?我看到了Timer.h库,但它似乎并没有解决我的问题= /
在此先感谢,如果有任何信息有用,请告诉我们!
答案 0 :(得分:3)
我认为最简单的方法是使用millis()函数。这是一个例子,但这取决于你的控件是如何运作的。
const int onTime=1000; // in ms
const int offTime=12000; // in ms
const int resistorPin=7; // Change as necessary
boolean currentlyOn=false;
unsigned long startTime;
void setup(){
pinMode(resistorPin,OUTPUT);
digitalWrite(resistorPin,LOW);
startTime=millis(); // Initialize
}
void loop(){
if (currentlyOn && millis()>startTime+onTime){ // Switch resistor off
digitalWrite(resistorPin,LOW);
currentlyOn=false;
startTime=millis(); // Reset timer
}
if (!currentlyOn && millis()>startTime+offTime){ // Switch resistor on
digitalWrite(resistorPin,HIGH);
currentlyOn=true;
startTime=millis(); // Reset timer
}
delay(10);
}
我不知道这是否会起到控制温度的作用,因为我预计会出现明显的非线性,但至少电阻会做你想要的。如果你真的想要控制温度,我会建议你在一个反馈回路中测量温度并相应调整(可能用PID控制器?)。但那当然要复杂得多。
编辑:一些额外的想法: 我建议使用基于millis()的方法的原因是因为它允许您在等待时执行其他代码,使其更加通用。但是如果你不需要它,你总是可以超级简单并使用delay():
void loop(){
digitalWrite(resistorPin,HIGH);
delay(onTime);
digitalWrite(resistorPin,LOW);
delay(offTime);
}
最后,您还可以将电阻器连接到PWM引脚并使用analogWrite()代替,保持电阻器始终以低电平激活。
答案 1 :(得分:1)
这里有一个很好的Arduino PID库,包含大量文档:http://playground.arduino.cc/Code/PIDLibrary
那个页面也很好地解释了它背后的理论,但是如果它没有完全点击,我怀疑Wiki可以比我更好地解决背景问题:http://en.wikipedia.org/wiki/PID_controller
然而,考虑到有问题的电阻,这可能都没有实际意义。鉴于Arduino引脚的最大输出为5V,您可以考虑输出1000 A.但是这些相同的引脚的最大电流约为40 mA。因此,如果你真的想要推动5000 W的余量,你需要将Arduino和电阻器的电源分开,这可能意味着使用继电器来为电阻器供电。但由于继电器是开关交易,你将无法再使用analogWrite()。但是,PID仍然可以工作 - 请参阅同一个库中的此示例:http://playground.arduino.cc/Code/PIDLibraryRelayOutputExample。我从来没有亲自试过使用那么大的继电器,所以我不能说这种方法的可行性。
如果您对电源问题有任何帮助,请与我们联系。