以下内容源自Mixly官方技术文档:
https://mixly.readthedocs.io/zh_CN/latest/Arduino/AVR/02Control.html
控制
控制类别中包括了时间延迟、条件执行、循环执行、获取运行时间、初始化、Switch执行等 控制模块中主要执行的内容是对程序结构进行的相应控制。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9mOTVkNDA3ZTZkNTQ1N2U2OWQ4NmQ5YTU2YzMzMDM1My8w?x-oss-process=image/format,png)
1.初始化
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9kNGQyYTUxYTg0YmNiOTI1YjM5ZTA4NzNjMDc0OGE3Mi8w?x-oss-process=image/format,png)
1 2 |
pinMode(3, OUTPUT); digitalWrite(3,HIGH); |
1.1 描述
在Arduino中程序运行时将首先调用 setup()函数。 用于初始化变量、设置针脚的输出输入类型、配置串口、引入类库文件等等。
1.2 范例1
初始化时声明变量。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC85ZTA4NTkwOGY2MWEyZWM5MTg5MWY5NjMzODQ5MWU1Ny8w?x-oss-process=image/format,png)
1 2 3 4 5 6 |
volatile int item; void setup(){ item = 0; } void loop(){ } |
1.3 范例2
在初始化时定义中断函数。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iMjM2MzdlNzBkNWNjOGFjZjc0MTQ3YWE5YmRiNmJmMy8w?x-oss-process=image/format,png)
1 2 3 4 5 6 7 8 9 10 |
void attachInterrupt_fun_2() { digitalWrite(13,HIGH); } void setup(){ pinMode(2, INPUT); pinMode(13, OUTPUT); attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_2,RISING); } void loop(){ } |
注意
每次 Arduino 上电或重启后,setup 函数只运行一次。
2.while 循环
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8yMmZiNTQ4MTM5ODZmZDA0NDQ5N2U3YTk1ZTBmNWY3Ny8w?x-oss-process=image/format,png)
2.1 描述
while循环会无限的循环,直到括号内的判断语句变为假。 必须要有能改变判断语句的东西,要不然while循环将永远不会结束。你可以使用一个传感器的值,或者一个变量来控制什么时候停止该循环。
2.2 参数
2.3 范例
当温度高于30度时,亮灯,否则灭灯。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC84MGE4Y2VjMWE5ZGY1NTY3MmNkZWEyNTcyOWYzOGI3Yy8w?x-oss-process=image/format,png)
1 2 3 4 5 6 7 8 9 |
void setup(){ pinMode(13, OUTPUT); } void loop(){ while (analogRead(A0)*0.488 > 30) { digitalWrite(13,HIGH); } digitalWrite(13,LOW); } |
3.延时
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9kNDhiNWRkZTA1OTg2ZmNjNzczNDE1MDk0NzAwMDg3MC8w?x-oss-process=image/format,png)
3.1 描述
使程序暂定设定的时间(单位毫秒)。(一秒等于1000毫秒)。
3.2 参数
3.3 范例
13号引脚灯亮1秒,灭1秒,往复循环。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iNTBlODU0YWJjODVhMjg5MmEzNTUzM2E5NDNmNjU3MC8w?x-oss-process=image/format,png)
1 2 3 4 5 6 7 8 9 |
void setup(){ pinMode(13, OUTPUT); } void loop(){ digitalWrite(13,HIGH); delay(1000); digitalWrite(13,LOW); delay(1000); } |
注意
虽然创建一个使用delay()的闪烁LED很简单,并且许多例子将很短的delay用于消除开关抖动。
但delay()确实拥有很多显著的缺点。在delay函数使用的过程中,读取传感器值、计算、引脚操作均无法执行,因此,它所带来的后果就是使其他大多数活动暂停。大多数熟练的程序员通常避免超过10毫秒的delay(),除非arduino程序非常简单。
利用定时器,就可以解决这个问题,可以避免由于delay()带来的CPU暂停,也能很好地实现每隔一定时间执行动作。
4.如果(if)
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8wZGVlNGUwN2QyN2RkYmVlYTAwOTc5NTcyZWUxM2Y3MC8w?x-oss-process=image/format,png)
4.1 描述
if 语句与比较运算符一起用于检测某个条件是否达成,如某个传感器的值是否等于某个值。
4.2 参数
4.3 用法
增加条件:如果需要增加条件,可以点开齿轮,然后将左侧的“否则如果”或者“否则”模块拖到右侧的“如果”之中。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9jZGQyOTcyNjgyOWVjMDBhNWJhNzExNDMxOWI4MDFhZi8w?x-oss-process=image/format,png)
4.4 范例1
当连接在2号引脚的按键按下时,点亮13号引脚的灯。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8xMzA3M2ZjY2Q4OGQyNTRmNTdmZGNjNTBiODk1ODMwZS8w?x-oss-process=image/format,png)
1 2 3 4 5 6 7 8 9 |
void setup(){ pinMode(2, INPUT); pinMode(13, OUTPUT); } void loop(){ if (digitalRead(2) == 1) { digitalWrite(13,HIGH); } } |
如果判断的条件大于等于1时,可以省略等于判断,因为只要 该表达式的结果不为0,则为真。
所以,上面的写法与下面的写法等效。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC81MDZhODJkODc4NDRlNjBlYjg0ZGFiYjhhMjJhZWU5Yi8w?x-oss-process=image/format,png)
1 2 3 4 5 6 7 8 9 |
void setup(){ pinMode(2, INPUT); pinMode(13, OUTPUT); } void loop(){ if (digitalRead(2)) { digitalWrite(13,HIGH); } } |
4.5 范例2
当连接在2号引脚的按键按下时,点亮13号引脚的灯;当按键松开时,灯灭。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8zODJhOTI4MjlhNDUxODEyNWRmOGNhMzdkYzYxNzFjMS8w?x-oss-process=image/format,png)
注意
另外一种进行多种条件分支判断的语句是switch case语句。
5.如果(switch)
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC84ZmMxMzFjYjgxYzM2Zjg1NDEyMDJhNzkzNjk4MzFiYi8w?x-oss-process=image/format,png)
5.1 描述
和if语句相同,switch…case通过设定的在不同条件下执行的代码控制程序的流程。
特别地,switch语句将变量值和case语句中设定的值进行比较。当一个case语句中的设定值与变量值相同时,这条case语句将被执行。
关键字break可用于退出switch语句,通常每条case语句都以break结尾。如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者直到switch语句结尾。
5.2 参数
5.3 用法
增加case:如果需要增加条件,可以点开齿轮,然后将左侧的“case”或者“default”模块拖到右侧的“switch”之中。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8wMzc1Yzc5YTFmMjNlODQzZGVjMjk3ZDFhMDhiMTRiMC8w?x-oss-process=image/format,png)
5.4 范例
当连接在2号引脚的按键按下时,点亮13号引脚的灯,否则13号引脚的灯灭
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8yMTk5NmY2ZTdhZmNjMzNiNDNkNzhiYmZmZGMzNTUyOC8w?x-oss-process=image/format,png)
注意
每个switch可以有多个case,但是最多不超过一个default,当不满足任何一个case时,执行default中的程序。
6.for循环
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC85OTMxMmZiZGMyODI3MDBiYjJlYzMyNGEwZGNkYjllOS8w?x-oss-process=image/format,png)
6.1 描述
for循环用于重复执行一段的程序。通常使用一个增量计数器计数并终止循环。
for循环用于重复性的操作非常有效,通常与数组结合起来使用来操作数据、引脚。
6.2 参数
6.3 用法
可自行设置循环的变量名称,并确定循环的开始和终止以及循环方向,最后一个数字可以为负数。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8zNTMwODFjMDIyNDhmYmI2ODIyNzc1YjljZjIxOGQ0ZC8w?x-oss-process=image/format,png)
6.4 范例
将连接在3号引脚的灯制作成呼吸灯,每一次亮度变化之间间隔50毫秒
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iZDA4OGRjZjYwZjZjY2NhNmYzMTQyOGJmMGEzMTMxNC8w?x-oss-process=image/format,png)
注意
for循环中定义的变量有名字,可以用字母i,j,k或单词red,state等有意义的词语表示。
7.跳出循环
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8xOWY2NmVmNjg2N2Y3MDQzMzZkZmQxNDhjNDk4ZjdkYy8w?x-oss-process=image/format,png)
7.1 描述
跳出循环用于终止一段重复的程序,一般使用时作为条件语句的执行部分,当循环中的变量满足某个条件时,执行跳出循环语句。
跳出循环在处理循环中的特殊情况时十分有用。
7.2 参数
7.3 范例
引脚3上的数字从0到255逐一增加,每一次增加之间间隔50毫秒,当数字增加到150时停止增加
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC84N2ZmZmVkZmFmNWVlZDU5NWIwODRmZGM5NDg4OTgwMS8w?x-oss-process=image/format,png)
注意
注意跳到下一个循环的使用,可以方便的将循环中不需要的步骤跳过。
8.系统运行时间
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC80NGJkNmYzNGI5ZGI4YTFmM2FkNzViOTAxMDMxNjQ5ZS8w?x-oss-process=image/format,png)
8.1 描述
返回自硬件启动或重启以来的时间值。
8.2 返回
自硬件启动或重启以来的时间,毫秒数或者微秒数。
8.3 范例
自动换行打印系统运行时间
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9lMzlmZjI4ZDQ5MzBjZmFmMjQ4OTQ3NmRhZGRmYWM4OS8w?x-oss-process=image/format,png)
9.MsTimer2 定时器
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iYzE5YTA2NTNjMGQwMjIxMzM1ZDRkYzA5OGMzZmQ2MC8w?x-oss-process=image/format,png)
9.1 描述
每隔设置的毫秒数执行相应的程序
9.2 范例
利用定时器控制13号引脚LED每隔1秒亮灭一次。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9jNDQ0Y2ViMjJiMzY1MGQ1MDU0NjU0MzQ5ZjZhY2M4OC8w?x-oss-process=image/format,png)
注意
利用定时器可以提高硬件的工作效率。
但在一个程序中只能使用一个MsTimer2定时器,如果要实现多个时间的定时,可以配合变量计数来完成。
10.MsTimer2 定时器启动
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC84ZjA0NWViOWM2NGM3YWE4M2E2YzFkZmJhZjU4YTJhYy8w?x-oss-process=image/format,png)
10.1 描述
MsTimer2定时器开始计时
11.MsTimer2 定时器停止
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iYjA3NTlkNTYwNGFlNzE3ZWQ0MmYzZjI1YjcyYWFhMS8w?x-oss-process=image/format,png)
11.1 描述
MsTimer2定时器停止计时
12.简单定时器
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9lZDI3MjRiY2FhZTI2MTJmYjhlYWYxM2JmNzFiYmNjZS8w?x-oss-process=image/format,png)
12.1 描述
设置不同的简单定时器,每隔指定秒数执行相应的程序常用于多任务处理。
12.2 范例
D12,D13分别连接LED灯,每隔200ms,D12引脚LED灯切换亮灭; 每隔300ms,D13引脚LED灯切换亮灭;
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iYzg3MTQ1NTc3YzM4M2I5NmVhNTU1MTI1MzMwOTNlNy8w?x-oss-process=image/format,png)
13.允许中断
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC8yNzgzZWY1ZTk1MTcwNTE2MzBmMzhiZTcwMWViZGEwZC8w?x-oss-process=image/format,png)
13.1 描述
允许输入/输出模块中管脚中断的运行
13.2 范例
使用按钮模拟开关,每次按下,LED灯切换亮灭
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iODc2YTIzMTA1OWY3ZTY3Y2FjZmZhNGIwYzAyMzg2YS8w?x-oss-process=image/format,png)
14.禁止中断
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC82MzE5ZTAzMWVkMWQxYjBhNmM2OGI4Njg0ZmNkMDhmMy8w?x-oss-process=image/format,png)
14.1 描述
禁止输入/输出模块中管脚中断的运行
14.2 范例
在允许中断范例的基础上,尝试禁止中断
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC80M2FkYzFlZWMzMDgzOWRlZjUyYThkNzdkOTkzYzZiMC8w?x-oss-process=image/format,png)
15.SCoop Task
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9iZmYzNDc0MzIwYTVmMTQxZGQ1ZGFjMWZlY2EwN2U3Mi8w?x-oss-process=image/format,png)
15.1 描述
SCoop模块用于执行多线程任务,最多支持8个任务。
15.2 范例
利用SCoop,控制13号引脚LED灯以2秒的频率闪烁,同时控制12号引脚的LED灯以200毫秒的频率闪烁。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9xcWFkYXB0LnFwaWMuY24vdHhkb2NwaWMvMC9mNDYwMWNmMWY4MmRjODZhY2E4MGI0YWFhNDI3Mzc2OS8w?x-oss-process=image/format,png)
微信关注图中张十三的博客公众号,与张十三一起探讨更多mixly开发问题:
![](https://img-blog.csdnimg.cn/20200524223847680.png)