Arduino 学习笔记教程

一、基础概念与核心函数

(一)setup()loop() 函数

在 Arduino 编程里,setup()loop() 是最基础且核心的两个函数,就像搭建房子的地基和不断循环运作的机器。

  • setup() 函数:程序启动后会首先执行 setup() 里的代码,而且只会执行一次 。它的作用主要是做一些初始化操作,比如设置引脚的模式(是作为输入还是输出)、初始化串口通信等,类似于我们上课前准备文具、表演前布置舞台,为后续程序运行做好准备。示例:
void setup() {
  // 把 3 号引脚设置为输出模式,后续可以用它控制 LED 灯等输出设备
  pinMode(3, OUTPUT); 
  // 初始化串口通信,设置波特率为 9600,这样电脑就能和 Arduino 通过串口传递数据
  Serial.begin(9600); 
}
  • loop() 函数setup() 执行完后,就会进入 loop() 函数,这里的代码会不断循环执行,像一直转圈跑的“小火车”,让程序持续完成特定任务,比如持续读取传感器数据、控制设备状态变化等。

(二)引脚模式设置 pinMode()

pinMode(pin, mode) 函数用于设置引脚的工作模式,pin 是要设置的引脚编号,mode 常见的有 INPUT(输入模式,用于接收外部信号,比如传感器传来的信号 )和 OUTPUT(输出模式,用于向外发送信号,控制像 LED 灯、电机这类设备 )。比如:

const int buttonPin = 2; // 定义按键引脚为 2 号
const int ledPin = 3;    // 定义 LED 引脚为 3 号
void setup() {
  pinMode(buttonPin, INPUT); // 设置按键引脚为输入模式,接收按键信号
  pinMode(ledPin, OUTPUT);   // 设置 LED 引脚为输出模式,控制 LED 亮灭
}

(三)串口通信相关函数

  • Serial.begin(baudrate):初始化串口通信,baudrate 是波特率,常用 9600 等,它就像约定好的“数字对讲机频道”,让 Arduino 和电脑能通过串口传输数据。在 setup() 里初始化,示例:
void setup() {
  Serial.begin(9600); // 打开串口,设置波特率 9600,准备和电脑通信
}
  • Serial.println(data):把数据 data 通过串口发送给电脑,并且会自动换行,方便在串口监视器里查看,常用来输出传感器数值、变量值等,比如:
void setup() {
  Serial.begin(9600);
  for (int i = 1; i <= 5; i++) {
    Serial.println(i); // 串口输出 1 到 5,每个数字占一行
  }
}
void loop() {
  // 循环里可以继续用 Serial.println 输出变化的数据
}
  • Serial.print(data):和 Serial.println 类似,但不会自动换行,如果想让输出的内容在同一行显示,就可以用它,比如:
void setup() {
  Serial.begin(9600);
  for (int i = 3; i <= 8; i++) {
    Serial.print(i); // 串口输出 3 到 8,数字在同一行显示,默认用空格分隔
    Serial.print(" "); 
  }
}

(四)延时函数 delay()

delay(time) 函数会让程序暂停执行 time 毫秒,常用来控制设备状态变化的节奏,比如让 LED 渐变时能看清变化过程。示例:

void loop() {
  // 让程序暂停 20 毫秒
  delay(20); 
}

(五)模拟输入输出函数

  • analogRead(pin):读取指定模拟引脚(如 A0、A1 等 )的模拟信号值,范围是 0 到 1023 ,可以用来读取电位器、光照传感器等传来的模拟数据。示例:
const int guangPin = A0; // 光照传感器接在 A0 引脚
int val;
void setup() {
  Serial.begin(9600);
  pinMode(guangPin, INPUT); // 设置为输入模式,接收光照传感器信号
}
void loop() {
  val = analogRead(guangPin); // 读取光照传感器的模拟值(0 - 1023)
  Serial.println(val); // 串口输出读取到的值
  delay(100); // 延时 100 毫秒,再重复读取
}
  • analogWrite(pin, value):用于向指定引脚(一般是支持 PWM 功能的引脚,如 3、5、6 等 )输出模拟电压值,value 范围是 0 到 255 ,可控制 LED 亮度、电机转速等。比如控制 LED 渐变:
