成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

arduino.延迟它是如何运作的以及如何使用它。



arduino.延迟函数采用整数参数,表示要等待的毫秒延迟的数量。 这是一个阻塞功能,阻止处理器在其它方面做任何其他事情's finished.

您希望使用Delay()来慢下处理器。查看 在向设备发送命令之间闪烁或减慢它的LED闪烁 e.g.hitach HD44780 LCD - 初始化序列需要休息时间 在某些命令之间。

为什么你需要arduino延迟函数

微控制器以非常快的速率运行(16MHz Arduino Uno - ESP8266在80或160MHz运行!),这是一个很好的 事以来你可以做更多的处理。问题是互动 与现实世界,你需要减慢自真实的处理器 世界行动不去MHz汇率!这是arduino延迟的地方 功能有用。

笔记: 相应的Arduino微秒延迟函数是delaymicroseconds()。

它是一个函数,用于循环 你把它作为一个论点的毫秒数。一个毫秒的是 1/000TH. 其中一秒,一秒内有1000毫秒(1000ms = 1s)。

对于1秒钟的延迟,您将使用程序中的函数延迟()如下:

延迟(1000);

使用LED使用 Arduino Delay

对于快速简单的程序,Arduino Delay()函数提供了方便的 减速机制。这里'S一个用于闪烁车载LED的示例程序 附在Arduino Uno的销13。

// Simple LED flash

#define LED 13

//////////////////////////////////////////////
void 设置(void) {

  pinMode(LED,OUTPUT);

}
//////////////////////////////////////////////
// Arduino Delay LED flash
void 环形(){

  delay(500);
  digitalWrite(LED,HIGH);
  delay(500);
  digitalWrite(LED,LOW);

}

所有它确实是将引脚初始化为SETUP()中的输出。然后它 重复执行循环()中的代码。也就是说,它等了一秒钟, 然后将LED设置为,等待另一半秒并设置LED关闭。所以 1秒的路线LED接通半秒半 一秒。然后,这种行动无休止地重复。

提示: 当您使用微控制器遇到困难时 (而且你会!)。总是回到基础知识并使用诸如之类的节目 以上,由于它是最简单的之一,它会给你信心 硬件正在工作。电源线或地线是 正确连接。当您附加开发板时,这更重要 如无焊接面包板,连接可以脱离!

arduino.的问题 Delay

到目前为止,一切看起来很棒;延迟工作精细,LED闪烁, 但延迟()在橱柜里有一个骨架。

delay()是懒惰的函数 - 它是一个 做 NOTHING 功能或阻塞功能。

当您使用Delay()时,即使它有时有用,您正在抛出 远离窗户的加工电源永远不会被恢复!

提示: 仅限最简单的程序延迟()。

当您开始编写更多实质性的程序时,您会发现使用 延迟干扰操作。

例如,如果您想读取输入按钮并对该按钮作出反应 很快就是在100米范围内。如果您使用了200ms / 200ms的延迟闪烁 一个导致的,您无法满足该要求; 400ms会丢失 在延迟例程中等待。这是在做的时候可以更好的时间 useful processing.

警告: 不要在中断例程中使用delay()。自呢 使用中断本身中断例程将挂起。而是使用 delaymicroseconds() - 该函数创建了硬编码延迟 interrupt safe.

所以问题现在变成了你真的如何创造延迟,而是在 同时使用使用最小处理器时间的延迟。

实际上有两种方法可以这样做:

第一个选项更容易,并更加解释 这里.

第二个是更先进的,涉及使用低级中断例程 和更多硬件(允许多个键运行到一个中断引脚)。

arduino延迟 Gotchas.

这个Arduino Delay Gotcha非常微妙,你可能已经来了 穿过它。它与范围有关(当变量时的C / C ++规则 其他功能可见)和Arduino环境(虽然 方便)确实隐藏了幕后发生的事情 - 这可以抓住 you out.

