Skip to content

Arduino - I/O 函数

通用输入/输出(GPIO,General-Purpose Input/Output)引脚是您的 Arduino 与物理世界之间的桥梁。您可以将它们配置为读取环境信息(输入)或控制设备(输出)。本章涵盖了管理数字和模拟 I/O 的基本函数。

在使用引脚之前,您必须告知 Arduino 它的用途。pinMode() 函数通常在 setup() 中调用,用于将特定引脚配置为输入或输出模式。

pinMode(pinNumber, mode);
  • pinNumber:您要配置的引脚编号(例如 13 或 A0)。
  • mode:要设置的模式。最常见的三种模式是:
    • INPUT:将引脚配置为读取信号,例如来自传感器或开关的信号。引脚处于高阻抗状态,这意味着它消耗的电流非常小。
    • OUTPUT:将引脚配置为发送信号,例如点亮 LED 或启动电机。引脚处于低阻抗状态,能够提供显著电流。
    • INPUT_PULLUP:一种特殊的输入模式,启用内置上拉电阻。这对于无需外部元件即可读取开关状态非常有用。

数字 I/O 处理离散信号:开或关,1 或 0,HIGH(高电平)或 LOW(低电平)。在像 Uno 这样的 5V Arduino 上,HIGH 是 5V,LOW 是 0V。

当引脚配置为 OUTPUT 模式时,digitalWrite() 将其设置为 HIGH 或 LOW。

当引脚配置为 INPUT 或 INPUT_PULLUP 模式时,digitalRead() 返回其当前状态,即 HIGH 或 LOW。

这个完整的 sketch 演示了如何使用 INPUT_PULLUP 来读取按钮并控制 LED。这是物理计算中的一个基本模式。

// 这个 sketch 读取引脚 2 上的按钮,并在按钮按下时打开引脚 13 上的 LED。
const int buttonPin = 2; // 按钮连接的引脚
const int ledPin = 13; // LED 连接的引脚
void setup() {
// 将 LED 引脚初始化为输出模式
pinMode(ledPin, OUTPUT);
// 将按钮引脚初始化为带有上拉电阻的输入模式
// 当按钮没有按下时,引脚读取 HIGH。
// 当按钮按下时(连接到地),引脚读取 LOW。
pinMode(buttonPin, INPUT_PULLUP);
// 初始化串口通信,用于调试
Serial.begin(9600);
}
void loop() {
// 读取按钮的状态
int buttonState = digitalRead(buttonPin);
// 将状态打印到串口监视器,查看发生了什么
Serial.println(buttonState);
// 检查按钮是否按下。如果按下,状态将是 LOW。
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH); // 打开 LED
} else {
digitalWrite(ledPin, LOW); // 关闭 LED
}
}

数字信号是开/关的,而模拟信号可以在一个范围内取任意值。这对于读取测量连续值(如温度或光照强度)的传感器至关重要。

此函数读取其中一个模拟输入引脚(A0、A1 等)上的电压。Arduino 具有一个 10 位模数转换器(ADC,Analog-to-Digital Converter),它将 0V 到 5V 之间的输入电压映射为 0 到 1023 之间的整数值。

Arduino 开发板无法产生真正的模拟电压输出。相反,它们使用脉冲宽度调制(PWM,Pulse-Width Modulation)来模拟。analogWrite() 会快速地在 HIGH 和 LOW 之间切换数字引脚。value(从 0 到 255)决定了引脚处于 HIGH 状态的时间百分比(占空比)。这可用于调暗 LED 或控制直流电机的速度。注意:analogWrite() 仅适用于标有波浪线(~)符号的引脚。

// 这个 sketch 使用电位器使 LED 渐亮渐灭。
const int potPin = A0; // 连接电位器的模拟引脚
const int ledPin = 9; // 连接 LED 的 PWM 引脚(必须带有 ~ 符号)
void setup() {
// 模拟输入不需要 pinMode()
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 1. 读取电位器值(0 到 1023)
int sensorValue = analogRead(potPin);
Serial.print("Sensor = ");
Serial.print(sensorValue);
// 2. 将 10 位传感器值(0-1023)映射到 8 位 PWM 范围(0-255)
int outputValue = map(sensorValue, 0, 1023, 0, 255);
Serial.print(", Output = ");
Serial.println(outputValue);
// 3. 将映射后的值写入 PWM 引脚
analogWrite(ledPin, outputValue);
delay(20);
}
  • 浮空输入:如果您将引脚配置为 INPUT 模式但未连接任何东西,它将处于“浮空”状态并读取随机噪声。对于开关,始终使用 INPUT_PULLUP 或外部下拉电阻。
  • 忘记电阻:切勿将 LED 直接连接到输出引脚而不使用限流电阻(例如 220Ω)。这样做可能会烧坏 LED 或损坏 Arduino 引脚。
  • 高电流负载:Arduino 引脚安全地只能提供大约 20mA 的电流。对于需要更高电流的设备,如电机或继电器,您必须使用晶体管(transistor)、MOSFET 或继电器模块来切换更高的电流。