Arduino独立多任务Sketch示例分析
多任务
在学习了如何在Arduino上使单个LED闪烁后,您可能正在寻找一种制作炫酷图案的方法,但是由于使用delay()而感到受限。本示例介绍了用状态机替换delay()的想法。
基本延时
您可能已经熟悉了Arduino IDE中第一个代码示例 “ Blink”。
void setup() {pinMode(13, OUTPUT);
}void loop() {digitalWrite(13, HIGH); // set the LED ondelay(1000); // wait for a seconddigitalWrite(13, LOW); // set the LED offdelay(1000); // wait for a second
}
依次读取loop()的每一行sketch:
- 打开引脚13的LED
- 等待1秒(或1000毫秒)
- 等待1秒
- 然后整个序列重复
潜在的问题是,当您坐在delay()上时,您的代码无法执行其他任何操作。因此,让我们看一个示例,在整个1000毫秒内您都不会“阻塞”。
for()循环的基本延迟
对于第二个示例,我们将仅延迟1毫秒,但在for()循环内进行延迟。
void setup() {pinMode(13, OUTPUT);
}void loop() {digitalWrite(13, HIGH); // set the LED onfor (int x=0; x < 1000; x++) { // Wait for 1 seconddelay(1);}digitalWrite(13, LOW); // set the LED onfor (int x=0; x < 1000; x++) { // Wait for 1 seconddelay(1);}
}
这个新sketch将完成与示例1相同的顺序。 区别在于Arduino一次仅“延迟”一毫秒。 一个聪明的技巧是在for()循环内调用其他函数。 但是,您的时序将会关闭,因为这些说明会增加额外的延迟。
带2个LED的for()循环
在此示例中,我们在引脚12上添加了第二个LED(带有限流电阻!)。现在,让我们看看如何编写示例2中的代码以使第二个LED闪烁。
void setup() {pinMode(13, OUTPUT);pinMode(12, OUTPUT);
}void loop() {digitalWrite(13, HIGH); // set the LED onfor (int x=0; x < 1000; x++) { // wait for a secoonddelay(1);if (x==500) {digitalWrite(12, HIGH);}}digitalWrite(13, LOW); // set the LED offfor (int x=0; x < 1000; x++) { // wait for a secoonddelay(1);if (x==500) {digitalWrite(12, LOW);}}
}
从第一个for()循环开始,当引脚13为高电平时,引脚12将在for()循环中经过500次后导通。 看来引脚13和引脚12依次闪烁。 引脚13开启后,引脚12将开启1/2秒。 1/2秒后,引脚13断开,然后引脚12再断开1/2秒。
如果要添加其他LED或更改顺序,则必须开始精通所有if语句。 就像示例2一样,这些LED的时序将关闭。 if()语句和digitalWrite()函数都需要时间,从而增加了“ delay()”。
ledState = !ledState;
这行代码会将ledState的值设置为相应的值。如果为true,则为false。如果为false,则为true。
digitalWrite(13, ledState); // sets the LED based on ledState
警灯示例
本示例说明如何创建类似警灯的频闪效果。以下代码不使用对delay()的调用。
</>
状态变量
Red_State和Blue_State
代替直接使用digitalWrite(),“状态”变量用于确定每个LED的状态(开或关)。 这允许loop()内部的逻辑确定何时应打开或关闭灯。 loop()的每次迭代将基于此状态变量使用digitalWrite()更新LED。
whichLED
使用几个#define语句,此变量可跟踪在给定时间应选通哪个LED。 #define语句是可选的,但使代码易于在以后使用(第46行)。
等待变量
strobeWait
此变量确定当前选通的LED的速率。它由strobeDelay递增。 [注意:频闪延迟必须比switchDelay小数倍才能产生频闪效果。]
第一个if语句检查是否到了切换活动LED的时间。 它确保在设置状态之前禁用两个LED,因此不会“卡死”一个LED。
独立开关定时示例
当使用delay()使LED闪烁时,LED会先打开然后关闭。这使得轻松控制“开”和“关”时间变得容易。标准闪烁无延迟示例并不能为您提供这种灵活性。
该示例代码使您可以完全独立地控制LED(或任何OUTPUT引脚)保持“ ON”或“ OFF”的时间。这也演示了一个非常简单的两态状态机。
</>
马表示例
由于大多数Arduino板都不具有调试功能,因此这限制了程序员使用Serial.prints。一条有用的信息可能是知道代码的某些部分运行了多长时间。这是一个简单的示例进行演示:
- 如何正确使用Serial.flush()(提示:这是针对TRANSMIT,而不是RECEIVE!)
- Serial.print()可以“捆绑” Arduino多长时间
在9600波特的情况下,您会看到Arduino在第一段代码中仅忙于20毫秒,而在接下来的代码中仅忙于93毫秒。 这是因为Arduino(从1.0版开始)开始使用传输缓冲区。 您知道代码不等待Serial.print完成吗?
实验尝试
更改波特率
添加(或删除)文本以查看时间变化
在每个Serial.print()之后放置delays()
</>
## 追逐LED最受欢迎的LED项目是“拉森扫描仪”。 该代码通常使用“ delay()”编写,这意味着您无法将其与其他任何内容组合使用。 可以将以下代码放入定期调用的函数中,并在执行其他操作时扫描您的代码。需要注意的一件事是,适当的Larson扫描仪对下一个和上一个LED具有一定的持久性,而此代码则没有。
</>
Defines定义为我们提供了计数器运行的方向。我使用了任意名称“ UP”和“ DOWN”,但可以使用“ LEFT”和“ RIGHT”。引脚排列为了简化寻址哪些引脚连接到LED的顺序(以及顺序),将按照LED的连接顺序创建一个阵列。 如果这是您在项目中要做的唯一事情,那么您可能会像示例一样按顺序排列图钉。 使用阵列可以使用任何可用的引脚。LED状态和转换此代码中的“魔术”是LEDstate的转换。十六进制值0x01是初始状态。每次迭代时,变量都会向左或向右移动一次。因此,这将是:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
0010 0000
0001 0000
0000 1000
0000 0010
0000 0001
当序列越过一位时,序列会以“播种”一位复位。
turnOnAll
为了测试以确保正确连接了LED,我提供了打开所有LED的函数。
防抖动按钮
Arduino快速,人类慢。 当您按下一个按钮时,对人类缓慢的动作似乎只是一次改变,实际上是对Arduino的多次按下。 这称为“抖动”。 图1是示波器屏幕截图,显示了按下按钮时可能发生的情况。
顶部轨迹显示了按钮按下的高-低-高过渡。 但是,请注意从高到低过渡开始时的所有活动。 底部轨迹是该区域的“放大”视图。 实际上,该按钮在切换到较低位置之前已多次转换。 内部连接“抖动”。 这可能会导致错误的读取。 在软件中,我们可以通过在第一次转换后等待一段时间来忽略这些反弹。
使用LED显示抖动
在此代码示例中,针脚13上的LED设置为显示针脚2上的输入状态。 图2是示波器屏幕截图,其中通道1(黄色)是按钮,通道2(蓝色)是LED。 请注意,LED的功能与按钮的功能完全相同。
防抖动开关
使用下面的代码,可以正确地“消除抖动”按钮,以便出现图3。 在按钮第一次转换之后,在之前预定义的时间内必须切换LED(或OUTPUT)。 因此,会有一点延迟,但是,LED不再闪烁,或更准确地说,抖动。
示例代码
请注意,该代码利用了内部上拉电路,但并不关心您的开关是连接到低电平有效还是低电平有效。 由于使用了内部上拉电阻,因此您需要将一个按钮的一端连接到引脚2,并接地。 变量“ buttonWaitInterval”是根据开关设置的,并确定“去抖动”所用的时间。
延迟事件
详情参阅 - 亚图跨际
Arduino独立多任务Sketch示例分析相关推荐
- Hadoop之图解MapReduce与WordCount示例分析
Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...
- 基于深度学习的多任务人脸属性分析(基于飞桨PaddlePaddle)
目录 一.概述 1.1 多任务人脸属性分析 1.2 本文任务 二.环境配置 2.1 安装PaddlePaddle 2.2 安装PaddleClas 三.算法模型开发 3.1 算法原理 3.2 数据集准 ...
- 嵌入式操作系统多任务调度原理分析与RUST参考实现
操作系统多任务调度原理分析与RUST参考实现 作为一名在软件领域工程师,在职业生涯的尽头能有幸接触到一部分硬件产品是我莫大的荣幸.秉承我一贯刨根问底,不搞清楚问题本质不罢休的作风和态度,结合基本的计算 ...
- 2022CTF培训(十三)虚拟化QEMU架构分析QEMU CVE示例分析
附件下载链接 虚拟化技术基本概念 硬件虚拟化 全虚拟化 提供可以完全模拟基础硬件的VME 可以在VM中运行任何能够在物理硬件上执行的软件,并且可以在每个单独的VM中运行基础硬件支持的任何OS 为每个V ...
- TVM开发三个示例分析
TVM开发三个示例分析 把自主生成的代码生成TVM 把自主生成的代码生成TVM 目录 简介 要生成C代码. 要生成任何其它图形表示. 实现一个C代码生成器 实现[CodegenC] 运算符代码生成 输 ...
- Deep Manta:单目图像下2d到3d由粗到精的多任务网络车辆分析
原文首发于微信公众号「3D视觉工坊」--Deep Manta:单目图像下2d到3d由粗到精的多任务网络车辆分析 外文原文:Deep manta: A coarse-to-fine many-task ...
- Android涂鸦技术及刮刮乐示例分析
概述: 很早之前就想研究一下Android中的涂鸦,其实也说不上是研究了,毕竟都是一些相对比较简单的知识点.下面就对基于画布(Canvas)和触摸事件(onTouchEvent)来实现涂鸦和刮刮乐. ...
- 计算机网络时延图,计算机网络中网站性能延迟加载图像的示例分析
计算机网络中网站性能延迟加载图像的示例分析 发布时间:2021-06-09 11:38:56 来源:亿速云 阅读:95 作者:小新 这篇文章给大家分享的是有关计算机网络中网站性能延迟加载图像的示例分析 ...
- nodejs ajax进度条,Ajax异步文件上传与NodeJS express服务端处理的示例分析
Ajax异步文件上传与NodeJS express服务端处理的示例分析 发布时间:2021-07-24 11:17:21 来源:亿速云 阅读:79 作者:小新 这篇文章主要介绍Ajax异步文件上传与N ...
最新文章
- 2022-2028年中国SUV市场投资分析及前景预测报告
- 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
- php 公共的 受保护的,php-不使用$this-gt;调用受保护的属性
- OpenCV学习笔记2---命名规约
- Centos7_ELK5.4.1配置部署
- linux的swap增加的二个办法
- 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器
- Linux PPP实现源码分析-1
- 【DCVRP】基于matlab遗传和粒子群算法求解带容量的车辆路径规划问题【含Matlab源码 1034期】
- java排序_Java实现九种排序算法3:插入排序之希尔排序
- CSDN新版下载频道介绍之三——用户权限及积分规则详解
- Educational Codeforces Round 118 (Rated for Div. 2)
- 关于逻辑关系 “隐含(implies、p-q) 的理解
- 服务器 t610硬盘开关,戴尔服务器T610
- 网站中qq 跳转 和qq群问题
- windows服务器如何搭建网站,Windows系列服务器网站搭建详细过程
- 【Golang源码阅读】strings/builder.go
- 期货反跟单-千万不要盲目开始反跟单交易
- PHP微信固码免签系统源码+带监控APP和教程
- 图像修复 python_用python进行图像修复与去除水印