按键开关在arduino中应用

1.按键开关又名轻触开关

是指利用按钮推动传动机构,使动触点与静触点按通或断开并实现电路换接的开关。

2.原理图图标示意

3.引脚状态

按键未按下时:1.l 与1.r接通; 2.l与2.r接通; 1号引脚与2号引脚断开;

当按下按键,按键的四个引脚都接通

4.按键抖动

当按下物理按钮时,电路会打开和关闭数十次或数百次。这种现象被称为按键抖动。发生这种情况是因为按钮的机械性质:金属触点结合在一起时,有一段短暂的过度时间——触点的接触不充分,这导致一系列快速的开放/关闭。

所以在有轻触开关按键的程序中,须要去除抖动;

5.按键去抖示例

物料:

1PCS 220欧姆电阻

1PCS LED灯

1PCD 轻触开关

1PCS UNO开发板

接线图:

代码示例:

const int buttonPin = 2; // 定义按键连接的引脚为数字引脚2
const int ledPin = 13;   // 定义LED连接的引脚为数字引脚13(通常用于板上LED)

bool ledState = false;   // 当前LED的状态,初始为false(OFF)
int buttonState;         // 用于存储当前按键读取的状态
int lastButtonState = HIGH; // 用于存储上一次按键读取的状态,初始为HIGH(未按下)
unsigned long lastDebounceTime = 0; // 用于存储上一次防抖计时器的时间
unsigned long debounceDelay = 100; // 防抖延迟时间设置为100毫秒

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 设置按键引脚为输入并启用内部上拉电阻
  pinMode(ledPin, OUTPUT);         // 设置LED引脚为输出模式
  digitalWrite(ledPin, ledState);  // 设置LED初始状态为关闭
  Serial.begin(9600);              // 初始化串行通信,波特率为9600
}

void loop() {
  int reading = digitalRead(buttonPin); // 读取当前按键状态

  // 如果按键状态有变化,则重置防抖计时器
  if (reading != buttonState) {
    lastDebounceTime = millis(); // 记录当前时间
    buttonState = reading;       // 更新按钮状态

    // 打印当前时间到串行监视器
    Serial.println(millis());
    
    // 如果当前时间小于防抖延迟加上上一次防抖时间,则进入等待
    if(millis() < debounceDelay + lastDebounceTime){
      // 等待直到按键被释放
      while(!digitalRead(buttonPin));
      
      // 如果按键在按下后变为未按下(HIGH)
      if(reading == HIGH){
        ledState = !ledState; // 切换LED状态
        digitalWrite(ledPin, ledState); // 更新LED引脚状态
        // 打印LED状态到串行监视器
        Serial.print("led:");
        Serial.println(ledState);
      }
    }
  }

  // 在循环结束前更新按钮状态
  buttonState = reading;
}

代码解析:

控制一个连接在Arduino数字引脚13上的LED灯的开和关状态,基于一个连接在数字引脚2上的按键输入。当按键被按下时,程序会切换LED的状态(开或关),并在串行监视器中打印LED当前的状态。

为了解决按键抖动的问题,程序实现了防抖机制,确保只有在按键状态稳定后才进行LED状态的切换。通过启用内部上拉电阻,按键未按下时引脚处于高电平(HIGH),按键被按下时引脚变为低电平(LOW)。程序在主循环中不断检查按键状态,当检测到状态变化时启动防抖逻辑,确保LED在按键按下后能可靠地切换状态

关注tao&bao店铺:南瓜造物,为您解锁更多好物

### 使用Arduino实现按键控制 #### 按键控制LED灯的亮灭 当按下按钮时,电路闭合使得Arduino能够读取低电平信号从而触发特定事件。对于简单的按键控制LED的应用场景,可以采用内置上拉电阻的方式简化外部元件的需求[^4]。 ```cpp const int buttonPin = 7; // the number of the pushbutton pin const int ledPin = 12; // the number of the LED pin void setup() { pinMode(buttonPin, INPUT_PULLUP); // initialize the pushbutton pin as an input with internal pull-up resistor pinMode(ledPin, OUTPUT); // initialize the LED pin as an output } void loop() { if (digitalRead(buttonPin) == LOW) { // check if the pushbutton is pressed. digitalWrite(ledPin, HIGH); // turn LED on } else { digitalWrite(ledPin, LOW); // turn LED off } } ``` 此段代码展示了如何利用Arduino板上的数字输入引脚监听按键状态变化,并据此改变LED的工作模式。这里使用了`INPUT_PULLUP`作为`pinMode()`函数参数之一,意味着即使不连接任何外设,默认情况下该引脚也会处于高电平状态;只有当按键被按下时才会变为低电平,进而激活相应的逻辑判断分支。 #### 处理按键抖动问题 实际应用中,机械式按键由于物理特性,在切换状态瞬间可能会产生短暂而不稳定的电压波动——即所谓的“抖动”。为了消除这种干扰因素带来的误判风险,可以在原有基础上加入一段适当长度的时间延迟来进行二次确认: ```cpp int lastButtonState = HIGH; unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 50; void loop() { int reading = digitalRead(buttonPin); if (reading != lastButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != buttonState) { buttonState = reading; if (buttonState == LOW) { digitalWrite(ledPin, !digitalRead(ledPin)); } } } lastButtonState = reading; } ``` 上述改进版本不仅解决了因接触不良造成的瞬态错误报告现象,还实现了每次有效点击都能使LED状态发生反转的效果。值得注意的是,此处引入了一个新的变量`lastDebounceTime`用于记录最近一次检测到按键变动的具体时刻,以便后续计算经过了多少毫秒以决定是否应该信任当前采样值[^3]。 #### 控制舵机角度调整 除了基本的开/关操作之外,还可以借助额外组件扩展更多有趣的功能。例如,配合伺服电机完成更精细的动作指令发送任务。此时需先确保已成功加载官方提供的Servo类库支持,之后按照如下模板编写相应程序片段即可达成目标[^2]: ```cpp #include <Servo.h> Servo myservo; // create servo object to control a servo int pos = 90; // variable to store the servo position const int buttonPinA = 8; // first button connected to pin 8 const int buttonPinB = 9; // second button connected to pin 9 void setup() { myservo.attach(10); // attaches the servo on pin 10 to the servo object pinMode(buttonPinA, INPUT); pinMode(buttonPinB, INPUT); } void loop() { if (!digitalRead(buttonPinA)) { pos += 1; if (pos >= 180) pos = 180; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); } if (!digitalRead(buttonPinB)) { pos -= 1; if (pos <= 0) pos = 0; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); } } ``` 这段实例说明了怎样依据不同按键的不同组合来连续调节指定范围内任意位置处的目标对象姿态角的变化情况。同时考虑到安全性和实用性方面的要求,也加入了边界条件限制措施防止超出允许范围内的非法动作执行可能引发的安全隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值