const int ledPin = 3;
void setup() {
  pinMode(ledPin, OUTPUT);
}
void loop() {
  // 让 LED 慢慢变亮
  for (int i = 0; i <= 255; i++) { 
    analogWrite(ledPin, i); // 输出 0 到 255 的值,控制 LED 亮度变化
    delay(20); 
  }
  // 让 LED 慢慢变暗
  for (int i = 255; i >= 0; i--) { 
    analogWrite(ledPin, i);
    delay(20); 
  }
}
  • map(value, fromLow, fromHigh, toLow, toHigh):把一个范围的值映射到另一个范围,比如把 analogRead 得到的 0 - 1023 的值映射到 0 - 255 ,方便配合 analogWrite 使用。示例:
const int potPin = A0; // 电位器接在 A0 引脚
const int ledPin = 3;
int val;
void setup() {
  Serial.begin(9600);
  pinMode(potPin, INPUT);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  val = analogRead(potPin); // 读取电位器的模拟值(0 - 1023)
  // 把 0 - 1023 映射到 0 - 255
  val = map(val, 0, 1023, 0, 255); 
  Serial.println(val); 
  analogWrite(ledPin, val); // 用映射后的值控制 LED 亮度
  delay(10); 
}

二、常见功能实现示例

(一)LED 渐变控制

通过 for 循环结合 analogWrite 实现 LED 从暗到亮再到暗的渐变效果,代码及注释:

// 定义 LED 连接的引脚为 3 号
const int ledPin = 3; 

void setup() {
  // 设置 3 号引脚为输出模式,用于控制 LED
  pinMode(ledPin, OUTPUT); 
}

void loop() {
  // 第一个 for 循环:让 LED 慢慢变亮
  // i 从 0 开始,每次增加 1,直到 255 
  for (int i = 0; i <= 255; ++i) { 
    // 通过 analogWrite 输出 0 到 255 的值,控制 LED 亮度逐渐增加
    analogWrite(ledPin, i); 
    // 串口输出当前亮度值,方便查看进度
    Serial.println(i); 
    // 延时 20 毫秒,让变化能看清
    delay(20); 
  }

  // 第二个 for 循环:让 LED 慢慢变暗
  // i 从 255 开始,每次减少 1,直到 0 
  for (int i = 255; i >= 0; --i) { 
    // 输出 255 到 0 的值,控制 LED 亮度逐渐降低
    analogWrite(ledPin, i); 
    // 串口输出当前亮度值
    Serial.println(i); 
    // 延时 20 毫秒
    delay(20); 
  }
}

这个程序里,loop 函数不断循环执行两个 for 循环,让 LED 持续渐变,analogWrite 依据循环变量 i 改变输出值,进而改变 LED 亮度,delay 保证变化能被肉眼观察到。

(二)串口输出数字(for 循环练习 )

利用 for 循环向串口输出数字,同时学习 for 循环语法,代码及注释:

void setup() {
  // 初始化串口通信,波特率 9600,让电脑能接收数据
  Serial.begin(9600); 
  // for 循环语法:for (表达式1; 表达式2; 表达式3) { 循环体 }
  // 表达式1:创建循环变量 i 并初始化为 1 
  // 表达式2:判断条件,i 小于等于 5 时继续循环 
  // 表达式3:每次循环后 i 自增 1 
  for (int i = 1; i <= 5; i++) { 
    // 串口输出当前 i 的值并换行,在串口监视器显示 1 到 5 
    Serial.println(i); 
  }
}

void loop() {
  // loop 函数这里为空,因为主要功能在 setup 里执行一次即可
}

for 循环执行流程:先执行表达式1(初始化变量 ),然后判断表达式2,若成立执行循环体,再执行表达式3,接着回到表达式2判断,直到表达式2不成立,退出循环。这里通过它依次输出 1 到 5 ,帮助理解循环语法。

(三)光照传感器控制 LED 亮度

结合光照传感器读取数据和 LED 控制,实现根据光照强度自动调节 LED 亮度,代码及注释:

// 定义光照传感器连接的引脚为 A0 
const int guangPin = A0; 
// 定义 LED 连接的引脚为 3 号
const int ledPin = 3; 
// 用于存储从传感器读取到的数据
int val; 

