- 机器人等级考试
Arduino 学习笔记教程
- 2025-8-1 15:28:50 @
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
设置引脚模式,根据设备是输入还是输出需求来选INPUT
或OUTPUT
。 - 串口通信函数
Serial.begin
、Serial.println
、Serial.print
用于和电脑交互,输出数据调试程序很方便。 delay
控制程序执行节奏,analogRead
、analogWrite
、map
配合实现模拟信号的读取、转换和输出,能完成传感器数据采集与设备控制,像 LED 亮度调节、电机转速控制(后续可拓展 )等。for
循环语法灵活,可用于实现有规律的重复操作,比如数值遍历、设备状态渐变等。
(二)拓展方向
- 扩展硬件连接:除了 LED、光照传感器、电位器,还能连接温度传感器、舵机、继电器等,实现更多功能,比如用温度传感器检测温度,超过阈值用继电器控制电器开关。
- 结合逻辑判断:在
loop
里加入if-else
等条件判断,让程序根据不同情况执行不同操作,比如检测到光照过强时,不仅调节 LED 亮度,还能触发另一个指示灯闪烁报警。 - 通信与协同:学习 Arduino 与其他设备的通信,像 I2C、SPI 通信,连接显示屏显示数据,或者和蓝牙模块结合,实现手机远程控制 Arduino 设备,让作品更智能、功能更丰富 。
通过不断实践这些基础功能和拓展内容,就能逐步掌握 Arduino 开发,做出各种各样有趣的创意作品啦,比如智能光照调节灯、简易环境监测系统等,快动手试试吧!