深色模式
第 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()一致
想一想
delay和millis的根本区别是什么?为什么"不阻塞"在单片机里很重要?💡 查看答案
delay是阻塞的:等待期间板子什么都不干,像"闭眼数数"。millis是不阻塞的:看一眼"表"(开机至今的毫秒数),没到时间就继续干别的,到点了再做事。单片机经常要同时照顾多个传感器(边测距边看循迹),一旦被delay卡住,别的事全耽误了——所以"不阻塞"很重要。把第二册第 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)不同。