以下代码试图通过传递变量来控制延迟时间 到按下按钮时更改的延迟功能。

//////////////////////////////////////////////
void 环形(){
uint16_t dly=200;

  delay(dly);
  digitalWrite(LED,HIGH);
  delay(dly);
  digitalWrite(LED,LOW);

  if (digitalRead(INPUT)) dly=100; else dly=10;

}

当你看看它看起来非常合理的代码使用变量 保持延迟值并更改输入状态的值 按钮按下,但它不起作用!所有发生的事情都是arduino 延迟值仅设置为200。

原因是函数设置()和循环()是制作编程的人工构造 easier (sort of).

setup()和循环()函数是从中继承的"processing" 环境是基于OpenGL的图形编码系统。这两个 函数使得更容易解释程序是如何写入的..您 setup()中的第一个初始化变量和端口,然后执行代码 反复在循环中()。

实际上,底层编译器仅从Main()开始一个程序 并在main()结束时结束 - 没有循环!你把自己的循环滚动 必需的!在熟悉的Arduino单词之上的实际代码'setup' and 'loop'是这样的:

笔记: main()函数是首先调用的程序 在C / C ++程序中,必须始终存在编译器 不知道从哪里开始!
// main construct

void main(void) {

    设置();         // Call the user defined code for setup

    while(1) 环形(); // Continuously call the user defined code for loop.

}

如上所述'main()'被称为,首先是所有代码 执行函数设置(),然后重复调用函数循环() (在所谓的无尽循环中)。这是标准编程实践和所有 arduino代码已经完成了外层,所以它排序 简化了程序,以便您只需要编写这些功能( setup()和循环())。

但是你可以'实际上看到循环()调用(隐藏在Arduino中 代码类似于上面的代码)因为你永远不会知道main() function.

关键点是范围规则强制所有 当地的 variables 在任何功能开始并丢失的初始化 退出该功能。因此,DLY的值在循环结束时丢失() 因此,设置新值的代码无效。一切都发生了 每次启动函数时,DLY变量都会初始化为200。

笔记: 局部变量是在开始时声明的变量 功能(或在某处的函数中的C ++),您将使用它们持有 整个函数的临时值。他们在退出时丢失了 function.

要使函数记住您需要在需要之间的呼叫之间的值 静态单词变量 - 这意味着该变量的值是 没有在函数之间保留在哪里,并且在函数之间保留。

//////////////////////////////////////////////
// Arduino Delay LED flash that works
void 环形(){
static uint16_t dly=200;

  delay(dly);
  digitalWrite(LED,HIGH);
  delay(dly);
  digitalWrite(LED,LOW);

  if (digitalRead(INPUT)) dly=100; else dly=10;

}

代码 等效标准编译器系统(不使用Arduino编译器或IDE)

存在问题的真正原因是"standard compiler" program you 可以使用main()函数来写入整个东西。

警告: 这是示例代码。您无法运行此代码 Arduino IDE - 您需要使用AVR编译器(并且您需要一个 钻头也是更好的芯片设置代码)。
// main construct Full program non-Arduino compiler code.

// Arduino pins
#define INPUT 5
#define LED 13

void main(void) {
uint16_t dly=200;

    pinMode(LED,OUTPUT);       // This was the code within setup()

    while(1) {}                // Endless loop code

      delay(dly);              // This was the code within loop()
      digitalWrite(LED,HIGH);
      delay(dly);
      digitalWrite(LED,LOW);

      if (digitalRead(INPUT)) dly=100; else dly=10;
    }
}

在这种情况下,Dly的定义不需要自静态 variable'S范围是全部主要()函数。在这种情况下任何事情 在main()中可以看到并使用变量dly。

这是您最多写入的代码 自组织以来,编译器制造商并不乱弄乱给你很容易 arduino ide / compiler的路线!


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
和I wanted to say
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和perfect work.
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部