- 机器人等级考试
Arduino C++ 自定义函数学习笔记
- 2025-8-24 11:14:13 @
Arduino C++ 自定义函数学习笔记
自定义函数是 Arduino 编程中非常重要的概念,它可以让你的代码更模块化、更易读、更易于维护。本教程将通过实例介绍自定义函数的基本概念、语法和使用方法。
什么是自定义函数?
自定义函数是用户根据需求自己定义的函数,用于封装特定的功能,避免重复代码,提高代码复用性。
自定义函数的基本结构
// 函数声明/原型
返回类型 函数名(参数列表);
// 函数定义
返回类型 函数名(参数列表) {
// 函数体:执行的操作
return 返回值; // 如果返回类型不是void,则必须有返回值
}
自定义函数实例
下面通过几个实例来学习不同类型的自定义函数:
/*
Arduino 自定义函数示例
展示不同类型的自定义函数用法
*/
// 1. 无参数无返回值的函数
void blinkLED() {
// 闪烁LED一次
digitalWrite(LED_BUILTIN, HIGH); // 点亮内置LED
delay(500); // 延迟500毫秒
digitalWrite(LED_BUILTIN, LOW); // 关闭内置LED
delay(500); // 延迟500毫秒
}
// 2. 有参数无返回值的函数
// 功能:让指定引脚的LED以指定间隔闪烁指定次数
void blinkSpecifiedLED(int pin, int delayTime, int times) {
pinMode(pin, OUTPUT); // 设置引脚为输出模式
// 闪烁指定次数
for(int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(delayTime);
digitalWrite(pin, LOW);
delay(delayTime);
}
}
// 3. 有参数有返回值的函数
// 功能:计算两个整数的和
int addNumbers(int a, int b) {
int sum = a + b; // 计算和
return sum; // 返回结果
}
// 4. 函数原型示例(在函数定义前使用函数时需要)
float calculateAverage(int arr[], int length); // 函数原型
// 5. 更复杂的函数:计算数组平均值
float calculateAverage(int arr[], int length) {
if(length <= 0) return 0; // 处理错误情况
int sum = 0;
for(int i = 0; i < length; i++) {
sum += arr[i]; // 累加数组元素
}
return (float)sum / length; // 返回平均值(转换为float确保小数结果)
}
// 6. 使用引用参数的函数(可以修改外部变量)
void swapNumbers(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 初始化内置LED引脚
pinMode(LED_BUILTIN, OUTPUT);
// 1. 调用无参数无返回值的函数
Serial.println("调用blinkLED()函数:");
blinkLED(); // 闪烁一次内置LED
// 2. 调用有参数无返回值的函数
Serial.println("\n调用blinkSpecifiedLED()函数:");
blinkSpecifiedLED(13, 300, 3); // 在13号引脚,以300ms间隔,闪烁3次
// 3. 调用有参数有返回值的函数
Serial.println("\n调用addNumbers()函数:");
int result = addNumbers(10, 25);
Serial.print("10 + 25 = ");
Serial.println(result);
// 4. 调用计算平均值的函数
Serial.println("\n调用calculateAverage()函数:");
int numbers[] = {5, 10, 15, 20, 25};
int arrayLength = sizeof(numbers) / sizeof(numbers[0]);
float avg = calculateAverage(numbers, arrayLength);
Serial.print("数组平均值:");
Serial.println(avg);
// 5. 调用引用参数的函数
Serial.println("\n调用swapNumbers()函数:");
int a = 100, b = 200;
Serial.print("交换前:a = ");
Serial.print(a);
Serial.print(", b = ");
Serial.println(b);
swapNumbers(a, b);
Serial.print("交换后:a = ");
Serial.print(a);
Serial.print(", b = ");
Serial.println(b);
}
void loop() {
// 循环中每3秒调用一次blinkLED函数
blinkLED();
delay(2000); // 额外延迟2秒,使总间隔为3秒
}
代码解析
-
无参数无返回值函数
blinkLED()
- 功能:控制内置LED闪烁一次
- 特点:没有输入参数,也没有返回值(使用
void
关键字)
-
有参数无返回值函数
blinkSpecifiedLED()
- 功能:让指定引脚的LED以指定间隔闪烁指定次数
- 特点:接收三个参数(引脚号、延迟时间、闪烁次数),但不返回值
-
有参数有返回值函数
addNumbers()
- 功能:计算两个整数的和
- 特点:接收两个整数参数,返回它们的和
-
函数原型
- 当函数定义在调用之后时,需要先声明函数原型
- 函数原型告诉编译器函数的存在及其参数和返回类型
-
复杂函数
calculateAverage()
- 功能:计算数组的平均值
- 特点:接收数组和数组长度作为参数,返回平均值
- 展示了如何处理数组和类型转换
-
引用参数函数
swapNumbers()
- 功能:交换两个变量的值
- 特点:使用引用参数(
&
符号),可以直接修改函数外部的变量
自定义函数的最佳实践
- 函数名要清晰:函数名应准确描述其功能,使用有意义的名称
- 单一职责:一个函数应只做一件事,保持函数简洁
- 参数不宜过多:参数过多会使函数难以使用和理解
- 适当使用返回值:需要结果时使用返回值,不需要时使用
void
- 处理边界情况:如空数组、无效参数等
- 添加注释:解释函数功能、参数含义和返回值
通过合理使用自定义函数,可以使你的 Arduino 代码更加模块化、可读性更强,也更容易维护和扩展。尝试在你的项目中应用这些概念,逐步提高代码质量。
0 条评论
目前还没有评论...