| 前一修订版 |
— | learing:examples:blinkwithoutdelay [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 |
---|
| ====== Blink Without Delay(不使用delay来使LED闪烁) ====== |
| |
| <WRAP left round info 75%> |
| 有时候你需要同时做两件事,比如读取按键信息的同时想点亮熄灭一个LED,在这种情况下,你可能不会想去用[[reference:language:delay|delay()]]函数,因为使用[[reference:language:delay|delay()]]的时候会中断你的控制器其他工作。如果控制器执行delay的时候你按下了按键,这样就会错过按键按下的信息。 |
| |
| 这个例程教你不用[[reference:language:delay|delay()]]来使一个LED闪烁。点亮LED后记录时间。在[[reference:language:loop|loop()]]中,它会检测需要点亮的LED的时间是否到了。如果到了,就触发点亮或者熄灭LED,重新记录时间,这样LED就可以持续的闪烁。 |
| |
| 类似的就像你在微波炉里做披萨,同时等着接收重要的邮件。你把披萨放在微波炉,设置10分钟,同样的[[reference:language:delay|delay()]]就是设置一个十分钟的计时器直到微波炉到0,如果重要的邮件在此之间来了,你就错过了这个邮件。 |
| |
| 你再真实世界里要做的就是放好披萨,检查邮件,还可以去做一些其他的不太占用很多时间的事,然后你再回来看微波炉是否到0了,到了0就表明披萨做好了。 |
| |
| 这个例子里你会学到怎么设置一个类似的计时器。 |
| </WRAP> |
| |
| <WRAP left round box 100%> |
| ===== ALPHA MEGA328-U核心 ===== |
| ==== 硬件 ==== |
| |
| * [[ocrobot:alpha:parallelexpansion:index|ALPHA 并行扩展板]] |
| * [[ocrobot:alpha:mega328-u:main|ALPHA MEGA328-U]] |
| * [[ocrobot:alpha:11led:index|ALPHA 11 LED模块]] |
| |
| |
| ==== 搭建电路 ==== |
| |
| - ALPHA 11 LED模块插入并行扩展版1号槽位。 |
| - ALPHA MEGA328-U模块插入并行扩展板2号槽位。 |
| - USB线连接计算机与ALPHA MEGA328-U。 |
| |
| ==== 代码 ==== |
| |
| <code cpp>/* Blink without Delay |
| 不使用delay函数来使一个连接在数字口的LED闪烁,这意味着别的代码可以同时执行,而不会被LED的代码打断。 |
| */ |
| |
| // 设置LED的引脚 |
| const int ledPin = 2; |
| |
| // 变量: |
| 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; |
| |
| // 如果LED灭了就点亮它 ,反之亦然: |
| if (ledState == LOW) |
| ledState = HIGH; |
| else |
| ledState = LOW; |
| |
| // 设置变量ledState为LED数字输入: |
| digitalWrite(ledPin, ledState); |
| } |
| }</code> |
| |
| <WRAP left round tip 100%> |
| 这个例子中我们使用了一个新函数:[[reference:language:millis|millis()]]。该函数返回[[knowledge:electronic:mcu|MCU]]运行当前程序从开始到现在的毫秒数。 |
| </WRAP> |
| </WRAP> |
| |
| <WRAP left round box 100%> |
| ===== ALPHA 8F328D-U核心 ===== |
| ==== 硬件 ==== |
| |
| ==== 搭建电路 ==== |
| |
| ==== 代码 ==== |
| </WRAP> |
| |
| |
| <WRAP left round box 100%> |
| ===== MangoII ===== |
| |
| ==== 硬件要求 ==== |
| |
| |OCROBOT控制器| |
| |LED| |
| |220到1K欧姆电阻| |
| |导线| |
| |
| 开始搭建电路,连接电阻到控制器的13号脚,连接LED的长脚到电阻的另一端,连接LED的短脚到控制器的GND。 |
| |
| 部分控制器在13号脚连接了一个LED,这些控制器如果你没连接外围设备运行这个程序,就可以看到13号的那个LED闪烁。 |
| |
| 连接好电路之后,把控制器接到电脑上,打开IDE下载好代码。 |
| |
| ==== 代码 ==== |
| |
| 下面使用到了millis()功能,一个返回自从控制器的程序启动后到现在时间的毫秒数的命令,来控制LED闪烁。 |
| |
| <code cpp>/* Blink without Delay |
| 不使用delay函数来使一个连接在数字口的LED闪烁,这意味着别的代码可以同时执行,而不会被LED的代码打断。 |
| 电路: |
| LED 连接在13号脚和GND之间 |
| */ |
| |
| // 设置LED的引脚 |
| const int ledPin = 13; |
| |
| // 变量: |
| 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; |
| |
| // 如果LED灭了就点亮它 ,反之亦然: |
| if (ledState == LOW) |
| ledState = HIGH; |
| else |
| ledState = LOW; |
| |
| // 设置变量ledState为LED数字输入: |
| digitalWrite(ledPin, ledState); |
| } |
| }</code> |
| </WRAP> |