如何正确签订开关以避免Arduino中的虚假触发器

在使用涉及物理按钮或开关的Arduino项目时,开发人员面临的一个常见挑战是处理开关弹跳。开关弹跳会导致多个意外的触发器,从而导致项目中的行为不稳定。在这篇博客文章中,我们将深入研究哪些交换机弹跳,为什么有问题,并探索有效的方法来计算开关,以确保您的Arduino应用程序中可靠,准确的输入读数。

了解开关弹跳

机械开关(例如按钮)被广泛用于用户输入的Arduino项目中。但是,这些开关在按下或释放时并不总是会干净和破坏接触。取而代之的是,他们倾向于“反弹”,在定居之前迅速建立并破坏连接几次。这种现象称为开关弹跳。

当开关弹跳时,Arduino可能将其解释为多个快速按下或发行版,从而导致意外行为,例如多个LED闪光灯,不稳定的电动机运动或传感器的读数不稳定。拒绝是滤除这些快速,意外的信号以确保每个物理动作对应于单个,干净的输入信号的过程。

调试开关的方法

有两种主要方法可以扣除开关:硬件esvouncing和软件esvounconing。每种方法都有其优点和用例,有时甚至将它们合并为最佳结果。

1。硬件辩论

硬件辩论涉及使用物理组件稳定开关信号。最常见的硬件方法利用电阻器,电容器或专门调试ICS。

RC(电阻器)辩论

RC电路可以平滑开关弹跳引起的快速过渡。这是您可以设置它的方法:


/* RC Debounce Circuit */
const int buttonPin = 2;    // Button connected to digital pin 2
const int ledPin = 13;      // LED connected to digital pin 13

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

void loop() {
  int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

在此设置中,电阻和电容器与按钮串联连接。按下按钮时,电容器会充电,平滑电压并防止可能导致错误触发器的快速波动。

2。软件辩论

通过实现逻辑来滤除开关弹跳引起的信号的快速变化,可以在您的Arduino代码中处理软件bebouncing。此方法是灵活的,不需要其他硬件组件。

软件辩论的示例

这是一个简单的示例,说明如何在Arduino中实施软件辩论:


const int buttonPin = 2;    // Button connected to digital pin 2
const int ledPin = 13;      // LED connected to digital pin 13

int buttonState;             // Current state of the button
int lastButtonState = LOW;   // Previous state of the button
unsigned long lastDebounceTime = 0;  // Last time the button state changed
unsigned long debounceDelay = 50;    // Debounce time in milliseconds

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

void loop() {
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        digitalWrite(ledPin, !digitalRead(ledPin));
      }
    }
  }

  lastButtonState = reading;
}

在此代码中:

  • 该程序读取按钮的当前状态。
  • 如果国家从上一读中发生了变化,则重置访问计时器。
  • 只有当国家保持一致的时间超过召回延迟(在这种情况下为50毫秒),该计划才能接受新状态为有效并对其采取行动。

3。使用库进行辩论

对于更复杂的项目或简化辩论,您可以使用诸如此类的专用库 弹跳 图书馆。图书馆处理访问逻辑,使您可以专注于项目的其他方面。

示例使用弹跳库

首先,通过Arduino Library Manager安装弹跳库。然后,使用以下代码:


#include 

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

Bounce debouncer = Bounce(); 

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  debouncer.attach(buttonPin);
  debouncer.interval(25); // Debounce interval in milliseconds
}

void loop() {
  debouncer.update();

  if (debouncer.fell()) { // When button is pressed
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
  }
}

这种方法简化了访问逻辑,使您的代码清洁器和更加可维护。

选择正确的辩论方法

硬件和软件审议之间的选择取决于您的特定需求和约束:

  • 硬件辩论: 您想最大程度地减少软件开销或使用多个开关时的项目的理想选择。它可以确保信号在到达微控制器之前干净。
  • 软件辩论: 更灵活,更具成本效益,尤其是对于具有几个按钮的简单项目。它使您可以轻松地通过代码调整计时时间。
  • 基于图书馆的辩论: 最适合复杂的项目,或者当您想节省时间并避免重新发明轮子时。图书馆提供强大的测试解决方案。

辩论开关的最佳实践

  • 使用上拉或下拉电阻: 通过使用上拉或下拉电阻器,请确保按钮输入处于已知状态。这样可以防止浮动输入,减少噪声和虚假触发器。
  • 一致的调试计时: 无论是使用硬件还是软件辩论,都要保持一致的访问间隔,以确保在不同的按钮和条件上可靠的性能。
  • 如有必要,结合方法: 对于高度敏感的应用程序,请考虑将硬件和软件辩论同时结合以实现最高的可靠性。

结论

拒绝开关是开发涉及用户输入的可靠Arduino项目的关键步骤。无论您选择硬件解决方案,软件算法还是利用现有的库,实施有效的审阅机制都可以使您免受处理错误触发器和不稳定行为的挫败感。通过了解开关弹跳的原理并应用适当的辩论技术,您可以提高Arduino创作的性能和可靠性。

发表评论

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.