入门篇:从 Blink 到传感器读取

知识库
知识库文档
/tech-stacks/arduino/tutorial/入门篇:从 Blink 到传感器读取.md

文档

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);
}

编译与上传

  1. 连接 USB → 选择板卡型号 + 端口
  2. 点击 上传 按钮
  3. 观察 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);

思考题

  1. 为什么 delay() 不适合复杂项目?用什么替代?
  2. INPUT_PULLUP 相比外部上拉电阻有什么优缺点?
  3. 如果用 50Hz PWM 控制 LED 亮度,人眼能看到闪烁吗?

信息

路径
/tech-stacks/arduino/tutorial/入门篇:从 Blink 到传感器读取.md
更新时间
2026/5/31