如何在Arduino中不使用delay()函数来闪烁?

736 阅读4分钟

无延迟的闪烁是最简单的Arduino项目,为了让初学者更好的理解,在Arduino中,有一个内置的延迟()函数,可以产生一个指定时间的延迟(以毫秒为单位)。那么,为什么有必要在没有延迟()函数的情况下做一个闪烁的LED项目呢?在这篇文章中,我们将尝试找出这个问题的答案,并将讨论在Arduino中不使用delay()函数就能闪烁的方法。

为什么我们需要在不使用Arduino的delay()函数的情况下眨眼?

delay()函数在语句的执行中产生一个定义时间的延迟,或者我们可以说,delay()函数暂停了整个程序,在delay()没有结束之前,没有语句会被执行。

这意味着在延迟没有结束之前,我们不能做任何其他任务,这就是为什么有时不鼓励使用delay()函数的主要原因。让我们考虑一个快递员的例子,他去家里,发现没有人在家,邻居告诉他,相关的人将在一个小时后回到他的家里。现在,快递员应该怎么做?他可以等待,也可以把附近顾客的包裹送出去,一小时后再回来送那个人的包裹。

同样,在编程中,我们不建议使用delay()函数和暂停整个程序一段时间,相反,我们更愿意在LED闪烁时执行一些其他任务。

在Arduino中不使用delay()函数代码的闪动

在Arduino中,我们可以通过一个非常简单的代码在不使用delay()函数的情况下闪烁LED。在通过代码之前,让我们解释一下代码中使用的一些内置函数的目的。

函数目的
pinMode()这个函数用来定义特定的引脚,作为输出或输入。
digitalWrite()此函数用于根据高或低状态配置引脚
Serial.begin()该函数用于串行通信
millis()该函数用于提取代码的执行时间,单位为毫秒。

考虑一下下面的代码:

int led = 13;
int x = 1;
unsigned long d1, d2;
void setup() {
pinMode(led,OUTPUT);
digitalWrite(led,1);
Serial.begin(9600);
}
void loop() {
d2=millis();
if (d2-d1 >= 1000){
x=1-x;
d1=millis();
digitalWrite(led,x);
}
}

对上述代码的解释是:

  • 我们定义了一个数据类型为整数的变量 "x",它将被用来改变LED的状态。
  • 我们还定义了一个整数数据类型的变量LED,并在其中存储了13。这个13将被用于Arduino的13个数字引脚。
  • 两个变量d1和d2被定义为无符号长数据类型。 无符号长 "数据类型用于存储32位的数字,它最多可以存储4,294,967,295个数字,需要说明的是,这种数据类型不存储负数。
  • 在void setup()中,首先,我们使用pinMode()函数并声明13号针脚为输出针脚。
  • 接下来,我们使用digitalWrite()函数使13号针脚的状态为高电平。
  • 最后,我们使用串行通信,波特率为9600。
  • 在void loop()中,我们输入了LED闪烁的代码,因为我们想在无限的时间内重复它。
  • 我们提取代码执行到现在的时间,并将该值存储在变量d2中。
  • 然后使用if语句检查条件if(d2-d1>1000),如果是真的,它将改变x的值。
  • 然后我们将执行代码的另一个值存储在d1中。
  • 最后,使用digitalWrite()函数,用x的值改变LED的状态。
  • 这将持续无限的时间(因为d2-d1的值在任何情况下都不会大于1000)。

仿真

我们将在Proteus模拟中运行这段代码,我们将打开Proteus并找到以下组件。

  1. Arduino Uno R3
  2. LED
  3. 电阻器
  4. 地线

将电阻的一端与Arduino的第13针连接,将LED的正极与电阻的另一端连接,将地与LED的负极连接。一旦电路完成,双击Arduino,并在其中上传Arduino代码的 "hex "文件。

播放该项目,LED将开始闪烁,如下图所示。

硬件配置

在proteus上模拟的相同电路将被组装在面包板上。我们用跳线来连接LED、Arduino和电阻等部件。

黑色的跳线连接到Arduino的接地端和LED的负极。然后,一个电阻(220欧姆)被连接到LED的正极,电阻的另一条腿(220欧姆)用红色跳线连接到Arduino的第13针。代码已经上传到Arduino上,项目的工作情况是。

在没有使用delay()函数的情况下,LED成功闪烁。

总结

Arduino中无延迟()函数的闪烁是一个初级项目,用于演示如何在不使用延迟()函数的情况下执行该项目。在不使用delay()函数的情况下,我们不受限于单一任务,可以运行代码的任何其他指令。在这篇文章中,我们已经解释了Arduino中不使用delay()函数的闪烁LED,并对其模拟以及硬件配置进行了演示。