不使用 delay() 函数而使 LED 闪烁
有些时候你需要同时做两件事。例如,你可能希望在读取按键按下状态同时让LED闪烁。 在这种情况下,你不能使用 delay(),
因为Arduino程序会在delay()
中停顿。 如果按键被按下的同时,Arduino正在暂停等待 delay()结束
,你的程序也将会错过按键的按下.
这个演示展示了如何闪烁LED而不使用 delay()。
它点亮了LED,然后记录下时间。然后,每一次通过 loop()
循环, 检查闪烁设置时间是否到达。 如果是,它的点亮或熄灭LED, 并且刷新时间。以这种方式让LED不断闪烁, 而代码的执行不会因一个指令而滞后.
类似的,你用微波炉热比萨,并同时等待一些重要的电子邮件。你把比萨放进微波炉10分钟。使用 delay()
的类比,你坐在微波炉前面看着定时器计数,倒计时10分钟直到定时器达到零为止。如果在这期间重要的邮件到达,你将会错过它。
在现实生活中你会做的是开始热萨饼,然后检查你的电子邮件,然后可能再做别的事情(不太长时间的事!)偶尔你会回到微波炉,看看定时器是否已经达到零,即你的比萨饼是否已经完成。
在本教程中,你将学会如何建立一个类似的计时器 .
硬件需求
- Arduino 开发板
- LED (非必要)
- 220欧电阻(非必要)
电路
要构建这电路,请把电阻的一端连接到板子的pin13,电阻的另一端连接到LED的长引脚(长的引脚,称为阳极),LED的短引脚连接到(短的引脚,称为阴极)板子的GND,如上图所示和下面的原理图。
大多数Arduino和Genuino板子已经将板上的LED附加在板子本身的pin13。如果你不附加任何硬件中运行这个例子,您应该看到,LED闪烁。
原理图
点击图片放大
图像使用fritzing.开发。电路的例子, 看到fritzing项目页面
构建电路后将板子插入到你的电脑,开始Arduino软件(IDE),输入下面的代码。
代码
下面的代码使用millis()
函数,从板子开始运行时,就会返回很多个毫秒的命令。当前的演示,是使LED闪烁.
/* 不使用 delay() 函数而使 LED 闪烁 点亮和熄灭一个连接到数字引脚的发光二极管(LED),不使用delay()延迟函数。这意味着其他代码可以同时运行而不被LED代码干扰电路* LED 连到引脚13 和 地* 注:大部分 Arduino 已经有板上的LED并且是连到引脚13,所以此示例无需额外硬件 created 2005by David A. Mellismodified 8 Feb 2010by Paul Stoffregenmodified 11 Nov 2013by Scott Fitzgerald这个示例代码是在公共领域.http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay*///一个不会改变的常量。这里用来定义一个引脚: const int ledPin = 13; // LED引脚号 // 一个会变化的变量: int ledState = LOW; //ledState将LED置低电平 //一般来说,应该使用 "unsigned long" 类型的变量来保存时间// 如果用int类型来存储值,它很快就会变得过大而该类似无法储存unsigned long previousMillis = 0; // 将存储的LED值最后一次更新 //一个不会改变的常量: const long interval = 1000; // 闪烁的时间间隔(毫秒)void setup() { // 设置数字引脚作为输出: pinMode(ledPin, OUTPUT);}void loop() { // 在这里,你放置的代码需要一直运行. // 检查闪烁的时间,就是if // 当前时间和上次闪烁的时间 //设置你想要的 LED更大的时间间隔 // LED闪烁. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // 保存上次LED闪烁时间 previousMillis = currentMillis; // 如果LED是点亮的,反之亦然: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // 设置LED的电平为ledState值: digitalWrite(ledPin, ledState); }}
参考
- pinMode()
- digitalWrite()
- digitalRead()
- if
- else
- BlinkWithoutDelay - Blink an LED without using the delay() function.
- Debounce - Read a pushbutton, filtering noise.
- DigitalInputPullup - Demonstrates the use of INPUT_PULLUP with pinMode().
- StateChangeDetection - Count the number of button pushes.
- toneKeyboard - A three-key musical keyboard using force sensors and a piezo speaker.
- toneMelody - Play a melody with a Piezo speaker.
- toneMultiple - Play tones on multiple speakers sequentially using the tone() command.
- tonePitchFollower - Play a pitch on a piezo speaker depending on an analog input.