目录

一、Arduino 的 I/O 概述

二、数字 I/O 工作方式

1. 设置引脚模式

读写数字信号

三、模拟输入(Analog Input)

1. 原理

2. 使用方法

四、模拟输出(PWM)

1. 原理

2. 使用方法

五、注意事项


一、Arduino 的 I/O 概述

Arduino 的引脚可以分为两类:

  1. 数字 I/O (Digital Input/Output)

    • 只能识别和输出 0 或 1(低电平 0V,高电平 5V/3.3V,具体看开发板)。

    • 可用于控制 LED、读取按钮开关状态、与数字传感器通信等。

  2. 模拟 I/O (Analog Input/Output)

    • 模拟输入 (Analog Input):通过板载的 ADC(模数转换器) 把连续的电压(0V~5V 或 0~3.3V)转换成离散的数值(通常 10 位,范围 0~1023)。

    • 模拟输出 (Analog Output):Arduino 没有真正的 DAC(数模转换器),所以它的“模拟输出”其实是 PWM(脉冲宽度调制) 信号,用来“模拟”电压大小。


二、数字 I/O 工作方式

1. 设置引脚模式

setup() 里定义:

pinMode(pin, INPUT);      // 设置为输入
pinMode(pin, INPUT_PULLUP); // 输入并启用内部上拉电阻
pinMode(pin, OUTPUT);     // 设置为输出

读写数字信号

  • 输入:

int buttonState = digitalRead(2); // 读取引脚 2 的电平(0 或 1)

输出:

digitalWrite(13, HIGH); // 将引脚 13 拉高(5V)
digitalWrite(13, LOW);  // 将引脚 13 拉低(0V)

例子:按钮控制 LED

const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;

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

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);  // 点亮 LED
  } else {
    digitalWrite(ledPin, LOW);   // 关闭 LED
  }
}

三、模拟输入(Analog Input)

1. 原理

  • Arduino UNO 有 6 个模拟输入引脚(A0~A5)。

  • 电压范围:0V ~ 5V

  • ADC 分辨率:10 位 → 输出数值 0~1023

    • 0 → 0V

    • 1023 → 5V

    • 例如:输入 2.5V → 大约读到 512

2. 使用方法

int sensorValue = analogRead(A0); // 读取 A0 上的电压

例子:电位器读数

int sensorValue = 0;

void setup() {
  Serial.begin(9600); // 打开串口监视器
}

void loop() {
  sensorValue = analogRead(A0);  
  Serial.println(sensorValue);   // 打印 0~1023 的数值
  delay(500);
}

四、模拟输出(PWM)

1. 原理

  • Arduino UNO 的某些数字引脚支持 PWM 输出(标有 ~ 的引脚,如 3, 5, 6, 9, 10, 11)。

  • PWM 用高速开关信号的 占空比 来模拟电压:

    • 0% 占空比 → 0V

    • 50% 占空比 → 2.5V(假设 5V 电源)

    • 100% 占空比 → 5V

2. 使用方法

analogWrite(pin, value); 
// value 范围 0~255
// 0 = 0V, 255 ≈ 5V

例子:呼吸灯

int led = 9;   // 支持 PWM 的引脚
int brightness = 0;
int fadeAmount = 5;

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

void loop() {
  analogWrite(led, brightness);   // 设置亮度
  brightness = brightness + fadeAmount;
  
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount; // 反向变化
  }
  delay(30);
}

五、注意事项

  1. 电压范围:不要给 Arduino 模拟输入超过其供电电压(UNO 是 5V,Nano/ESP32 可能是 3.3V)。

  2. 电流限制:每个 I/O 引脚最大约 20mA,绝对不能超过 40mA。

  3. PWM ≠ 真正模拟电压,它是数字信号模拟的“平均电压”,对 LED、马达有效,但不能直接输出真正的连续电压波形。

  4. 滤波电路:如果需要真正平滑的模拟电压,可以在 PWM 输出端加一个 RC 滤波器(电阻 + 电容)。


✅ 总结一下:

  • Digital I/OpinMode() + digitalRead()/digitalWrite()

  • Analog InputanalogRead() 获取 0~1023 对应电压

  • Analog Output (PWM)analogWrite() 设置 0~255 对应占空比

下面我画了一个Arduino I/O 总结图(数字输入/输出,模拟输入/输出函数一览)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