Arduino - I/O 函数
Arduino - 基本 I/O 函数
Section titled “Arduino - 基本 I/O 函数”通用输入/输出(GPIO,General-Purpose Input/Output)引脚是您的 Arduino 与物理世界之间的桥梁。您可以将它们配置为读取环境信息(输入)或控制设备(输出)。本章涵盖了管理数字和模拟 I/O 的基本函数。
使用 pinMode() 配置引脚
Section titled “使用 pinMode() 配置引脚”在使用引脚之前,您必须告知 Arduino 它的用途。pinMode() 函数通常在 setup() 中调用,用于将特定引脚配置为输入或输出模式。
pinMode() 语法
Section titled “pinMode() 语法”pinMode(pinNumber, mode);pinNumber:您要配置的引脚编号(例如13或A0)。mode:要设置的模式。最常见的三种模式是:-
INPUT:将引脚配置为读取信号,例如来自传感器或开关的信号。引脚处于高阻抗状态,这意味着它消耗的电流非常小。
-
OUTPUT:将引脚配置为发送信号,例如点亮 LED 或启动电机。引脚处于低阻抗状态,能够提供显著电流。
-
INPUT_PULLUP:一种特殊的输入模式,启用内置上拉电阻。这对于无需外部元件即可读取开关状态非常有用。
数字 I/O:使用 HIGH 和 LOW
Section titled “数字 I/O:使用 HIGH 和 LOW”数字 I/O 处理离散信号:开或关,1 或 0,HIGH(高电平)或 LOW(低电平)。在像 Uno 这样的 5V Arduino 上,HIGH 是 5V,LOW 是 0V。
digitalWrite(pin, value)
Section titled “digitalWrite(pin, value)”当引脚配置为 OUTPUT 模式时,digitalWrite() 将其设置为 HIGH 或 LOW。
digitalRead(pin)
Section titled “digitalRead(pin)”当引脚配置为 INPUT 或 INPUT_PULLUP 模式时,digitalRead() 返回其当前状态,即 HIGH 或 LOW。
示例:按钮控制 LED
Section titled “示例:按钮控制 LED”这个完整的 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 }}模拟 I/O:使用值范围
Section titled “模拟 I/O:使用值范围”数字信号是开/关的,而模拟信号可以在一个范围内取任意值。这对于读取测量连续值(如温度或光照强度)的传感器至关重要。
analogRead(pin)
Section titled “analogRead(pin)”此函数读取其中一个模拟输入引脚(A0、A1 等)上的电压。Arduino 具有一个 10 位模数转换器(ADC,Analog-to-Digital Converter),它将 0V 到 5V 之间的输入电压映射为 0 到 1023 之间的整数值。
analogWrite(pin, value) - PWM
Section titled “analogWrite(pin, value) - PWM”Arduino 开发板无法产生真正的模拟电压输出。相反,它们使用脉冲宽度调制(PWM,Pulse-Width Modulation)来模拟。analogWrite() 会快速地在 HIGH 和 LOW 之间切换数字引脚。value(从 0 到 255)决定了引脚处于 HIGH 状态的时间百分比(占空比)。这可用于调暗 LED 或控制直流电机的速度。注意:analogWrite() 仅适用于标有波浪线(~)符号的引脚。
示例:用电位器渐变 LED
Section titled “示例:用电位器渐变 LED”// 这个 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);}常见错误与最佳实践
Section titled “常见错误与最佳实践”- 浮空输入:如果您将引脚配置为
INPUT模式但未连接任何东西,它将处于“浮空”状态并读取随机噪声。对于开关,始终使用INPUT_PULLUP或外部下拉电阻。 - 忘记电阻:切勿将 LED 直接连接到输出引脚而不使用限流电阻(例如 220Ω)。这样做可能会烧坏 LED 或损坏 Arduino 引脚。
- 高电流负载:Arduino 引脚安全地只能提供大约 20mA 的电流。对于需要更高电流的设备,如电机或继电器,您必须使用晶体管(transistor)、MOSFET 或继电器模块来切换更高的电流。