Arduino 入门教程:从零开始到实践

介绍 Arduino 平台、开发环境、基础语法(setup/loop、pinMode、digitalWrite、analogRead 等),并对比 C 语言的异同,包含常见示例与调试建议。

Arduino 入门教程:从零开始到实践

Arduino 是面向初学者与爱好者的开源硬件平台,硬件(开发板)与软件(Arduino IDE / PlatformIO)配套,适合学习微控制器、快速原型与 IoT 项目。本文覆盖从环境准备、基础语法、常见函数、示例工程,到与 C 语言的异同对比,帮助你尽快上手 Arduino 开发。

一、Arduino 是什么

  • Arduino = 硬件(开发板)+ 软件(Arduino IDE / 框架)。
  • 常见开发板:Arduino Uno(基于 ATmega328P)、Nano、Mega、Leonardo、以及基于 ESP32 / ESP8266 的板子(带 WiFi/蓝牙)。
  • Arduino 核心语言其实是 C++(但对初学者屏蔽了很多复杂性),开发流程称为“写 sketch(草图)”。

二、开发环境准备

  1. 下载并安装 Arduino IDE(或使用 VS Code + PlatformIO)。
  2. 连接开发板到电脑(USB),在 IDE 中选择对应板子与串口(Tools → Board / Port)。
  3. 第一次使用时安装板子驱动(Windows 下常见)。

推荐工具:

  • Arduino IDE(简单易用)
  • VS Code + PlatformIO(进阶、可用 Git 与更强的调试)
  • 使用串口工具(例如 minicom、PuTTY、screen)查看串口输出

三、Sketch 结构与基础语法

Arduino 程序称为 sketch,最基本的两个函数为 setup()loop()

  • setup():程序启动后执行一次,用于初始化(配置引脚、串口、外设)。
  • loop()setup() 之后会无限循环执行,用于主逻辑。

示例:最简单的 LED 闪烁(Blink)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// LED 闪烁示例,Arduino Uno 上板载 LED 通常接在数字引脚 13
void setup() {
    pinMode(13, OUTPUT); // 将 13 号引脚设置为输出
}

void loop() {
    digitalWrite(13, HIGH); // 点亮 LED
    delay(1000);            // 等待 1000ms
    digitalWrite(13, LOW);  // 熄灭 LED
    delay(1000);
}

常用基本函数(概览):

  • pinMode(pin, MODE):设置引脚模式(INPUTOUTPUTINPUT_PULLUP)。
  • digitalWrite(pin, VALUE):给数字引脚写高/低电平(HIGH / LOW)。
  • digitalRead(pin):读取数字引脚值(返回 HIGH / LOW)。
  • analogRead(pin):读取模拟引脚(返回 0~1023,取决于 ADC 分辨率)。
  • analogWrite(pin, value):对支持 PWM 的引脚输出 PWM(0~255)。
  • delay(ms):阻塞延时,单位毫秒。
  • millis():返回自程序启动以来的毫秒数(用于非阻塞计时)。
  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode):外部中断绑定。
  • Serial.begin(baud) / Serial.print() / Serial.println():串口调试。

四、常见示例

  1. 串口打印与按键读入
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const int buttonPin = 2;

void setup() {
    Serial.begin(115200);
    pinMode(buttonPin, INPUT_PULLUP); // 使用上拉输入
}

void loop() {
    int state = digitalRead(buttonPin);
    if (state == LOW) {
        Serial.println("Button pressed");
    }
    delay(100);
}
  1. 模拟读取(温度传感器示例)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int sensorPin = A0;

void setup() {
    Serial.begin(9600);
}

void loop() {
    int raw = analogRead(sensorPin);
    float voltage = raw * (5.0 / 1023.0); // 假设 10-bit ADC、5V 参考
    Serial.println(voltage);
    delay(500);
}
  1. 使用 millis() 做非阻塞闪烁(替代 delay)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const int ledPin = 13;
unsigned long lastMillis = 0;
unsigned long interval = 500;
bool ledState = false;

void setup() {
    pinMode(ledPin, OUTPUT);
}

void loop() {
    unsigned long now = millis();
    if (now - lastMillis >= interval) {
        lastMillis = now;
        ledState = !ledState;
        digitalWrite(ledPin, ledState ? HIGH : LOW);
    }
    // 这里可以并行处理其他任务
}

五、常见外设与库

  • 传感器:温度(DS18B20)、光敏、电阻式传感器
  • 通信:I2C(Wire 库)、SPI(SPI 库)、UART(Serial)
  • 显示:LCD(LiquidCrystal)、OLED(Adafruit SSD1306)
  • 网络模块:ESP8266/ESP32、Ethernet(Ethernet 库)
  • 电机控制:Servo(舵机)、Stepper、驱动芯片(L298、TB6612)

