亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

如何将按钮与 Arduino 连接起?

发布时间:2021-07-13
分享到:

如何将按钮与 Arduino 连接起?

发布时间:2021-07-13
分享到:

本文简单的介绍了如何使用 Arduino digitalRead 函数将按钮与 Arduino 连接起来。当按钮与 Arduino 简单连接时,按钮会有异常的行为。我们将通过使用 Arduino 的外部上拉或下拉电阻或内部上拉电阻来解决这个问题。

Arduino 按钮教程所需的组件:

  • Arduino Uno
  • 按钮
  • 10k 电阻
  • 220Ω电阻
  • 跳线
  • 面包板

简单按钮连接(异常行为)

1、电路连接

将 Arduino 的 5V 连接到按钮的一侧,并将按钮的另一侧连接到 Arduino 的引脚 2

然后将Arduino的引脚13连接到LED的正极,通过220Ω电阻将LED的另一端连接到GND

将看到 LED 的行为不规律,因为当按钮不被按下时,引脚 2 将不会连接到任何东西,它会变成浮动引脚。因此会得到一系列不稳定的“1”和“0”。

当没有任何东西连接到输入引脚时,并不意味着它是逻辑零。

为了克服这个问题,我们使用一个下拉或上拉电阻,将在按钮不被按下时获得一个低电平。还可以使用内部上拉电阻。

2、Arduino代码

在串行监视器上显示了输出,并添加了延迟,以便可以看到按钮的输出。

//设置引脚编号
const int buttonPin = 2;     // 按钮引脚的编号
const int ledPin =  13;      // LED 引脚编号
// 变量会改变
int buttonState = 0;         // 读取按钮状态的变量
void setup() {
  Serial.begin(9600);
  // 将 LED 引脚初始化为输出
  pinMode(ledPin, OUTPUT);
  //将按钮引脚初始化为输入
  pinMode(buttonPin, INPUT);
}
void loop() {
  //读取按钮值的状态
  buttonState = digitalRead(buttonPin);
  //在串行监视器上显示按钮的状态
  Serial.println(buttonState);
  // c检查按钮是否被按下。
  // 如果是,则 buttonState 为 HIGH
  if (buttonState == HIGH) {
    // 打开 LED
    digitalWrite(ledPin, HIGH);
  } else {
    // 关闭 LED
    digitalWrite(ledPin, LOW);
  }
  // 添加延迟以便我们可以看到按钮的输出
  delay(100);
}

3、演示

使用外部下拉电阻

1、电路连接

以这种方式连接电路时,当按钮未被按下时,会获得低电平,当按钮被按下时获得一个高状态。

电路与前一个相同,唯一需要更改的是将 10k 电阻连接到已连接 Arduino 引脚 2 的按钮一侧,并将此 10k 电阻的另一侧连接到 Arduino 的地。

当按下按钮时,会得到一个高电平,因为来自 Arduino 的 5V 引脚的电流将流到 Arduino 的引脚 2,当按钮未被按下时,会得到一个低电平,因为现在引脚 2将通过 10k 电阻连接到 GND。

2、Arduino代码

代码与简单按钮连接的代码相同

3、演示

使用外部上拉电阻

1、电路连接

上拉电阻将按钮的初始状态保持为高电平。所以当按钮未被按下时,会得到一个 HIGH,当按钮被按下时,会得到一个 LOW。

对于此电路,将按钮的一侧连接到 Arduino 的引脚 2,并通过 10k 电阻将同一侧连接到 Arduino 的 5V。将按钮的另一侧连接到 Arduino 的 GND。然后连接LED。

当按钮未被按下时,电流将从 Arduino 的 5V 流向 Arduino 的引脚 2,Arduino 将读取高电平状态,当按钮被按下时,电流将从电阻流向 GND并且输入引脚将读取低电平。

在这种情况下,如果不使用 10k 电阻,那么按下按钮时 5V 将直接连接到 GND,会出现短路。

2、Arduino代码

代码与简单按钮连接的代码相同。

3、演示

使用内部上拉电阻

1、电路连接

由于上拉电阻非常常见,包括 Arduino 在内的许多微控制器都有内部上拉电阻,我们可以通过代码启用或禁用,以避免使用外部上拉电阻。(Arduino 只有上拉电阻)

要使用内部上拉电阻,请将按钮的一侧连接到 Arduino 的引脚 2,将按钮的另一侧连接到 Arduino 的地。然后将 LED 与 Arduino 连接。

现在当按钮处于打开状态时 LED 会亮起,当按钮被按下时它会变低。

2、Arduino代码

//设置引脚编号
const int buttonPin = 2;     // 按钮引脚的编号
const int ledPin =  13;      // LED 引脚编号
// 变量会改变
int buttonState = 0;         // 读取按钮状态的变量
void setup() {
  Serial.begin(9600);
  // 将 LED 引脚初始化为输出
  pinMode(ledPin, OUTPUT);
  // 将按钮引脚初始化为输入
  pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
  // 读取按钮值的状态
  buttonState = digitalRead(buttonPin);
  // 在串行监视器上显示按钮的状态
  Serial.println(buttonState);
  // 检查按钮是否被按下。
  // 如果是,则 buttonState 为 HIGH
  if (buttonState == HIGH) {
    // 打开 LED
    digitalWrite(ledPin, HIGH);
  } else {
    // 关闭 LED
    digitalWrite(ledPin, LOW);
  }
  // 添加延迟以便我们可以看到按钮的输出
  delay(100);
}

3、演示

Arduino 按钮教程实用示例

在按下两次按钮时点亮 LED,并在按下一次按钮时使 LED 变低。

1、电路图

此电路图与我们用于外部下拉电阻器的电路图相同

2、Arduino代码

const int  buttonPin = 2;    // 按钮所连接的引脚
const int ledPin = 13;       // LED 连接到的引脚
// 变量会改变
int counter = 1;   //按钮按下次数的计数器
int buttonState = 0;         //按钮的当前状态
int lastButtonState = 0;     // 按钮之前的状态
void setup() {
  // 将按钮引脚初始化为输入
  pinMode(buttonPin, INPUT);
  // 将 LED 初始化为输出
  pinMode(ledPin, OUTPUT);
  // 初始化串行通信
  Serial.begin(9600);
}
void loop() {
  // 读取按钮输入引脚
  buttonState = digitalRead(buttonPin);
  // 比较 buttonState 和它之前的状态
  if (buttonState != lastButtonState) {
    // 如果状态改变了,增加计数器
    if (buttonState == HIGH) {
      //如果当前状态为 HIGH 则按钮
      // 从关到开:
      counter++;
      Serial.println(counter);
    }
    // 延迟一点以避免弹跳
    delay(50);
  }
  //将当前状态保存为下一次循环的最后状态
  lastButtonState = buttonState;
  //按两次按钮后点亮 LED
  if (counter >= 3) {
    digitalWrite(ledPin, HIGH);
    counter = 0;
  }
  //按下一个按钮后关闭 LED
  else if (counter == 1){
    digitalWrite(ledPin, LOW);
  }
}

演示:

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论