我确实有一个小的Arduino编程,它只是在第一次循环后停止。我可能会忽视某些事情......但我对发生的事情一无所知。
这是代码
int led = 13;
//int led = 10;
unsigned long windtime = 1000 * 2; // 2 seconds
unsigned long pausetime = 1000 * 60; // 1 minute
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
Serial.print("Wind");
digitalWrite(led, HIGH);
delay(windtime);
Serial.print("Pause");
digitalWrite(led, LOW);
delay(pausetime);
}
我只使用Serial作为调试回音。
有什么想法吗?
答案 0 :(得分:6)
您似乎需要将数字文字显式设置为long(L)并使用它们。否则它不起作用。如果有人能解释是否有任何类型的自动转换它会很棒但是在那之前只需使用:
unsigned long seconds = 1000L; // !!! SEE THE CAPITAL "L" USED!!!
unsigned long minutes = seconds * 60;
unsigned long hours = minutes * 60;
然后像往常一样使用延迟(millisec):
delay(5 * minutes);
它对我有用。
答案 1 :(得分:2)
在您的行中:
unsigned long pausetime = 1000 * 60; // 1 minute
Arduino将查看1000(整数)和60(整数),因此将得出一个答案,它将尝试插入...一个整数!这意味着它可以给予暂停时间的最大答案是32,767。比这更大的任何东西都会包裹起来,所以60,000减去两批32,768来自-5536。
要查看它的实际操作,请添加Serial.print(1000 * 60);进入设置并观察工具>串行监视器:
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial.begin(9600);
Serial.print(1000 * 60);
}
强制Arduino使用常量作为无符号长整数将ul或UL添加到数字的末尾。
答案 2 :(得分:0)
可能是未签名的多头被覆盖了。作为调试方法,尝试硬编码常量值,如delay(6000)
六秒钟。这将证明您的硬件是否正常工作。
最后,不确定延迟值是否应为unsigned long
,我通常使用int
而不是60,000,这大于Arduino上的int
(2个字节)商店。请记住,嵌入式系统确实是较小的系统。
此示例:http://arduino.cc/en/Tutorial/BlinkWithoutDelay 暗示延迟值必须为int。
希望这有帮助。
答案 3 :(得分:0)
代替使用
unsigned long windtime = 1000 * 2; // 2 seconds
unsigned long pausetime = 1000 * 60; // 1 minute
使用
unsigned long windtime = 2000; // 2 seconds
unsigned long pausetime = 60000; // 1 minute
完成。