iT邦幫忙

0

詢問ARDUINO按鈕消抖

  • 分享至 

  • xImage

請問程式按鈕可以怎麼防止消抖,不用Boounce庫,雖然網路上很多範例,但是都表面上的讓LED不閃爍,用COMTool接收還是會有彈跳的存在。
請問防彈跳程式如何寫?

SK. iT邦新手 5 級 ‧ 2024-04-25 14:17:52 檢舉
可以用delay
https://www.lazytomatolab.com/as-08/
https://hackmd.io/@yizhewang/S1pGNzKEN
話說你的COMTool是接收誰,直接接收按鈕的話肯定彈
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2024-04-22 22:38:47

替你問Google Gemini

按鍵消抖(Button Debouncing)是指消除按鍵在按下或松開時產生的抖動現象。抖動會導致按鍵連續觸發,從而產生意想不到的結果。

有兩種主要的消抖方法:硬件消抖和軟件消抖。

**硬件消抖**

硬件消抖是通過使用電子元件來消除抖動。最常用的硬件消抖方法是使用 RC 濾波器。RC 濾波器由一個電阻和一個電容組成,它可以平滑按鍵信號並消除抖動。

RC 滤波器: [已移除無效網址]

RC 濾波器的基本工作原理是利用電容的充放電特性來消除抖動。當按鍵按下時,電容開始充電。電容充好電後,按鍵信號才會穩定下來。同樣,當按鍵松開時,電容會放電。電容放電完畢後,按鍵信號才會穩定下來。

RC 濾波器的優點是簡單有效,但缺點是需要額外的電子元件。

**軟件消抖**

軟件消抖是通過使用軟件來消除抖動。最常用的軟件消抖方法是使用延時。

在軟件消抖中,程序會在讀取按鍵狀態之前等待一段延時。這段延時足夠長,以至於抖動會消失。例如,以下代碼使用 10 毫秒的延時來消抖:

```c++
bool lastButtonState = false;

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

void loop() {
  bool buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState) {
    if (buttonState) {
      // 按鍵按下
    } else {
      // 按鍵松開
    }
  }

  lastButtonState = buttonState;

  delay(10);
}

軟件消抖的優點是不需要額外的電子元件,但缺點是可能會降低程序的性能。

如何選擇消抖方法

在實際應用中,可以根據具體情況選擇合適的消抖方法。如果對性能要求不高,可以使用硬件消抖。如果對性能要求較高,可以使用軟件消抖。

以下是一些具體的建議:

  • 如果按鍵使用頻率較低,可以使用硬件消抖。
  • 如果按鍵使用頻率較高,可以使用軟件消抖。
  • 如果按鍵需要在惡劣環境中使用,可以使用硬件消抖。
  • 如果按鍵的成本要求較低,可以使用軟件消抖。

在您的情況下,您希望能夠在不使用 Bounce 庫的情況下消除按鍵抖動。Bounce 庫是一個流行的軟件消抖庫,但它可能會增加程序的體積和複雜性。

以下是一種不使用 Bounce 庫的軟件消抖方法:

bool lastButtonState = false;
unsigned long lastButtonChangeTime = 0;

const unsigned long debounceTime = 10; // 抖動時間(毫秒)

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

void loop() {
  bool buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState) {
    lastButtonChangeTime = millis();
  }

  if ((millis() - lastButtonChangeTime) >= debounceTime) {
    if (buttonState) {
      // 按鍵按下
    } else {
      // 按鍵松開
    }
  }

  lastButtonState = buttonState;
}

此代碼使用變量 lastButtonChangeTime 來跟踪上次按鍵狀態更改的時間。如果當前的時間與上次按鍵狀態更改的時間之間的差值大於或等於 debounceTime,則認為按鍵狀態已穩定下來。

此方法的優點是不需要額外的庫,但缺點是需要更多代碼。

您可以根據自己的需要調整 debounceTime 的值。debounceTime 的值越大,消抖效果越好,但也會導致程序的響應速度變慢。

0
YC
iT邦好手 1 級 ‧ 2024-04-23 16:33:10

粗略的邏輯如下,
當你偵測到on,且隔n毫秒後還是on,則按鍵狀況為按下
當你偵測到off,且隔m毫秒後還是off,則按鍵狀況為放開

如果你的按鍵真的很爛,用下面的邏輯
當你偵測到on,且隔n毫秒後

  1. on,則按鍵狀況為按下
  2. off,再隔n毫秒看結果

我要發表回答

立即登入回答