Arduino C/C++ 语言核心概念
首先要明确一个关键点:Arduino 使用的语言是 C++,但它对 C++ 进行了极大的简化和封装,使其对初学者非常友好,你可以把它看作是“带库的 C 语言”,你写的代码(.ino 文件)会被 Arduino IDE 自动包装在一个类中,所以你可以直接使用 setup() 和 loop() 函数。

(图片来源网络,侵删)
基本结构
每个 Arduino 程序都包含两个核心函数:
// 1. setup() 函数:只运行一次
// 用于初始化:设置引脚模式、启动串口通信等。
void setup() {
// 初始化代码,只运行一次
}
// 2. loop() 函数:循环执行
// 程序的主体,会不断地重复执行。
void loop() {
// 主要代码,循环运行
}
数据类型
Arduino 支持标准 C/C++ 的基本数据类型,并增加了一些特定于硬件的类型。
| 数据类型 | 字节数 | 范围 | 描述 |
|---|---|---|---|
void |
- | - | 无类型 |
bool |
1 | true / false |
布尔值 |
char |
1 | -128 到 127 | 字符 |
unsigned char |
1 | 0 到 255 | 无符号字符 |
byte |
1 | 0 到 255 | 字节 (等同于 unsigned char) |
int |
2 | -32,768 到 32,767 | 整数 (16位) |
unsigned int |
2 | 0 到 65,535 | 无符号整数 |
long |
4 | -2,147,483,648 到 2,147,483,647 | 长整型 |
unsigned long |
4 | 0 到 4,294,967,295 | 无符号长整型 |
float |
4 | ~3.4E±38 | 单精度浮点数 |
double |
4 | ~3.4E±38 | 双精度浮点数 (在 Arduino 上等同于 float) |
String |
- | - | 字符串对象 (来自 String 库) |
array |
- | - | 数组 |
变量与常量
int ledPin = 13; // 定义一个整型变量 ledPin,并赋值为 13
const int buttonPin = 2; // 定义一个整型常量 buttonPin,值不能被修改
运算符
- 算术运算符: (加), (减), (乘), (除), (取模)
- 比较运算符: (等于), (不等于),
>(大于),<(小于),>=(大于等于),<=(小于等于) - 布尔运算符:
&&(与), (或), (非) - 位运算符:
&(与), (或),^(异或), (取反),<<(左移),>>(右移) - 赋值运算符: , , , ,
核心函数与库
数字 I/O
pinMode(pin, mode): 设置引脚模式。pin: 引脚编号 (如 13, 2)。mode:INPUT,OUTPUT,INPUT_PULLUP。
digitalWrite(pin, value): 设置数字引脚的电平。value:HIGH(高电平/5V),LOW(低电平/0V)。
digitalRead(pin): 读取数字引脚的电平,返回HIGH或LOW。
示例:LED 闪烁
// 定义连接 LED 的引脚
const int ledPin = 13;
void setup() {
// 将 ledPin 设置为输出模式
pinMode(ledPin, OUTPUT);
}
void loop() {
// 点亮 LED (高电平)
digitalWrite(ledPin, HIGH);
delay(1000); // 等待 1 秒
// 熄灭 LED (低电平)
digitalWrite(ledPin, LOW);
delay(1000); // 等待 1 秒
}
模拟 I/O
analogRead(pin): 读取模拟引脚的电压值,返回一个 0 到 1023 之间的整数 (10位ADC)。注意:Arduino UNO 的模拟引脚为 A0 到 A5。
(图片来源网络,侵删)analogWrite(pin, value): 向引脚输出一个 PWM (脉冲宽度调制) 信号。pin: 必须是支持 PWM 的引脚 (UNO 上的 符号标记的引脚,如 3, 5, 6, 9, 10, 11)。value: 0 到 255 之间的整数,0 表示 0% 占空比 (关闭),255 表示 100% 占空比 (全开)。
示例:呼吸灯
const int ledPin = 9; // 必须是 PWM 引脚
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
// 让 LED 亮度从暗到亮
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(ledPin, brightness);
delay(10);
}
// 让 LED 亮度从亮到暗
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness);
delay(10);
}
}
时间函数
delay(milliseconds): 暂停程序指定的毫秒数。delayMicroseconds(microseconds): 暂停程序指定的微秒数。millis(): 返回 Arduino 开机以来的毫秒数 (无符号长整型)。millis()是非阻塞式编程的关键,比delay()更强大。
示例:使用 millis() 代替 delay()
const int ledPin = 13;
unsigned long previousMillis = 0; // 存储上一次 LED 状态改变的时间
const long interval = 1000; // 闪烁间隔 (1秒)
int ledState = LOW; // LED 的当前状态
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
// 获取当前时间
unsigned long currentMillis = millis();
// 检查是否到达了设定的间隔
if (currentMillis - previousMillis >= interval) {
// 保存这次的时间
previousMillis = currentMillis;
// 切换 LED 状态
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// 更新 LED
digitalWrite(ledPin, ledState);
}
// 在这里可以执行其他不阻塞的任务
}
串口通信
Serial.begin(baudRate): 启动串口通信。baudRate: 波特率,常用9600。
Serial.print(data): 向串口输出数据(不换行)。Serial.println(data): 向串口输出数据(并换行)。Serial.available(): 检查串口是否有数据可读,返回可读取的字节数。Serial.read(): 从串口读取一个字节的数据。
示例:串口控制 LED
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // 启动串口,波特率设为 9600
Serial.println("Ready to receive commands!");
}
void loop() {
// 检查串口是否有数据
if (Serial.available() > 0) {
// 读取接收到的字符
char command = Serial.read();
// 根据命令执行操作
if (command == '1') {
digitalWrite(ledPin, HIGH);
Serial.println("LED ON");
} else if (command == '0') {
digitalWrite(ledPin, LOW);
Serial.println("LED OFF");
}
}
}
常用库
库是预写好的代码集合,可以极大地简化开发。

