5

我确实有一个小型 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);
}

我只使用串行作为调试回显。

任何想法?

4

4 回答 4

6

似乎您需要将数字文字显式设置为 long (L) 并使用它们。否则它不起作用。如果有人可以解释是否有任何类型的自动转换,那就太棒了,但在那之前只需使用:

unsigned long seconds = 1000L; // !!! SEE THE CAPITAL "L" USED!!!
unsigned long minutes = seconds * 60;
unsigned long hours = minutes * 60; 

然后像往常一样简单地使用延迟(毫秒):

delay(5 * minutes);

它对我有用。

于 2013-10-04T11:30:59.647 回答
3

在你的行中:

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 添加到数字的末尾。

于 2014-05-19T12:29:14.893 回答
0

可能是 unsigned long 被覆盖了。作为一种调试方法,请尝试硬编码常量值,例如delay(6000)六秒。这将证明您的硬件是否正常工作。

最后,不确定延迟值是否应该是unsigned long,我通常使用int而不是 60,000,它大于intArduino 上的(2 个字节)可以存储的值。请记住,嵌入式系统确实是更小的系统。

这个例子:http ://arduino.cc/en/Tutorial/BlinkWithoutDelay 暗示延迟的值必须是一个整数。

希望这可以帮助。

于 2013-10-04T02:14:56.123 回答
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

并做了。

于 2019-09-27T06:19:02.820 回答