安装与使用库:

  • Arduino IDE → Library Manager → 搜索并安装
  • 或在 PlatformIO 中于 platformio.ini 添加依赖

六、与 C 语言的区别与联系

概念上:

  • Arduino 的底层是 C/C++,但 Arduino 框架对初学者做了大量封装(例如 setup()/loop()pinMode 等)。
  • 写 Arduino sketch 时你通常不需要写 main(),IDE 在编译阶段会自动生成一个包含 main() 的封装,这个 main() 会调用 init()setup(),然后循环调用 loop()

语法与行为差异(重点):

  1. 语言级别
    • Arduino sketch 本质上是 C++(有类、命名空间等),但大多数教程用到的是 C 风格 API(函数调用)。
  2. 自动原型生成
    • Arduino IDE 会为未声明的函数自动生成函数原型(方便新手),而标准 C/C++ 要求手动声明或将函数定义放在前面。
  3. 无显式 main()
    • 标准 C 程序以 int main() 为入口;Arduino 隐藏了 main(),把关注点放在 setup()loop()
  4. 内置硬件抽象函数
    • Arduino 提供一套高层函数(digitalWriteanalogRead 等),这些函数在底层封装了寄存器操作,降低了入门门槛。但在性能或精细控制上,直接操作寄存器(C/C++)更灵活。
  5. C 语言更接近硬件
    • 在裸机或高性能嵌入式项目中,工程师通常直接使用 C(或汇编)操作寄存器、写启动代码、使用链接脚本等;Arduino 框架隐藏了这些细节。
  6. 库与运行时
    • Arduino 提供生态丰富的库(多数为 C++),使用方便;标准 C 的第三方库需要手动移植或适配。
  7. 内存与字符串处理
    • Arduino 有 String 类(方便但可能造成内存碎片),建议在资源受限的项目中优先使用 C 风格字符串(char[])和谨慎的内存管理。
  8. 调试方式
    • Arduino 常用 Serial.print() 做串口调试;在 C 的专业嵌入式环境中更常用 JTAG/SWD 调试器(GDB、OpenOCD、J-Link)。

示例:Arduino 下的“更接近 C”风格(直接操作寄存器示例,以 AVR 为例)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 直接操作 AVR 寄存器控制 PB5(与 digitalWrite(13) 等价)
void setup() {
    DDRB |= (1 << DDB5); // 设置 PB5 为输出
}

void loop() {
    PORTB |= (1 << PORTB5);  // 置位 PB5
    _delay_ms(1000);
    PORTB &= ~(1 << PORTB5); // 清除 PB5
    _delay_ms(1000);
}

注意:直接操作寄存器可显著提升性能与精确性,但可移植性较差(不同 MCU 的寄存器名称与位定义不同)。

七、性能与资源注意事项

  • 使用 delay() 会阻塞主循环,影响响应。尽量用 millis() 做非阻塞任务调度。
  • 避免频繁动态分配内存(new / malloc / String),容易导致内存碎片化。
  • 在中断处理函数(ISR)中保持短小、避免使用阻塞函数(如 delay()Serial.print())。
  • 对时间敏感的任务尽量使用硬件定时器或 DMA(取决于开发板)。

八、调试与部署建议

  1. 经常通过 Serial 打印关键变量与流程(注意串口速率)。
  2. 小步调试:把复杂功能拆成小模块,单独测试传感器/通信/执行器。
  3. 了解电源管理:稳定电源与接地对硬件稳定性至关重要。
  4. 使用逻辑分析仪/示波器分析时序问题。
  5. 在部署前多次压力测试,检查内存泄露与稳定性。

九、学习路线建议与实践项目

  • 入门(1-2 周):LED 闪烁、按键、串口打印、模拟读取(光敏、温度)。
  • 进阶(2-4 周):I2C/SPI 传感器、OLED 显示、舵机控制、PWM 电机控制。
  • 项目(1-2 月):智能家居原型(传感器 + WiFi)、远程数据采集、简单机器人。

十、总结

  • Arduino 是学习嵌入式与快速原型的绝佳平台。它屏蔽了大量底层复杂性,让初学者能专注于逻辑与外设交互。
  • 当项目对性能、实时性或资源极限有较高要求时,建议逐步学习并过渡到更贴近硬件的 C/C++ 或直接使用裸机开发工具链。
  • 最佳学习方式是“学—做—改进”:从小项目开始,逐步增加硬件复杂度与软件架构要求。

祝你在 Arduino 的学习与项目实现中玩得开心、学到真技术。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计