【问题标题】:debounce with two button to turn on different leds with Arduino用两个按钮去抖动,用 Arduino 打开不同的 LED
【发布时间】:2017-09-29 08:46:48
【问题描述】:

我想对两个按钮进行去抖动。所以打开红色 LED 或绿色 LED 知道哪个按钮按下了我的程序仅适用于 1 个按钮。

我认为我需要一个用于两个按钮的数组。

谁能帮我改进我的代码两个或更多按钮?

int boton = 11;
int led = 13;

boolean estadoAnterior = LOW;
boolean estadoActual = LOW;
boolean ledOn = false;
int cont=0;
void setup()
{
  pinMode(boton, INPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

boolean rebote(boolean eAnterior)
{
  boolean eActual = digitalRead(boton);
  if (eAnterior != eActual)
  {
    delay(5);
    eActual = digitalRead(boton);
  }
  return eActual;
}

void loop()
{
  estadoActual = rebote(estadoAnterior);
  if (estadoAnterior == LOW && estadoActual == HIGH)
  {
    ledOn = !ledOn;
    cont++;
    Serial.println(cont);
  }
  estadoAnterior = estadoActual;

  digitalWrite(led, ledOn);

}

【问题讨论】:

  • 显示您尝试过的内容
  • 这是一个设计问题。使用delay(),您实际上暂停了您的程序,并且只有一个线程,没有办法使用这种方法来消除两个按钮的抖动。草图解决方案:改用一些计时器和状态机。
  • @FelixPalmen Arduino 是裸机微控制器,而不是 PC。你的评论毫无意义。
  • @Lundin 如果你不知道,这一个状态机。这或多或少是我的代码在做什么,它需要存储有关去抖动阶段是否处于活动状态以及最后读取的值是什么的信息。所以请停止你粗鲁的cmets,谢谢。

标签: c function arduino debounce


【解决方案1】:

总体而言,使用忙延迟是一种相当粗略的方法来消除按钮的弹跳,但它适用于业余爱好者。

  • estadoAnterior 更改为预期的按钮状态数组。
  • 为按钮引脚boton 制作一个整数数组。 (在真正的 MCU 编程中,这将是一组端口 + 掩码。)
  • 在 debounce 函数中,为需要 debounce 的按钮创建 debounce bool 值数组。检查哪些需要循环去抖动。
  • 如果有任何按钮需要去抖动,请等待 5 毫秒。不是每个按钮,而是一次。 (顺便说一句,5ms 可能不够,也可能不够,具体取决于按钮类型)
  • 再次读取该按钮并使用结果。

更专业的方法可能类似于this

完成后,将所有标识符重写为英文。我们在编程时不使用我们的母语,因为这会使源代码变得一团糟。您的代码混合了英语和您的母语,很难阅读。

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多