Skip to content

第 7 章:Arduino API 速览——硬件代码字典

本章能学到什么

  • pinMode / digitalWrite / digitalRead:数字引脚读写
  • analogWrite / analogRead:PWM 输出与模拟读取
  • delay / millis:延时与计时
  • Serial:串口通信

这一章和第二册的 machine 库速览一样,是用来查的字典,不用背。后面每个硬件实验的代码里都会反复出现这些"单词",遇到不认识的,回这一章查就行。

每个 API 配一个最小示例,和第二册的 machine 库一一对应。

pinMode + digitalWrite:数字输出

cpp
void setup() {
  pinMode(0, OUTPUT);       // GP0 设为输出(GP 编号,和第二册一致)
}

void loop() {
  digitalWrite(0, HIGH);    // 高电平 → 灯亮
  delay(1000);
  digitalWrite(0, LOW);     // 低电平 → 灯灭
  delay(1000);
}

对照 Python:Pin(0, Pin.OUT) + led.value(1/0)

pinMode + digitalRead:数字输入

cpp
void setup() {
  Serial.begin(115200);
  pinMode(10, INPUT);       // GP10 设为输入(读循迹探头)
}

void loop() {
  int state = digitalRead(10);   // 读到 HIGH 或 LOW
  Serial.println(state);         // 打印 1 或 0
  delay(200);
}

analogWrite:PWM 输出

cpp
void setup() {
  pinMode(0, OUTPUT);
}

void loop() {
  analogWrite(0, 128);    // 占空比 50%(默认分辨率 0~255)
}

RP2040 的所有 GPIO 都支持 PWM(不像 Arduino UNO 只有带 ~ 的引脚)。analogWrite 默认用 8 位分辨率(0~255),和第二册 duty_u16 的换算关系:duty_u16 = analogWrite值 × 257(比如 128 × 257 = 32896 ≈ 32768)。

analogRead:模拟读取

cpp
void setup() {
  Serial.begin(115200);
}

void loop() {
  int value = analogRead(26);   // 读 GP26(ADC0),返回 0~1023
  Serial.println(value);
  delay(200);
}

Arduino 的 analogRead 默认返回 0~1023(10 位),Python 的 read_u16() 返回 0~65535。Pico 只有 GP26~GP28 三个引脚支持模拟读取。

delay 与 millis:延时与计时

cpp
delay(500);        // 阻塞延时 500 毫秒——这期间板子什么都不干

millis() 返回开机至今的毫秒数,能实现"不阻塞"的计时:

cpp
unsigned long lastTime = 0;

void loop() {
  if (millis() - lastTime >= 500) {   // 每 500ms 执行一次
    lastTime = millis();
    // 做事……
  }
  // 这里还能同时干别的,不会像 delay 那样卡住
}

Serial:串口通信

cpp
void setup() {
  Serial.begin(115200);          // 初始化,波特率 115200
  Serial.println("ready");       // 打印并换行
  Serial.print("no newline");    // 打印不换行
}

常见坑

  • analogWrite 的值默认 0~255,不是 0~65535(那是 Python 的 duty_u16
  • analogRead 只能用于 GP26~GP28
  • 串口监视器波特率要和 Serial.begin() 一致

想一想

  1. delaymillis 的根本区别是什么?为什么"不阻塞"在单片机里很重要?

    💡 查看答案

    delay阻塞的:等待期间板子什么都不干,像"闭眼数数"。millis不阻塞的:看一眼"表"(开机至今的毫秒数),没到时间就继续干别的,到点了再做事。单片机经常要同时照顾多个传感器(边测距边看循迹),一旦被 delay 卡住,别的事全耽误了——所以"不阻塞"很重要。

  2. 把第二册第 7 章的 4 个 Python 示例和这里的 C++ 示例并排看,是不是几乎一一对应?

    💡 查看答案

    是的,几乎一一对应:Pin(0, Pin.OUT)pinMode(0, OUTPUT)value(1)digitalWrite(0, HIGH)duty_u16()analogWrite()read_u16()analogRead()sleep()delay()。只是名字和数值范围(0~65535 vs 0~255)不同。

不积跬步,无以至千里;万里之行,始于当下。