初识 Arduino 编程语言

罗大富 BigRich大约 12 分钟ESP32Arduino

我们说过 Arduino 是基于 C++,我们需要了解一下,Arduino 的语法以及如何使用。

注释

当你编写代码时,注释(comments)是非常重要的一部分。注释是对代码的解释和说明,而且对于其他开发者或者自己日后需要修改代码的时候,都非常有帮助。注释可以提高代码的可读性和可维护性,并且可以帮助你自己更好地理解代码。

注释是由双斜线 // 或者斜线星号 /*...*/ 来表示的。单行注释以两个斜线开头,多行注释则以斜线星号开头,以星号斜线结尾。例如:

// 这是一个单行注释

/*
这是一个多行注释
它可以跨越多行
*/

注释可以用来解释代码的功能,算法或者实现细节。例如,以下是一些常见的注释用法:

  • 函数或者方法的用途
  • 参数的说明
  • 返回值的说明
  • 代码实现的说明
  • 代码的限制或者假设条件
  • 作者信息、创建时间、修改时间等等

注释应该尽可能的清晰、简洁和明了,同时避免使用无用的注释,以免给代码带来混淆和干扰。注释应该随着代码一起更新,以确保注释和代码的一致性。

变量

当我们编写程序时,变量是一个非常基本的概念。一个变量可以存储一个值,这个值可以是数字、字符串、布尔值、对象等。

在 Arduino 编程语言中,变量需要在使用前声明,声明语法为:

数据类型 变量名;

数据类型指定变量可以存储的数据类型,常见的数据类型有:

  • int:整数类型,占用2个字节,可以表示范围为 -32768 到 32767 之间的整数。
  • float:浮点数类型,占用4个字节,可以表示小数。
  • char:字符类型,占用1个字节,可以表示一个字符。
  • bool:布尔类型,占用1个字节,只有两个值:true 或 false。

变量名是标识符,命名规则为字母、数字、下划线的组合,第一个字符不能是数字。

下面是一些变量的示例:

int a; // 声明一个名为 a 的整型变量
float b = 3.14; // 声明一个名为 b 的浮点型变量,并初始化为 3.14
char c = 'A'; // 声明一个名为 c 的字符型变量,并初始化为字符 'A'
bool d = true; // 声明一个名为 d 的布尔型变量,并初始化为 true

变量在程序中可以被赋值或者修改:

int a = 10; // 初始化 a 为 10
a = 20; // 修改 a 的值为 20

除了上述基本数据类型外,Arduino 还支持其他的数据类型,如字符串类型 String,数组类型等。在使用变量时,需要根据需求选择合适的数据类型,避免浪费内存。

条件语句

当我们需要根据某个条件来执行不同的代码时,就需要使用条件语句。在 Arduino 编程语言中,常见的条件语句有 if 语句和 switch 语句。

if 语句

if 语句是最基本的条件语句,其语法如下:

if (condition) {
  // if 条件成立时要执行的代码
}

其中,condition 是一个条件表达式,如果这个条件表达式的值为真,则执行花括号中的代码块。

如果需要在条件不成立时执行代码,则可以添加 else 语句:

if (condition) {
  // if 条件成立时要执行的代码
} else {
  // if 条件不成立时要执行的代码
}

当然,也可以在 else 语句后面添加一个 if 语句,从而实现多个条件判断。这个语法结构被称为 else if

if (condition1) {
  // if 条件 1 成立时要执行的代码
} else if (condition2) {
  // if 条件 2 成立时要执行的代码
} else {
  // 如果以上条件都不成立,则执行这里的代码
}

switch 语句

switch 语句也是一种条件语句,通常用于比较一个变量与一系列常量值。其语法如下:

switch (variable) {
  case value1:
    // 如果 variable 的值等于 value1,则执行这里的代码
    break;
  case value2:
    // 如果 variable 的值等于 value2,则执行这里的代码
    break;
  default:
    // 如果 variable 的值不等于任何一个 case 的值,则执行这里的代码
    break;
}

switch 语句中,variable 是要进行比较的变量,而 case 是常量值。如果 variable 的值等于某个 case 的值,则执行该 case 对应的代码块,并且在代码块末尾添加 break 语句,以防止执行其他的 case。如果 variable 的值不等于任何一个 case 的值,则执行 default 中的代码块。需要注意的是,在 switch 语句中,每个 case 的值必须是常量,且不可重复。