(图片来源网络,侵删)
Wire.h (I2C 通信)
用于连接 I2C 设备,如传感器、OLED 屏幕等。
#include <Wire.h>
void setup() {
Wire.begin(); // 初始化 I2C 总线
Serial.begin(9600);
}
void loop() {
// 向地址为 0x08 的设备发送一个字节
Wire.beginTransmission(0x08);
Wire.write("Hello Arduino");
Wire.endTransmission();
delay(1000);
}
Servo.h (舵机控制)
用于控制舵机。
#include <Servo.h>
Servo myServo; // 创建一个舵机对象
void setup() {
myServo.attach(9); // 将舵机连接到引脚 9
}
void loop() {
myServo.write(0); // 舵机转到 0 度
delay(1000);
myServo.write(90); // 舵机转到 90 度
delay(1000);
myServo.write(180); // 舵机转到 180 度
delay(1000);
}
LiquidCrystal.h (LCD 显示)
用于控制 16x2 等字符型 LCD。
#include <LiquidCrystal.h>
// 初始化 LCD,RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2); // 设置 LCD 为 16 列 2 行
lcd.print("Hello, World!");
}
void loop() {
lcd.setCursor(0, 1); // 移动光标到第二行
lcd.print(millis() / 1000); // 显示运行秒数
}
实战项目示例
光敏电阻控制 LED 亮度
目标:根据环境光线强度,自动调节 LED 的亮度。
硬件:
- Arduino UNO
- LED
- 220Ω 电阻
- 光敏电阻
- 10kΩ 电阻
- 面包板和导线
接线:
- LED 长脚 -> 220Ω 电阻 -> 数字引脚 9
- LED 短脚 -> GND
- 光敏电阻一端 -> 5V
- 光敏电阻另一端 -> 模拟引脚 A0
- 光敏电阻与 A0 的连接点 -> 10kΩ 电阻 -> GND
代码:
const int ledPin = 9; // PWM 引脚
const int sensorPin = A0; // 光敏电阻引脚
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // 用于调试
}
void loop() {
// 读取传感器值 (0-1023)
int sensorValue = analogRead(sensorPin);
// 将传感器值 (0-1023) 映射到 PWM 值 (0-255)
int brightness = map(sensorValue, 0, 1023, 255, 0);
// 写入 PWM 值到 LED
analogWrite(ledPin, brightness);
// 在串口监视器打印值
Serial.print("Sensor Value: ");
Serial.print(sensorValue);
Serial.print("\t Brightness: ");
Serial.println(brightness);
delay(100);
}
学习资源与 PDF 下载
由于我无法直接生成和上传文件,以下是一些高质量的免费 Arduino C/C++ 学习资源,它们通常以网页形式提供,但你可以使用浏览器“打印为PDF”功能轻松地将它们保存下来。
官方资源
- Arduino 官方参考手册
- 链接: https://www.arduino.cc/reference/en/
- 最权威、最全面的参考文档,包含了所有函数、库、数据类型的详细说明和示例代码。强烈建议作为案头手册。
综合教程与书籍
-
《Arduino 实战指南》
- 链接: https://github.com/openscopeproject/Protoboard-Arduino-Tutorial
- 一本非常优秀的开源电子书,从基础概念到高级项目,讲解清晰,项目丰富,可以将其 GitHub 页面转换为 PDF。
-
《Beginning Arduino》 by Michael McRoberts
- 链接: 作者个人网站有部分章节和资源
- 经典入门书籍,网上可以找到免费的 PDF 版本,内容详实,适合零基础读者。
-
《Programming Arduino: Getting Started with Sketches》 by Simon Monk
专注于编程本身,深入浅出地讲解 C/C++ 在 Arduino 中的应用,是理解代码逻辑的好书,网上也有资源可以找到。
中文优质资源
-
《Arduino 从入门到精通》
- 链接: https://www.gitbook.com/book/yeelink-arduino-101/arduino-from-zero-to-hero/details
- 国内优秀的开源电子书,内容系统,案例丰富,非常适合中文学习者。
-
Arduino 中文社区
- 链接: https://www.arduino.cn/
- 国内最大的 Arduino 社区,有大量的教程、项目分享和问答,是解决问题的好去处。
如何将网页保存为 PDF?
- 打开上述任一链接。
- 在浏览器中,按下
Ctrl + P(Windows) 或Cmd + P(Mac) 打开打印对话框。 - 在目标打印机选项中,选择 “另存为 PDF” 或 “保存为 PDF”。
- 点击“保存”,即可得到该网页的 PDF 文件。
希望这份详细的指南能帮助你系统地学习 Arduino C/C++ 语言!祝你玩得开心!