void setup() {
  // 初始化串口,波特率 9600,方便查看传感器数值
  Serial.begin(9600); 
  // 设置光照传感器引脚为输入模式,接收信号
  pinMode(guangPin, INPUT); 
  // 设置 LED 引脚为输出模式,控制亮度
  pinMode(ledPin, OUTPUT); 
}

void loop() {
  // 读取光照传感器的模拟值,范围 0 - 1023 
  val = analogRead(guangPin); 
  // 把 0 - 1023 的值映射到 0 - 255,因为 LED 用 0 - 255 控制亮度
  val = map(val, 0, 1023, 0, 255); 
  // 串口输出映射后的值,查看 LED 亮度对应的数值
  Serial.println(val); 
  // 根据映射后的值控制 LED 亮度,实现光照强则 LED 亮,光照弱则暗
  analogWrite(ledPin, val); 
  // 延时 10 毫秒,让变化更流畅,也避免数据读取太频繁
  delay(10); 
}

程序运行时,loop 不断读取光照传感器数据,经 map 函数转换后用于控制 LED 亮度,同时串口输出数值,能直观看到光照变化对应 LED 亮度的改变。

(四)电位器控制 LED 亮度

用电位器调节 LED 亮度,原理和光照传感器类似,只是输入设备换成电位器,代码及注释:

// 定义电位器连接的引脚为 A0 
const int potPin = A0; 
// 定义 LED 连接的引脚为 3 号
const int ledPin = 3; 
// 存储电位器读取数据
int val; 

void setup() {
  // 初始化串口,波特率 9600
  Serial.begin(9600); 
  // 设置电位器引脚为输入模式
  pinMode(potPin, INPUT); 
  // 设置 LED 引脚为输出模式
  pinMode(ledPin, OUTPUT); 
}

void loop() {
  // 读取电位器的模拟值(0 - 1023)
  val = analogRead(potPin); 
  // 映射到 0 - 255 范围,适配 LED 亮度控制
  val = map(val, 0, 1023, 0, 255); 
  // 串口输出当前控制亮度的值
  Serial.println(val); 
  // 控制 LED 亮度
  analogWrite(ledPin, val); 
  // 延时 10 毫秒,让变化平稳
  delay(10); 
}

转动电位器时,analogRead 读取到的数值改变,经 map 转换后控制 analogWrite 输出,从而改变 LED 亮度,串口输出的数值也会跟着变化,能清晰看到调节过程。

三、总结与拓展

(一)知识总结

  • 熟练掌握 setup()loop() 函数分工,setup 做初始化,loop 循环执行任务。
  • 学会用 pinMode 设置引脚模式,根据设备是输入还是输出需求来选 INPUTOUTPUT
  • 串口通信函数 Serial.beginSerial.printlnSerial.print 用于和电脑交互,输出数据调试程序很方便。
  • delay 控制程序执行节奏,analogReadanalogWritemap 配合实现模拟信号的读取、转换和输出,能完成传感器数据采集与设备控制,像 LED 亮度调节、电机转速控制(后续可拓展 )等。
  • for 循环语法灵活,可用于实现有规律的重复操作,比如数值遍历、设备状态渐变等。

(二)拓展方向

  • 扩展硬件连接:除了 LED、光照传感器、电位器,还能连接温度传感器、舵机、继电器等,实现更多功能,比如用温度传感器检测温度,超过阈值用继电器控制电器开关。
  • 结合逻辑判断:在 loop 里加入 if-else 等条件判断,让程序根据不同情况执行不同操作,比如检测到光照过强时,不仅调节 LED 亮度,还能触发另一个指示灯闪烁报警。
  • 通信与协同:学习 Arduino 与其他设备的通信,像 I2C、SPI 通信,连接显示屏显示数据,或者和蓝牙模块结合,实现手机远程控制 Arduino 设备,让作品更智能、功能更丰富 。

通过不断实践这些基础功能和拓展内容,就能逐步掌握 Arduino 开发,做出各种各样有趣的创意作品啦,比如智能光照调节灯、简易环境监测系统等,快动手试试吧!

0 条评论

目前还没有评论...