2. Arduino基础
Arduino编程语言是一种基于类C语言的语法,旨在让初学者更容易地学习和理解编程。和C语言类似,Arduino语法是一种结构化编程语言,其中包含常见的编程结构,例如if语句、for循环、函数和变量。
与C语言相比,Arduino语法更加简单易懂,更加注重人机交互。例如,Arduino经常使用自然语言的术语,例如“pin”(引脚)和“serial”(串行)作为关键字。此外,Arduino在编程环境中提供了许多内置函数,这些函数可以使编程更加简单。
Arduino的语法设计旨在让用户可以快速入门,不需要过多专业编程知识。仅仅了解一些基础语法规则和常用函数就可以轻松上手编写代码。简单易懂的语法和逻辑结构也使得Arduino非常适合用于构建简单的物联网设备和机器人等工程项目。以下目录是一些 Arduino 编程的主要组成部分和基本语法。
2.1 结构
Arduino 程序(被称为 “sketch”,草图)通常包括两个主要函数:
setup()
: 这个函数在程序启动时运行一次。通常用于初始化引脚模式、启动库等。loop()
: 这个函数在setup()
函数执行后就反复运行。用于执行程序的主要逻辑。 通常创建一个新工程,都是以setup()
和loop()
为模板。
2.2 变量和数据类型
Arduino 支持标准的 C/C++ 数据类型,如 int
、float
、char
、boolean
等。变量需要在使用前声明,并可以在声明时赋值。
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 | |
unsigned char | 1字节 | 0 到 255 | |
signed char | 1字节 | -128 到 127 | |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 | |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 | |
short | 2 字节 | -32,768 到 32,767 | |
unsigned short | 2 字节 | 0 到 65,535 | |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 | |
unsigned long | 4 字节 | 0 到 4,294,967,295 | |
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位有效位 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位有效位 |
long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 |
示例:
int ledPin = 13; // 声明一个名为'ledPin'的整数变量,并设置其值为13
float sensorValue = 0.0; // 声明一个名为'sensorValue'的浮点数变量,初始值为0.0
bool isButtonPressed = false; // 声明一个名为'isButtonPressed'的布尔变量,初始值为false
char receivedChar = 'A'; // 声明一个名为'receivedChar'的字符变量,并设置其值为'A'
2
3
4
经常有人在使用char类型时没有注意值范围,导致了死循环。如下代码:
cchar number = 0; for(number = 0; number < 1000; number++ ) { ... }
1
2
3
4
5
以上代码要number自加到1000才会结束for循环,而char的范围是0-255,会导致无法结束循环。
2.3 函数
函数是一段封装了特定功能的可复用代码块,在程序中可以被调用执行。Arduino编程语言提供了很多的内置函数,可以满足常见的硬件操作和数据处理需求。关于常用的内置函数,我们将在后面各个章节进行讲解。Arduino也支持自定义函数,函数包括返回类型、函数名和参数列表。 下面以实现一个简单的数字计数器为例,来展示Arduino中函数调用的用法。
首先,我们设定一个全局变量counter来表示计数器当前的值:
int counter = 0;
然后,我们定义两个函数inc()和subtract(),分别用来实现计数器加1和相减:
//函数定义:无返回值和参数
void inc()
{
counter=counter+1;
}
// 函数定义:带返回值和传入参数
int subtract(int a, int b)
{
int sum = a - b;
return sum;
}
2
3
4
5
6
7
8
9
10
11
12
注意,这里的函数 inc()
没有任何返回值,也没有参数,因为它直接操作了全局变量counter。现在我们已经定义好了两个函数,接下来就可以在程序的其他地方调用它们来实现计数器的加减。
例如,在setup()函数中,我们可以通过调用inc()函数来将计数器初始化为1:
//只执行一次
void setup()
{
//串行端口初始化
Serial.begin(115200);
// counter值加1,因为只执行一次,所以计数器初始化为1
inc();
}
2
3
4
5
6
7
8
在loop()函数中,我们可以通过检测按钮的状态来调用inc()或dec()函数来实现计数器的加减:
//循环显示
void loop()
{
// 检测按钮是否被按下
if(digitalRead(BUTTON_PIN) == HIGH)
{
inc(); // 按钮按下,计数器加1
}
else
{
subtract(counter,1); // 按钮没有按下,计数器减1
}
// 在串行端口显示计数器的值
Serial.println(counter);
// 延时100毫秒
delay(100);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这个例子中,我们通过调用inc()和subtract()函数来实现计数器的加减,并使用Serial.println()函数将计数器的值输出到串行端口上。
2.4 控制结构
Arduino 支持标准的 C/C++ 各种控制结构,如 if
、else
、switch
、for
、while
和 do-while
。这些结构用于条件判断和循环。
- 条件语句(if-else语句):该结构根据给定条件来执行不同的代码分支。
if (条件) {
// 代码块1
} else {
// 代码块2
}
2
3
4
5
当条件成立时,执行代码块1;当条件不成立时,执行代码块2;例如:
int value = 0;
if( value == 0 )
{
value = 10;
}
else
{
value = 20;
}
2
3
4
5
6
7
8
9
10
当执行以上代码时,value的值为10。
- 循环语句(for循环、while循环、do-while循环):这些结构会重复执行一段代码,直到满足特定条件。
for (初始化; 循环条件; 更新表达式) {
// 代码块
}
while (条件) {
// 代码块
}
do {
// 代码块
} while (条件);
2
3
4
5
6
7
8
9
10
11
例如:
int value = 0;
//----------------------------------
for (value = 2; value > 0; value--)
{
//将执行两次
}
//----------------------------------
while (value < 5)
{
value++;//将执行5次
}
//----------------------------------
do
{
value--;//将执行5次
} while (value > 0);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 开关语句(switch-case语句):用于根据不同的情况执行不同的代码块。
switch (变量) {
case 值1:
// 代码块1
break;
case 值2:
// 代码块2
break;
// ...
default:
// 默认代码块
break;
}
2
3
4
5
6
7
8
9
10
11
12
2.5 库
Arduino 中有许多现成的函数库,用于实现特定功能或与特定硬件交互。库可以通过 #include 指令包含在程序中,然后就可以使用库中的功能了。
Arduino是一种开源电子平台,它提供了一个简单易用的软硬件环境,用于制作各种互动项目和原型。Arduino库是为了帮助开发者更方便地编写代码而提供的软件组件集合。这些库提供了各种功能和功能模块,用户可以直接在Arduino项目中使用它们,而无需从头开始编写底层代码。 以下是一些常用的Arduino库:
序号 | 名称 | 作用 |
---|---|---|
1 | Wire 库 | 用于I2C(双线串行总线)通信 |
2 | SPI 库 | 用于SPI(串行外设接口)通信 |
3 | Serial 库 | 用于串行通信(例如与计算机或其他设备进行通信) |
4 | WiFi 库 | 用于使用WiFi连接到网络 |
5 | Servo 库 | 用于控制舵机 |
6 | SD 库 | 用于读写SD卡存储器 |
7 | Stepper 库 | 用于控制步进电机 |
8 | DHT 库 | 用于与DHT系列温湿度传感器进行通信 |
这些只是一小部分Arduino库的例子。除了官方库之外,还有许多由Arduino社区开发的第三方库可供使用。在使用Arduino库时,通常需要在代码的顶部包含库的头文件,通过 #include 指令包含在程序中,然后就可以使用库中的功能了。
2.6 简单应用验证
以下是一个简单的 Arduino 程序示例,它在输出引脚GPIO13上循环闪烁一个 LED:
//定义一个常量,int类型的名称为ledPin,赋初值为13
const int ledPin = 13;
//只执行一次
void setup() {
//调用函数pinMode, 设置 ledPin 引脚为OUTPUT(输出模式)
pinMode(ledPin, OUTPUT);
}
//持续循环
void loop() {
//调用内置函数digitalWrite,设置 ledPin 引脚输出HIGH(高电平)
digitalWrite(ledPin, HIGH);
//调用内置函数delay,延时100毫秒
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17