三、Arduino编程基础
1. Arduino编程语言简介
Arduino的编程语言基于C/C++,这是一种通用的、结构化的编程语言,这意味着arduino继承了C和C++的语法和结构。它使用一些特定的函数和库,这些函数封装了与硬件交互的底层细节,使得开发者无需深入了解底层硬件即可实现基本功能,使得开发者可以轻松地控制Arduino的各种硬件特性。Arduino编程语言的一个重要特点是其简单性,使得初学者也能快速上手。在其他的控制器中,使用一个引脚点亮灯,需要配置时钟、引脚、模式、输出等操作。而在arduino中只需要2行代码即可完成点灯。
2. 常用的Arduino库和函数
❓首先什么是库和函数?
库和函数是编程中常用的概念,它们在各种编程语言中都有应用,包括Arduino所使用的C/C++语言。
- 库(Library): 库是一组函数的集合,这些函数经过封装之后可以作为一个整体被调用。库通常包含了一些常用函数,用于实现特定的功能或操作。例如,Arduino中包含了一些标准库,这些库提供了与硬件交互的常用函数,使得开发者可以轻松地控制LED灯、读取传感器等。得馈于arduino开源社区的发展,有很多的创客自主提交了自己编写的库,我们可以直接将其下载下来应用。例如你想要控制一辆小车,那么你需要配置好引脚,设置好小车如何前后左右的动作,你需要配置很多的代码;而如果社区里有人专门提交了小车的库,那么你只需要根据库的介绍,快速完成小车的设置。配置引脚的初始化步骤只需要一行代码,前后左右动作也可能只需一行代码。
- 函数(Function): 函数是编程中的基本单位,它是一段可以被重复调用的代码块,用于完成特定的任务。函数有一个名称,通过这个名称可以在程序中调用它。函数可以接受输入参数,并返回一个结果。在Arduino中,许多预定义函数都是以库的形式提供的,开发者可以直接调用这些函数而无需编写底层代码。
综上所述,库和函数都是为了提高代码的可重用性和简洁性而存在的。通过使用库和函数,开发者可以更加高效地编写程序,同时减少错误和代码冗余。在Arduino开发中,合理使用库和函数可以大大简化与硬件的交互,提高开发效率。
Arduino IDE自带了许多库,这些库提供了许多常用的函数,使得开发者可以方便地使用各种硬件特性。例如,pinMode()
函数用于设置数字引脚的模式(输入或输出),digitalWrite()
函数用于向数字引脚写入值(高电平或低电平),digitalRead()
函数用于读取数字引脚的电平值。
此外,还有一些第三方库,这些库提供了更为复杂的功能。例如,Servo
库用于控制舵机,IRremote
库用于控制红外遥控器等。
3. Arduino的数据类型和变量
在Arduino编程中,数据类型和变量是基础概念,它们决定了如何存储和处理数据。Arduino编程语言支持C/C++的所有基本数据类型,如int、float、char等。此外,Arduino还定义了一些特殊的数据类型,如byte
(一个8位的无符号整数)、word
(一个16位的无符号整数)等。
📌数据类型(Data Types)
数据类型是用于声明变量、函数参数和函数返回值的类型。在Arduino编程中,主要使用以下几种数据类型:
- byte: 一个8位的无符号整数,范围从0到255。常用于读取数字引脚的状态或表示颜色值。
- int: 一个32位的整数,根据平台和编译器有所不同,但通常范围从-2147483648到2147483647。
- float: 一个32位的浮点数,用于需要小数点数值的场合。
- double: 一个64位的浮点数,比float具有更高的精度和范围。
- char: 一个8位的字符,用于存储ASCII码。
- String: 用于存储和操作文本数据。
📌变量(Variables):
变量是用于存储数据的容器。在Arduino编程中,你可以声明一个变量来存储特定类型的数据。以下是关于Arduino变量的一些要点:
- 声明变量: 要声明一个变量,你需要指定其数据类型和一个名称。例如,要声明一个整数变量并命名为
myVariable
,你可以使用int myVariable
;。 - 初始化变量: 在声明变量的同时,你可以指定其初始值。例如,
int myVariable = 10
;将声明一个名为myVariable
的整数变量并将其初始化为10。 - 作用域: 变量的作用域决定了它在哪里可用。在Arduino中,变量的作用域可以是局部(在函数内部)或全局(在整个程序中)。
- 常量: 使用
const
关键字声明的变量是常量,其值不能被修改。例如,const int myConstant = 20;
将声明一个常量整数。 - 变量的生命周期: 变量的生命周期取决于其作用域。在函数内部声明的变量在其生命周期内存在,而全局变量在整个程序运行期间都存在。
- 隐式类型转换: 在某些情况下,Arduino会隐式转换数据类型。例如,当一个byte类型的值与int类型的值进行算术运算时,Arduino会自动将byte转换为nt。
变量是用来存储数据的。在Arduino中,你可以声明一个变量来存储一个值。例如,你可以声明一个int
类型的变量来存储一个整数。这里举一个例子,我们都知道灯是什么样子,一说到灯我们都知道是什么,灯的实物就是它的载体;但是电脑或者程序关于灯的载体是什么?我们要如何告诉电脑,这个玩意就是灯?在程序里我们就可以定义一个变量来装载灯的概念,比如我定义了一个变量叫 LED
,后面关于灯的操作,我们都可以用它进行。比如让灯打开,就是LED.on()
,让灯关闭,就是LED.off()
。 关于这些数据类型和变量的概念,在后面的实例验证中,我们用到的地方,将会详细说明。
4. 控制结构和流程控制
Arduino编程语言支持一些控制结构和流程控制语句,如if-else语句、switch语句、for循环、while循环等。在编程中,控制结构和流程控制是实现特定逻辑和算法的关键部分,它们决定了代码的执行顺序和条件。这些控制结构和流程控制语句可以帮助你编写更复杂的程序。
以下是在Arduino编程中常用的控制结构和流程控制:
控制结构(Control Structures):
控制结构决定了代码的执行路径。在Arduino编程中,主要有以下几种控制结构:
- if语句: if语句用于根据条件执行代码块。如果条件condition为真,那么将执行里面的代码;如果为假则跳过不执行。语法如下:
if(condition)
{
// 条件为真时执行的代码
}
2
3
4
✔在编程和代码程序中,"真"和"假"通常是指布尔逻辑中的两个基本状态,它们对应于二进制系统中的1和0。其中任何非0的值都是真,只有为0时是假。
在编程中:
- 真(true): 表示条件成立、表达式有效或某个操作的结果符合预期。例如,在比较两个值时,如果它们相等,则比较的结果为
true
。 - 假(false): 表示条件不成立、表达式无效或某个操作的结果不符合预期。如果两个比较的值不相等,则比较的结果为
false
。
这些布尔值在控制程序流程时非常有用,例如在if
语句、while
循环和条件运算符中。
✔举个例子,你现在有一个按键和一个灯,老板要你通过arduino实现按下按键,灯就亮,你要如何实现?你可以通过if语句这样写:
if ( 按键按下 )
{
灯亮
}
2
3
4
这个if语句就相当于中文的“如果”的意思。
- if-else语句: if-else语句允许你根据条件执行两个不同的代码块。语法如下:
if (condition)
{
// 条件为真时执行的代码
}
else
{
// 条件为假时执行的代码
}
2
3
4
5
6
7
8
✔再继续之前的例子,现在老板要你通过arduino实现按下按键,灯就亮;松开按键,灯就灭。你要如何实现?你可以通过if-else语句这样写:
if ( 按键按下 )
{
亮灯
}
else
{
灭灯
}
2
3
4
5
6
7
8
这个else就是当你的if语句无法成立时执行,相当于中文的“否则”的意思。
- switch语句: switch语句用于根据不同的条件执行不同的代码块。它通常用于多个选项的情况。语法如下:
switch ( 变量 )
{
case 值1:
// 如果变量是值1,执行的代码
break;
case 值2:
// 如果变量是值2,执行的代码
break;
case n:
...
default:
// 在所有情况都不匹配时执行的代码
}
2
3
4
5
6
7
8
9
10
11
12
13
✔我们举个例子,老板要你根据电压大小,来确定灯的状态;电压为5V时,灯慢闪;电压为3V时,灯快闪;电压为0V时,灯常亮;你要如何实现这个功能?你可以通过switch 语句这样写:
switch ( 电压值 )
{
case 5:
灯慢闪
break;
case 3:
灯快闪
break;
case 0:
灯常亮
default:
灯灭
}
2
3
4
5
6
7
8
9
10
11
12
13
- for循环: for循环用于 重复执行 一段代码 特定次数,直到某个条件不再满足。语法如下:
for (initialization; condition; update)
{
// 在循环中执行的代码
}
2
3
4
initialization(初始化):
- 这是循环开始之前,只执行一次的代码块。通常用于设置循环所需的一些初始值或状态。
- 例如,
int i = 0;
在一个计数循环中,i
被初始化为0。
condition(条件):
- 这是一个布尔表达式,每次循环迭代时都会被评估。
- 如果这个条件为真,循环体会继续执行。如果条件为假,循环将停止。
- 例如,在计数循环中,条件可能是
i < 10
,意味着当i
小于10时,循环继续执行;i大于或者等于10时,循环将停止。
update(更新):
- 在每次循环迭代结束后执行的代码块。通常用于更新循环控制变量的值。
- 例如,在计数循环中,更新可能是
i++
,意味着每次循环后,i
的值增加1。
✔举个例子,老板让你输出调试的数据,要连续输出10次,你该如何以简单快速的方法实现?你可以这样写:
for (int i = 0; i < 10; i++)
{
//输出调试的数据
}
2
3
4
int i = 0;
是初始化部分,将变量i
设置为0。i < 10
是条件部分,只要i
的值小于10,循环就会继续。i++
是更新部分,每次循环后都会增加i
的值。
- while循环: while循环用于在条件为真时重复执行一段代码。语法如下:
while (condition)
{
// 在循环中执行的代码
}
2
3
4
继续按照上面那个例子,你可以这样写:
int i = 10;
while( i )
{
//输出调试的数据
i = i - 1;
}
2
3
4
5
6
- do-while循环: do-while循环与while循环类似,但至少会执行一次代码块,然后再检查条件。它与while不同的地方就是先执行在判断,判断完成之后再确定是否要执行。语法如下:
do {
// 在循环中执行的代码
} while (condition);
2
3