Arduino 教程:从零开始学习 C 语言编程
第一部分:核心理念 - Arduino 与 C 语言的关系
在开始之前,你必须理解一个最重要的概念:

Arduino 编程语言是 C/C++ 的一个“方言”或“简化版”。
你可以把它想象成:标准 C 语言是一辆手动挡的、性能强劲的跑车,而 Arduino 语言则像一辆带有自动挡和辅助驾驶功能的家用车,你同样能到达目的地(控制硬件),但 Arduino 为你隐藏了许多复杂的底层细节(比如寄存器操作、内存管理等),让你能更专注于“我要做什么”(What),而不是“计算机怎么做”(How)。
学习 Arduino 编程,本质上就是学习简化的 C 语言,并了解 Arduino 提供的特殊函数库。
第二部分:Arduino C 语言基础语法
C 语言是 Arduino 编程的骨架,下面我们来学习最核心的语法。

结构:setup() 和 loop()
每个 Arduino 程序都必须包含两个最核心的函数:
void setup() {
// setup() 函数内的代码只运行一次
// 通常用于初始化:设置引脚模式、启动串口通信等
}
void loop() {
// loop() 函数内的代码会无限循环地重复执行
// 这是 Arduino 程序的主体,用于实现主要功能
}
void setup(): 在 Arduino 上电或复位后,setup()函数里的代码会执行一次,就像你去旅行前,检查行李、设定导航一样,只做一次准备工作。void loop():setup()执行完毕后,loop()函数会从头到尾执行,然后立刻从头再开始,如此往复,直到断电,就像你旅行中,开车、拍照、吃饭这些活动会不断重复。
变量
变量是存储数据的容器,在使用变量前,你需要先声明它,告诉编译器你要存储什么类型的数据。
常用数据类型:
| 类型 | 大小 | 范围 | 描述 |
|---|---|---|---|
int |
2 字节 | -32,768 到 32,767 | 用于存储整数,如 5, -100。 |
float |
4 字节 | -3.4028235E+38 到 3.4028235E+38 | 用于存储带小数的数,如 14, -0.5。 |
char |
1 字节 | -128 到 127 | 用于存储单个字符,如 'A', '1',注意要用单引号。 |
boolean |
1 字节 | true 或 false |
用于存储逻辑值,真或假。 |
声明和使用变量:

int ledPin = 13; // 声明一个整型变量 ledPin,并赋值为 13 float temperature = 36.5; // 声明一个浮点型变量 temperature char myChar = 'A'; // 声明一个字符型变量 myChar bool isLightOn = false; // 声明一个布尔型变量 isLightOn
注释
注释是写给程序员看的,不会被编译器执行,它的作用是解释代码,方便自己或他人理解。
- 单行注释:使用
- 多行注释:使用
// 这是一个单行注释,解释下面这行代码的作用
int ledPin = 13; /* 这也是一个注释,用于给变量赋值。
多行注释可以跨越多行。 */
运算符
- 算术运算符: (加), (减), (乘), (除), (取模,即求余数)
- 比较运算符: (等于), (不等于),
>(大于),<(小于),>=(大于等于),<=(小于等于) - 逻辑运算符:
&&(与), (或), (非)
示例:
int a = 10; int b = 3; int sum = a + b; // sum 的值是 13 int remainder = a % b; // remainder 的值是 1 (10 除以 3 余 1) bool result = (a > b); // result 的值是 true
控制流
控制流决定了代码的执行顺序。
a) if...else 语句: 用于条件判断。
int sensorValue = analogRead(A0); // 假设从传感器读取一个值
if (sensorValue > 500) {
// sensorValue 大于 500,则执行这里的代码
digitalWrite(13, HIGH); // 打开 LED
} else {
// 否则,执行这里的代码
digitalWrite(13, LOW); // 关闭 LED
}
b) for 循环: 用于重复执行某段代码固定次数。
// 让连接在数字引脚 2 到 4 的 LED 依次闪烁
for (int i = 2; i <= 4; i++) {
digitalWrite(i, HIGH); // 打开第 i 个引脚的 LED
delay(200); // 等待 200 毫秒
digitalWrite(i, LOW); // 关闭第 i 个引脚的 LED
delay(200); // 等待 200 毫秒
}
c) while 循环: 当条件为 true 时,无限循环执行代码。
int buttonState = 0;
while (buttonState == 0) {
buttonState = digitalRead(2); // 读取一个按钮的状态
// 只要按钮没被按下 (buttonState 为 0),就一直在这里循环
}
// 当按钮被按下后,循环结束,继续执行下面的代码
第三部分:Arduino 核心函数库
这是 Arduino 的“魔法”所在,它提供了一系列预定义的函数,让你能轻松控制硬件。
pinMode() - 设置引脚模式
在使用一个引脚之前,必须先告诉 Arduino 这个引脚是用来做什么的。
pinMode(pin, mode)
参数:
pin: 你要设置的引脚编号 (如2,A0)。mode: 引脚模式。INPUT: 输入模式,用于读取外部信号(如按钮、传感器)。OUTPUT: 输出模式,用于向外部输出信号(如点亮 LED、驱动电机)。INPUT_PULLUP: 输入模式,并启用内部上拉电阻,用于按钮等场景,可以避免引脚悬空。
示例:
void setup() {
pinMode(13, OUTPUT); // 将数字引脚 13 设置为输出模式,用于控制 LED
pinMode(2, INPUT_PULLUP); // 将数字引脚 2 设置为带内部上拉的输入模式,用于连接按钮
}
digitalWrite() - 写入数字值
向一个设置为 OUTPUT 的引脚输出高电平或低电平。
digitalWrite(pin, value)
参数:
pin: 引脚编号。value: 输出值。HIGH: 输出高电平 (5V 或 3.3V)。LOW: 输出低电平 (0V)。
示例:
digitalWrite(13, HIGH); // 点亮连接在 13 号引脚的 LED delay(1000); // 等待 1 秒 digitalWrite(13, LOW); // 熄灭 LED
digitalRead() - 读取数字值
读取一个设置为 INPUT 或 INPUT_PULLUP 的引脚状态。
digitalRead(pin)
返回值:
HIGH: 如果引脚是高电平。LOW: 如果引脚是低电平。
示例:
int buttonState = digitalRead(2); // 读取 2 号引脚的按钮状态
if (buttonState == LOW) { // 注意:因为我们用了 INPUT_PULLUP,按下按钮时引脚会变为 LOW
// 按钮被按下时执行的代码
}
analogWrite() - 写入模拟值
向一个支持 PWM (脉冲宽度调制) 的引脚输出一个“伪模拟”电压,这可以用来控制 LED 的亮度或电机的速度。
analogWrite(pin, value)
参数:
pin: 支持 PWM 的引脚 (在大多数 Arduino 板上,标有 符号的引脚,如3,5,6,9,10,11)。value: 0 到 255 之间的整数。0: 相当于LOW(0V)。255: 相当于HIGH(5V)。- 中间值:输出一个平均电压,如 128 约等于 2.5V。
示例:
void setup() {
pinMode(9, OUTPUT); // 9 号引脚支持 PWM
}
void loop() {
// 让 LED 亮度从暗到亮,再到暗
for (int i = 0; i <= 255; i++) {
analogWrite(9, i); // 设置 LED 亮度
delay(10); // 短暂延时,以便观察效果
}
for (int i = 255; i >= 0; i--) {
analogWrite(9, i);
delay(10);
}
}
analogRead() - 读取模拟值
读取一个模拟输入引脚的电压值,并将其转换成一个 0 到 1023 之间的整数。
analogRead(pin)
参数:
pin: 模拟输入引脚 (以A开头,如A0,A1)。
返回值:
- 0 到 1023 之间的整数,代表 0V 到参考电压 (通常是 5V) 之间的电压值。
示例:
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率为 9600
}
void loop() {
int sensorValue = analogRead(A0); // 读取 A0 引脚的模拟值
Serial.println(sensorValue); // 通过串口监视器打印这个值
delay(100); // 每 100ms 读取一次
}
delay() - 延时
让程序暂停执行一段时间。
delay(milliseconds)
参数:
milliseconds: 暂停的时间,单位是毫秒 (1秒 = 1000毫秒)。
示例:
digitalWrite(13, HIGH); delay(1000); // 暂停 1 秒 digitalWrite(13, LOW); delay(1000); // 再暂停 1 秒
第四部分:第一个实战项目 - LED 闪烁
这是 Arduino 的 "Hello, World!",它将帮助你巩固以上所有基础知识。
硬件准备:
- 一块 Arduino 板 (如 Arduino UNO)。
- 一个 LED (任何颜色都可以)。
- 一个 220Ω 或 330Ω 的电阻。
- 面包板和几根杜邦线。
电路连接:
- 将 LED 的长脚(阳极)连接到电阻的一端。
- 将电阻的另一端连接到 Arduino 的数字引脚 13。
- 将 LED 的短脚(阴极)连接到 Arduino 的 GND (接地) 引脚。
代码:
/*
Arduino LED 闪烁项目
这个代码会让连接在数字引脚 13 上的 LED 每隔一秒闪烁一次。
*/
// 定义一个常量,方便以后修改 LED 所连接的引脚
// const 表示这个变量的值在程序运行中不会改变
const int ledPin = 13;
// setup() 函数,只运行一次
void setup() {
// 将 ledPin 设置为输出模式
pinMode(ledPin, OUTPUT);
}
// loop() 函数,无限循环运行
void loop() {
// 打开 LED (输出高电平)
digitalWrite(ledPin, HIGH);
// 等待 1000 毫秒 (1秒)
delay(1000);
// 关闭 LED (输出低电平)
digitalWrite(ledPin, LOW);
// 等待 1000 毫秒 (1秒)
delay(1000);
}
如何上传代码:
- 打开 Arduino IDE。
- 将你的 Arduino 板通过 USB 连接到电脑。
- 在 IDE 的 "工具" -> "板" 菜单中选择你的板型 (如 "Arduino UNO")。
- 在 "工具" -> "端口" 菜单中选择你的板子所连接的 COM 端口。
- 点击 "上传" 按钮 (一个向右的箭头)。
- 上传成功后,你应该能看到 LED 开始闪烁了!
第五部分:进阶学习路径
当你掌握了基础后,可以按照以下路径继续深入:
-
传感器与执行器:
- 输入:学习使用各种传感器,如光敏电阻、温度传感器、超声波传感器等。
- 输出:学习控制更多执行器,如蜂鸣器、舵机、电机驱动模块等。
-
串口通信 (
Serial):- 这是调试的利器,学习使用
Serial.begin(),Serial.print(),Serial.println()来在电脑上查看传感器数据、调试程序逻辑。
- 这是调试的利器,学习使用
-
if...else if...else结构:- 当你需要判断多个条件时,使用这个结构比嵌套
if更清晰。
- 当你需要判断多个条件时,使用这个结构比嵌套
-
switch...case结构:- 当你需要根据一个变量的值来执行不同操作时,
switch是比if...else if更高效的选择。
- 当你需要根据一个变量的值来执行不同操作时,
-
函数:
将重复使用的代码块封装成一个函数,可以提高代码的可读性和复用性。
-
库:
Arduino 拥有海量的第三方库,可以轻松驱动复杂的模块(如 OLED 屏幕、WiFi 模块、GPS 模块等),学习如何安装和使用库是进阶的关键。
-
C++ 特性:
- 当你感到 C 语言不够用时,可以开始学习 C++ 的面向对象特性,如
class(类),这对于构建更复杂的项目非常有帮助。
- 当你感到 C 语言不够用时,可以开始学习 C++ 的面向对象特性,如
学习建议:
- 多动手,多实践:看十遍教程不如自己动手做一个项目。
- 学会查阅文档:Arduino 官网有非常详细的参考手册,遇到不懂的函数可以随时查阅。
- 加入社区:在论坛、社交媒体上和其他爱好者交流,可以学到很多技巧。
祝你学习愉快,玩得开心!
