文档
Arduino 开发从入门到点亮世界
本章目标
理解 Arduino 平台的核心概念,完成第一个项目,掌握数字 I/O 与串口通信基础。
1. 什么是 Arduino?
Arduino 不是一块板子,而是一个 生态系统:
- 硬件:以 ATmega328P (Uno) 为代表的开源开发板
- 软件:Arduino IDE + Arduino 编程框架
- 社区:数以万计的开源库和教程
为什么选择 Arduino?
| 对比维度 | 裸机 AVR (寄存器) | Arduino |
|---|---|---|
| 点亮 LED | 配置 DDRB/PORTB 寄存器 | pinMode(13,OUTPUT); digitalWrite(13,HIGH); |
| 学习周期 | 1-2 周 | 10 分钟 |
| 代码复用 | 需重写驱动 | 数以万计的现成库 |
2. 第一个程序:Blink
硬件
任意 Arduino 板 + USB 线。板载 LED(Uno 为 D13)即可。
代码
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 配置引脚为输出
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // 点亮
delay(1000); // 等待 1 秒
digitalWrite(LED_BUILTIN, LOW); // 熄灭
delay(1000);
}
编译与上传
- 连接 USB → 选择板卡型号 + 端口
- 点击 上传 按钮
- 观察 LED 开始闪烁
3. 理解 setup() 与 loop()
Arduino 的独特之处在于 隐式 main():
// Arduino 内部实际上是这样的:
int main(void) {
init(); // 初始化硬件
setup(); // 用户初始化(只执行一次)
while (1) {
loop(); // 用户主循环(无限重复)
}
return 0;
}
最佳实践:
setup()中放初始化代码:pinMode、Serial.begin、传感器初始化loop()中放业务逻辑,避免 在 loop 内使用长delay()
4. 数字 I/O
基本操作
pinMode(pin, INPUT); // 输入(高阻态)
pinMode(pin, INPUT_PULLUP); // 输入(内部上拉 ~30kΩ)
pinMode(pin, OUTPUT); // 输出
int val = digitalRead(pin); // 读引脚
digitalWrite(pin, HIGH); // 写高/低
按键读取(带消抖)
const int BTN = 3;
int lastState = HIGH;
unsigned long lastDebounce = 0;
void loop() {
int reading = digitalRead(BTN);
if (reading != lastState) {
lastDebounce = millis(); // 复位消抖计时器
}
if ((millis() - lastDebounce) > 50) { // 50ms 消抖
// 确认状态改变
if (reading == LOW) {
Serial.println("按键按下!");
}
}
lastState = reading;
}
5. 串口通信
void setup() {
Serial.begin(9600); // 波特率
}
void loop() {
Serial.print("millis: ");
Serial.println(millis());
// 格式化输出
float voltage = analogRead(A0) * 5.0 / 1023.0;
Serial.print("Voltage: ");
Serial.print(voltage, 2); // 2 位小数
Serial.println("V");
delay(1000);
}
6. 模拟输入
Arduino Uno 的 ADC 为 10 位(0-1023),基准电压默认 5V。
int raw = analogRead(A0);
float voltage = raw * (5.0 / 1023.0);
思考题
- 为什么
delay()不适合复杂项目?用什么替代? INPUT_PULLUP相比外部上拉电阻有什么优缺点?- 如果用 50Hz PWM 控制 LED 亮度,人眼能看到闪烁吗?