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


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
本文简单的介绍了如何使用 Arduino digitalRead 函数将按钮与 Arduino 连接起来。当按钮与 Arduino 简单连接时,按钮会有异常的行为。我们将通过使用 Arduino 的外部上拉或下拉电阻或内部上拉电阻来解决这个问题。
Arduino 按钮教程所需的组件:
简单按钮连接(异常行为)
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);
}
}
演示:
基于Arduino的温控风扇
2021-07-06
基于esp8266的便携式无线PM2.5检测电路设计
2020-02-07
基于MEMS的惯性测量装置 (IMU) 检测电路设计
2020-02-06
如何将超声波传感器与 Arduino 连接
2021-07-02
硬实力,游戏机自己做,十个经典游戏机方案合集
2020-08-24
基于树莓派和Arduino打造的PLC EtherCAT电路设计
2020-02-25
入门指南:TFT彩色显示屏,带Arduino和ESP8266
2020-04-23
Arduino最小系统板设计PCB板及原理图
2020-01-17
带有Arduino和ESP32的实时时钟
2020-04-17
基于SI4735 Arduino库实现一个简单的FM和AM收音机
2020-05-12
讨论