HOWTO · Arduino

在 Arduino 中製作計數器

製作 Arduino 按鈕計數器:安全連接 LED、在 Serial Monitor 查看計數,並選擇是否設定重設上限。

本頁內容

在 Arduino 中製作計數器時,將按鈕連接到數位輸入腳位和 GND,每次按下只讀取一次,讓變數加一,再將數值印到 Serial Monitor。以下範例適用於 Uno 相容板,並會在達到可設定的上限後重設計數。內建或外接 LED 可提示按鈕按下,但不會顯示數字計數。

Arduino 計數器的運作方式

計數器是一個儲存數字的變數,並會在事件發生時改變。在這個專案中,事件就是按下按鈕。Arduino 會反覆執行 loop() 並檢查輸入;按鈕從放開變為按下時,計數值就增加一次。短暫的消除彈跳時間間隔可過濾實體開關閉合時可能出現的快速電氣變化。

迴圈也可以重複固定次數的操作。例如,for 迴圈可以讓 LED 閃爍五次後停止;這是有限迴圈,而 Arduino 的 loop() 會持續執行。本範例的主要程式會透過持續執行的迴圈監測按鈕。

連接按鈕和 LED

使用 INPUT_PULLUP 時,請將按鈕的一端接到數位腳位 2,另一端接到 GND。按鈕放開時,板子的內部上拉電阻會讓輸入維持 HIGH;按下時,腳位會接到 GND,讀值變為 LOW。這種接法不需要外接上拉電阻。

若使用外接 LED,請將數位腳位 13 經由限流電阻接到 LED 的陽極(長腳),再將陰極(短腳)接到 GND。Uno 的內建 LED 通常連接到腳位 13;其他板子則請確認其腳位配置。程式使用 LED_BUILTIN,以採用板子定義的內建 LED 腳位。請確保 LED 電路符合板子腳位的電流限制。

撰寫並上傳按鈕計數器程式

以下完整的 C++ 原始碼可在 Arduino IDE 中作為 Arduino 程式使用。在桌面 C++ 建置環境中,隨附的測試架構會提供三次按鈕按下,讓計數器邏輯產生可見結果。將 resetAt 設為計數器應歸零時的第一個計數值;消除彈跳的時間間隔為 30 毫秒。

#ifdef ARDUINO
#include <Arduino.h>
#else
// Desktop harness for a deterministic button sequence.
#include <iostream>
using byte = unsigned char;
const int HIGH = 1, LOW = 0, INPUT_PULLUP = 2, OUTPUT = 3;
const int LED_BUILTIN = 13;
unsigned long mockNow = 0;
void pinMode(byte, int) {}
void digitalWrite(byte, int) {}
unsigned long millis() { return mockNow; }
int digitalRead(byte) {
  bool pressed = (mockNow >= 10 && mockNow < 50) ||
                 (mockNow >= 100 && mockNow < 140) ||
                 (mockNow >= 190 && mockNow < 230);
  return pressed ? LOW : HIGH;
}
struct MockSerial {
  void begin(int) {}
  void println(int value) { std::cout << value << '\n'; }
  void println(const char* value) { std::cout << value << '\n'; }
} Serial;
#endif

const byte buttonPin = 2;
const byte ledPin = LED_BUILTIN;
const unsigned long debounceMs = 30;
const int resetAt = 3;

int counter = 0;
int lastRawReading = HIGH;
int stableReading = HIGH;
unsigned long lastChangeTime = 0;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int reading = digitalRead(buttonPin);
  unsigned long now = millis();

  if (reading != lastRawReading) {
    lastRawReading = reading;
    lastChangeTime = now;
  }

  if (now - lastChangeTime >= debounceMs && reading != stableReading) {
    stableReading = reading;
    if (stableReading == LOW) {
      counter++;
      digitalWrite(ledPin, HIGH);
      Serial.println(counter);
      if (counter >= resetAt) {
        counter = 0;
        Serial.println("Counter reset");
      }
    } else {
      digitalWrite(ledPin, LOW);
    }
  }
}

#ifndef ARDUINO
int main() {
  setup();
  for (mockNow = 0; mockNow <= 230; mockNow += 10) loop();
}
#endif
1
2
3
Counter reset

在桌面測試架構中,提供的三次按鈕按下會讓計數達到 resetAt,因此輸出會依序顯示每次計數,接著顯示重設訊息。

在 Arduino IDE 中,選擇已連接的板子和連接埠,上傳程式,接著開啟 工具 > 序列監控視窗,並將鮑率設為 9600。每次計數都按下再放開按鈕一次。監控視窗會印出 1、2 和 3;第三次按下後會印出 Counter reset,下一次按下則會印出 1。按鈕穩定按下時 LED 會亮起,放開後熄滅。在實體板子上,setup() 和 loop() 由 Arduino 核心程式庫提供;桌面測試架構則為相同的計數器邏輯提供固定的輸入序列。範例中的重設標籤 Counter reset 保持英文原文。

顯示並重設計數

本範例使用 Serial Monitor 顯示數字。單顆 LED 可以提示按鈕按下已被接受,但無法顯示計數值。若要在裝置上顯示數字,可使用七段顯示器或 LCD,並依需求接線及加入程式庫;本程式並未實作這些顯示器。

計數達到 resetAt 時會自動重設:程式會印出達到的上限值,將儲存的計數設為零,然後繼續執行。將 resetAt 改成另一個正整數即可選擇不同上限。程式沒有使用獨立的重設按鈕。若要新增重設按鈕,請為它指定專用輸入腳位,並明確設定接線方式和功能,不要依賴未使用的腳位。

常見問題

我需要哪些元件?

一塊 Uno 相容板、一個按鈕、跳線和 USB 連接線,就足以計算按鈕按下次數並在電腦上查看結果。可使用內建 LED 提供視覺提示,也可以加裝外接 LED 和限流電阻。

可以使用其他顯示器嗎?

可以。LCD 或七段顯示器都能顯示數字,但各自需要合適的接線和顯示程式碼。上方範例會將數字傳送到 Serial Monitor,並且只用 LED 提示按鈕按下。

如何更改重設上限?

修改程式上方附近的 resetAt。計數器印出達到上限的數值後,就會立即重設。

計數器可以遞減嗎?

可以。若要改成遞減計數器,可在接受一次按鈕按下後減一,並決定數值到達下限時要如何處理。上方程式並未包含這項修改。

可以新增更多按鈕嗎?

可以。為每個新增的按鈕指定腳位、設定輸入,並安排不同的動作,例如遞減或手動重設。請依選用的輸入模式為各按鈕接線;主要範例只處理一個按鈕。