总的来说,if 语句和 switch 语句都是用于控制程序执行流程的条件语句,开发者可以根据具体情况选择使用哪种语句。

循环语句

当我们需要重复执行一段代码时,就需要用到循环语句。在 Arduino 中,有两种主要的循环语句:for 循环和 while 循环。

for 循环

for 循环是一个控制结构,它允许你重复执行一系列语句,具体次数由循环次数确定。for 循环的语法如下:

for (初始化表达式; 布尔表达式; 更新表达式) {
  // 代码块
}

for 循环由三部分组成:

  • 初始化表达式:在循环开始时执行一次,通常用于初始化计数器。
  • 布尔表达式:在每次迭代开始前计算,如果结果为 true,则执行循环体语句,否则退出循环。
  • 更新表达式:在每次迭代结束后执行,通常用于更新计数器。

下面是一个简单的 for 循环的例子,它输出数字 0 到 9:

for (int i = 0; i < 10; i++) {
  Serial.println(i);
}

在这个例子中,初始化表达式初始化了计数器 i 为 0,布尔表达式检查 i 是否小于 10,更新表达式将 i 增加 1。在每次迭代中,计数器 i 的值都会被输出。

while 循环

while 循环是另一种重复执行语句块的方法。它会在条件为 true 时重复执行代码块。while 循环的语法如下:

while (布尔表达式) {
  // 代码块
}

while 循环只由一个条件表达式组成,当这个表达式为 true 时,执行循环体语句。在每次循环执行后,条件表达式都会被重新计算。如果条件表达式为 false,则跳过循环体语句,直接执行循环后面的代码。

下面是一个使用 while 循环输出数字 0 到 9 的例子:

int i = 0;
while (i < 10) {
  Serial.println(i);
  i++;
}

在这个例子中,初始化变量 i 的值为 0。while 循环的条件表达式检查变量 i 是否小于 10。只要条件为 true,循环就会一直执行,每次将变量 i 的值增加 1。在每次循环中,变量 i 的值都会被输出。

总体来说,for 循环适用于知道循环次数的情况,而 while 循环适用于不知道循环次数的情况。

数组

接下来我们来看看如何使用 Arduino 的数组。

数组是一种用于存储多个值的数据类型。数组的每个元素都有一个唯一的索引,可以使用这个索引来访问数组中的元素。

定义数组的语法如下:

type arrayName[arraySize];

其中,type 是数组中元素的数据类型,arrayName 是数组的名称,arraySize 是数组的大小,下面是一个例子:

int myArray[5];

这个代码定义了一个包含 5 个整数的数组,可以使用 myArray[0] 到 myArray[4] 访问这些元素。

可以在定义数组时初始化数组。例如:

int myArray[5] = {1, 2, 3, 4, 5};

这个代码定义了一个包含 5 个整数的数组,并将其初始化为 1、2、3、4、5。

也可以使用以下方式初始化数组:

int myArray[] = {1, 2, 3, 4, 5};

这个代码定义了一个包含 5 个整数的数组,并将其初始化为 1、2、3、4、5。

你可以使用下标访问数组元素。下标从 0 开始,例如:

int myArray[5] = {1, 2, 3, 4, 5};
int x = myArray[2];  // 将 x 的值设置为数组中下标为 2 的元素,即 3。

可以使用循环遍历数组中的所有元素。例如:

int myArray[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
  // 打印数组中的每个元素
  Serial.println(myArray[i]);
}

Arduino 中还支持多维数组。例如:

