HOWTO · Arduino

Arduino 下拉电阻

了解如何为 Arduino 接线下拉电阻和开关、选择电阻值,并在草图中读取输入。

本页内容

要为 Arduino 接线下拉电阻,请将一个电阻从数字输入接点连接到 GND,然后在该接点与和电路板输入引脚兼容的电源电压之间连接一个开关。开关断开时输入读取为 LOW,闭合时读取为 HIGH。仅当电路板输入耐受 5V 时才使用 5V;仅支持 3.3V 的输入需要兼容的 3.3V 电源。本指南说明接线、电阻选择以及读取开关的代码。

为什么需要下拉电阻

微控制器输入消耗的电流非常小。当开关使输入处于未连接状态时,电气噪声可能会改变其电压并产生不可预测的读数;这称为浮空输入。下拉电阻在开关断开时将输入连接到 GND,使其保持在 LOW。闭合开关会将同一输入接点连接到电路板电源,因此引脚读取为 HIGH。

将外部下拉电阻连接到数字输入

构建电路,使输入引脚、一个开关端子和一个电阻端子在一个接点处汇合:

  1. 选择电路板输入引脚可以安全接受的电源电压。将按钮或开关的一个端子连接到该电源。仅当输入耐受 5V 时才使用电路板的 5V 引脚;对于仅支持 3.3V 的输入,请使用兼容的 3.3V 电源。
  2. 将开关的另一个端子连接到数字引脚 2。这一点就是输入接点。
  3. 将一个电阻从该接点连接到 GND。

原文给出的起始范围是 1 kΩ 到 100 kΩ。合适的值取决于电路板和电路,因此请查看电路板的电气规格,并考虑噪声和电流要求。电阻过低可能会在开关闭合时允许过大的电流通过开关。电阻应接在输入接点与 GND 之间;不要将电源直接连接到 GND。在下图中,+5V 标签仅适用于电路板输入耐受 5V 的情况。否则,请在该开关连接处使用与电路板兼容的电源电压。

Circuit diagram showing a switch from a board-compatible supply to the input junction and a pull-down resistor from the junction to GND; the diagram’s +5V label is for 5V-tolerant inputs only

在 Arduino 草图中读取开关

将引脚模式设置为 INPUT,并使用 digitalRead 读取开关。这个完整的草图会为每种开关状态打印一条消息。其中一小段兼容性代码使同一源代码可以作为主机端演示编译;在 Arduino IDE 中,电路板核心提供这些名称,IDE 提供程序入口点。主机端演示使用固定的 HIGH 读数,因此其打印行说明的是开关闭合的分支;它不测试硬件。

#ifndef ARDUINO
#include <iostream>
constexpr int INPUT = 0;
constexpr int LOW = 0;
constexpr int HIGH = 1;
struct SerialPort {
  void begin(long) {}
  void println(const char* message) { std::cout << message << '\n'; }
} Serial;
void pinMode(int, int) {}
int digitalRead(int) { return HIGH; }
void delay(unsigned long) {}
#endif

const int switchPin = 2;

void setup() {
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  int switchState = digitalRead(switchPin);
  if (switchState == HIGH) {
    Serial.println("Switch closed");
  } else {
    Serial.println("Switch open");
  }
  delay(200);
}

#ifndef ARDUINO
int main() {
  setup();
  loop();
}
#endif
Switch closed

按上述方式接线外部下拉电阻后,digitalRead 在开关断开时返回 LOW,在开关闭合时返回 HIGH。将每种状态对应的动作放在相应的分支中。有关更多条件逻辑,请参阅 Arduino if 语句。如果您的草图需要等待用户操作,请参阅 如何在 Arduino 中等待输入。

将模拟输入与外部下拉电阻一起使用

您可以将同一电路连接到模拟输入(例如 A0),而不是数字引脚。将电阻保持接在输入接点与 GND 之间,并将开关连接在该接点与和模拟输入兼容的电源电压之间。仅当该输入耐受 5V 时才使用 5V。开关断开时,模拟读数接近量程的接地端;开关闭合时,读数向电路板电源读数上升。确切的计数取决于电路板的模数转换器和参考电压。

对于 Arduino 草图,使用 analogRead 读取引脚,并将结果与根据电路板和电路选择的阈值进行比较。例如,当开关将接点连接到电源时,条件 reading >= threshold 表示开关闭合的状态。阈值应根据测量结果选择;像 512 这样的值并不适合每种设置。这个模拟示例是电路板特定的,并未包含在上面的主机端演示中。

使用内部上拉作为替代方案

内部上拉是一种替代电路,而不是外部下拉。它使用微控制器内置的电阻。将开关连接在数字输入与 GND 之间,然后用 INPUT_PULLUP 配置引脚。开关断开时读取为 HIGH;按下开关会将引脚连接到 GND 并读取为 LOW,这与外部下拉的逻辑相反。

在 Arduino 草图中,使用 pinMode(switchPin, INPUT_PULLUP),并将 digitalRead(switchPin) == LOW 视为按下状态。此行为取决于 Arduino 核心和物理接线,因此未在上面的主机端演示中呈现。