• 有时候你需要同时做两件事。如你可能想闪烁一个LED灯,同时读取一个按键。这种情况下你不能使用delay()。如果Arduino因为delay()函数被暂停时有按键按下,你的程序会错过这次的按键按下。
  • 这个程序示范怎样不用delay()来闪烁一个LED灯。它打开LED灯,并标注一个时间。然后每次运行完loop(),它都会查一下有没有超过需要的闪烁时间。如果它超过了,它就会切换LED灯为打开或者关闭状态,然后标注新的时间。在这种方法里LED灯不断闪烁,同时这个程序的执行从来没有漏掉一个指令。
  • 你在等一些重要邮件时,你可能要微波炉加热一个比萨。你把比萨放到微波炉,然后设置10分钟。用delay()就是坐在微波炉前面看着时间度过10分钟。如果重要邮件在这段时间到了,你会错过它。
  • 而现实中你能做到边加热比萨,边检查邮件,或者做其他事情,只要等到定时器到0(意味着比萨已经完成)时你回到微波炉前面。
  • 在这个教程你将会学习怎样设置一个简单的定时器。


  • Arduino or Genuino开发板
  • LED
  • 220 欧姆电阻
  • 先连接电阻的一端到Arduino的PIN13引脚。再连接LED灯的长引脚(正脚,也叫阳极)到电阻的另一端。最后连接LED灯的短引脚(负脚,也叫负极)到Arduino的GND引脚。如图所示 Arduino内置教程-数字-不用delay的闪烁
  • 大部分Arduino开发板上面就有一个LED灯连接到PIN13。如果你不连接硬件就运行这个例子,你应该也可以看到LED闪烁。


Arduino内置教程-数字-不用delay的闪烁 你插好电路板,连上电脑之后,打开Arduino IDE软件,输入以下代码。 样例代码 以下代码用 millis()函数来闪烁LED灯,如果开发板开始运行,会返回微秒的数值
/* Blink without Delay

 Turns on and off a light emitting diode (LED) connected to a digital
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.

 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.

 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 modified 11 Nov 2013
 by Scott Fitzgerald

 This example code is in the public domain.

// constants won't change. Used here to set a pin number :
const int ledPin =  13;      // the number of the LED pin

// Variables will change :
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change :
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);


(十五)ESP32: FreeRTOS计数信号量

2018-12-30 16:18:06



2019-1-4 14:41:20

0 条回复 A文章作者 M管理员
有新私信 私信列表