int myArray[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

这个代码定义了一个 3 行 3 列的二维数组,并将其初始化为:

1 2 3
4 5 6
7 8 9

可以使用两个下标来访问数组中的元素。例如:

int myArray[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int x = myArray[1][2];  // 将 x 的值设置为数组中第 2 行第 3 列的元素,即 6。

函数

当程序中需要执行某个特定任务时,函数是非常有用的。函数可以包含一些代码块,这些代码块可以在程序的其他地方多次调用。在 Arduino 编程语言中,函数包含了一个函数头和一个函数体。函数头包含了函数名称和参数列表,函数体包含了一些要执行的代码。

以下是一个简单的函数示例:

int add(int a, int b) {    //函数头
  int sum = a + b;         //函数体
  return sum;
}

这个函数的名称是 add,它有两个参数,分别是 ab,函数体包含了将 ab 相加的操作,最后通过 return 返回结果。

在程序中调用函数时,可以像这样使用:

int x = 3;
int y = 5;
int z = add(x, y);    //调用函数

在这个示例中,我们将 xy 作为参数传递给 add 函数,该函数返回它们的和,最后将结果存储在 z 变量中。

函数的参数也可以是其他类型的数据,例如字符串、浮点数等等。在 Arduino 编程语言中,函数也可以没有参数,也可以没有返回值。以下是一个没有参数和返回值的函数示例:

void sayHello() {    //函数头
  Serial.println("Hello World!");    //函数体
}

这个函数的名称是 sayHello,它没有参数和返回值。函数体包含了一条输出语句,它将字符串 "Hello World!" 输出到串行监视器中。

函数的使用可以让代码更加清晰、易读和易于维护。通过将代码块封装到函数中,可以使代码更加模块化,也可以避免在多个地方重复编写相同的代码。在编写代码时,应该尽可能地使用函数,以便使代码更加可读、易于维护和可扩展。

常用函数介绍

下面列出了一些常用的 Arduino 函数:

当使用 Arduino 进行编程时,有许多内置函数可用。这些函数可以帮助我们更轻松地编写程序,处理输入和输出,控制逻辑流和实现其他功能。下面是一些常用的 Arduino 函数:

  1. pinMode(pin, mode): 用于配置数字引脚的输入或输出模式。pin 是数字引脚的编号,mode 是要设置的模式(输入或输出)。

  2. digitalWrite(pin, value): 用于在数字引脚上写入数字值(HIGH 或 LOW)。pin 是数字引脚的编号,value 是要写入的值。

  3. digitalRead(pin): 用于读取数字引脚上的数字值(HIGH 或 LOW)。pin 是数字引脚的编号。

  4. analogRead(pin): 用于读取模拟引脚上的模拟值(0-1023)。pin 是模拟引脚的编号。

  5. analogWrite(pin, value): 用于在支持 PWM 输出的数字引脚上输出模拟值(0-255)。pin 是数字引脚的编号,value 是要输出的值。

  6. delay(ms): 用于在程序中创建暂停(延迟)时间。ms 是要延迟的毫秒数。

  7. millis(): 返回自启动以来的毫秒数,可以用于时间跟踪和计时器。

  8. Serial.begin(baud): 用于初始化串口通信,其中 baud 是波特率。

  9. Serial.print(data): 用于将数据打印到串口监视器。data 可以是数字,字符串或其他数据类型。

  10. Serial.available(): 用于检查是否有数据可以从串口读取。

这些函数只是 Arduino 可用的众多函数中的一部分。熟悉这些常用函数可以帮助我们更轻松地编写程序,并为实现特定功能提供了有用的工具。

下面是一个简单的实例代码,演示了如何控制一个 LED 灯的亮灭:

// 设置 LED 引脚
int led_pin = 2;

void setup() {
  // 设定引脚为输出模式
  pinMode(led_pin, OUTPUT);
}

void loop() {
  // 点亮 LED
  digitalWrite(led_pin, HIGH);
  // 等待一段时间
  delay(1000);
  // 关闭 LED
  digitalWrite(led_pin, LOW);
  // 等待一段时间
  delay(1000);
}

这段代码中,我们首先定义了一个整型变量 led_pin,表示连接 LED 灯的引脚。在 setup() 函数中,我们将该引脚设定为输出模式,然后在 loop() 函数中交替点亮和关闭 LED 灯,并在两次操作之间等待 1 秒钟的时间。

总结

本文介绍了 Arduino 的基本概念和编程语言,并演示了如何通过 Arduino 板上的数字和模拟引脚来控制硬件设备。对于初学者而言,理解这些基础知识是开始进行更高级项目的基础。如果你想进一步深入了解 Arduino,可以参考官方文档或者更高级别的教程。

上次编辑于:
贡献者: Luo