这个例子里你会学到怎么设置一个类似的计时器。
有时候你需要同时做两件事,比如读取按键信息的同时想点亮熄灭一个LED,在这种情况下,你可能不会想去用delay()函数,因为使用delay()的时候会中断你的控制器其他工作。如果控制器执行delay的时候你按下了按键,这样就会错过按键按下的信息。
这个例程教你不用delay()来使一个LED闪烁。点亮LED后记录时间。在loop()中,它会检测需要点亮的LED的时间是否到了。如果到了,就触发点亮或者熄灭LED,重新记录时间,这样LED就可以持续的闪烁。
类似的就像你在微波炉里做披萨,同时等着接收重要的邮件。你把披萨放在微波炉,设置10分钟,同样的delay()就是设置一个十分钟的计时器直到微波炉到0,如果重要的邮件在此之间来了,你就错过了这个邮件。
你再真实世界里要做的就是放好披萨,检查邮件,还可以去做一些其他的不太占用很多时间的事,然后你再回来看微波炉是否到0了,到了0就表明披萨做好了。
/* Blink without Delay 不使用delay函数来使一个连接在数字口的LED闪烁,这意味着别的代码可以同时执行,而不会被LED的代码打断。 */ const int ledPin = 2; // 设置LED的引脚 int ledState = LOW; // 设置 LED状态 long previousMillis = 0; // 存储上一次LED状态改变的时间 long interval = 1000; // 设置间隔时间为1000毫秒 // 下面的变量是长整形,因为以毫秒为单位测量的时间会快速地变成一个更大的,整形无法存储的数字。 void setup() { pinMode(ledPin, OUTPUT); // 设置数字口输出 } void loop() { unsigned long currentMillis = millis(); // 检查是否到了亮灭灯的时间,也就是,如果现在和上一次亮灭灯的时间差比你设置的间隔时间大 if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; // 保存最后一次亮灯的时间 if (ledState == LOW) // 如果LED灭了就点亮它 ,反之亦然: ledState = HIGH; else ledState = LOW; digitalWrite(ledPin, ledState); // 设置变量ledState为LED数字输入: } }