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秒
}

代码解析

  1. 无参数无返回值函数 blinkLED()

    • 功能:控制内置LED闪烁一次
    • 特点:没有输入参数,也没有返回值(使用void关键字)
  2. 有参数无返回值函数 blinkSpecifiedLED()

    • 功能:让指定引脚的LED以指定间隔闪烁指定次数
    • 特点:接收三个参数(引脚号、延迟时间、闪烁次数),但不返回值
  3. 有参数有返回值函数 addNumbers()

    • 功能:计算两个整数的和
    • 特点:接收两个整数参数,返回它们的和
  4. 函数原型

    • 当函数定义在调用之后时,需要先声明函数原型
    • 函数原型告诉编译器函数的存在及其参数和返回类型
  5. 复杂函数 calculateAverage()

    • 功能:计算数组的平均值
    • 特点:接收数组和数组长度作为参数,返回平均值
    • 展示了如何处理数组和类型转换
  6. 引用参数函数 swapNumbers()

    • 功能:交换两个变量的值
    • 特点:使用引用参数(&符号),可以直接修改函数外部的变量

自定义函数的最佳实践

  1. 函数名要清晰:函数名应准确描述其功能,使用有意义的名称
  2. 单一职责:一个函数应只做一件事,保持函数简洁
  3. 参数不宜过多:参数过多会使函数难以使用和理解
  4. 适当使用返回值:需要结果时使用返回值,不需要时使用void
  5. 处理边界情况:如空数组、无效参数等
  6. 添加注释:解释函数功能、参数含义和返回值

通过合理使用自定义函数,可以使你的 Arduino 代码更加模块化、可读性更强,也更容易维护和扩展。尝试在你的项目中应用这些概念,逐步提高代码质量。

0 条评论

目前还没有评论...