HOWTO · Arduino

Arduino에서 카운터 만들기

Arduino에서 루프를 사용하여 카운터를 만들 수 있습니다.

이 페이지의 내용

Arduino에서 카운터를 만들려면 버튼을 디지털 입력 핀과 GND에 연결하고, 버튼을 누를 때마다 한 번씩 읽어 변수 값을 증가시킨 다음 그 값을 시리얼 모니터에 출력합니다. 아래 예제는 Uno 호환 보드를 대상으로 하며, 설정 가능한 한계값에 도달하면 카운트를 초기화합니다. 내장 LED나 외부 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에서 스케치로 사용할 수 있습니다. 데스크톱 C++ 빌드에서는 함께 포함된 하네스가 버튼 입력 세 번을 제공하므로 카운터 로직의 결과를 확인할 수 있습니다. 카운트가 0으로 돌아가야 하는 첫 번째 값으로 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에서 연결된 보드와 포트를 선택해 스케치를 업로드한 다음 Tools > Serial Monitor를 열고 전송 속도를 9600으로 설정하세요. 카운트할 때마다 버튼을 한 번 눌렀다가 놓습니다. 모니터에는 1, 2, 3이 출력되고, 세 번째 누름 뒤에는 Counter reset이 출력되며 다음 누름에는 1이 출력됩니다. 변경 없는 눌림 상태가 유지되는 동안 LED가 켜지고 버튼을 놓으면 꺼집니다. 하드웨어에서는 setup()과 loop()가 Arduino 코어를 사용하고, 데스크톱 하네스는 같은 카운터 로직에 고정된 입력 순서를 제공합니다. 예제의 Counter reset 문구는 바이트 동일성 때문에 영어 그대로 표시됩니다.

카운트 표시 및 초기화

이 예제에서 숫자를 표시하는 장치는 시리얼 모니터입니다. LED 하나는 버튼 입력이 인식되었음을 알릴 수 있지만 카운트 값을 보여주지는 못합니다. 기기에서 숫자를 표시하려면 7세그먼트 모듈이나 LCD와 필요한 배선 및 라이브러리를 사용하세요. 이러한 디스플레이는 이 스케치에 구현되어 있지 않습니다.

초기화는 resetAt에서 자동으로 일어납니다. 스케치는 한계값을 출력하고 저장된 카운트를 0으로 설정한 뒤 계속 실행됩니다. 다른 한계값을 선택하려면 resetAt을 다른 양수로 바꾸세요. 이 코드는 별도의 초기화 버튼을 사용하지 않습니다. 버튼을 추가한다면 사용하지 않는 핀에 의존하지 말고, 별도 입력으로 지정해 배선과 동작을 명확히 정의하세요.

FAQ

어떤 부품이 필요한가요?

Uno 호환 보드, 푸시 버튼, 점퍼 와이어, USB 케이블이면 버튼 누름을 세고 컴퓨터에서 확인할 수 있습니다. 내장 LED를 사용하거나, 시각적 피드백을 위해 외부 LED와 전류 제한 저항을 추가하세요.

다른 디스플레이를 사용할 수 있나요?

네. LCD나 7세그먼트 디스플레이로 숫자 값을 표시할 수 있지만, 각각 적절한 연결과 디스플레이 코드가 필요합니다. 위 예제는 숫자를 시리얼 모니터로 보내고 LED는 버튼 입력 표시 용도로만 사용합니다.

초기화 한계값은 어떻게 바꾸나요?

스케치 상단 근처의 resetAt을 수정하세요. 카운터는 한계값에 해당하는 수를 출력한 직후 초기화됩니다.

카운터를 감소시킬 수도 있나요?

네. 감소형 카운터를 만들려면 인식된 버튼 입력에서 1을 빼고, 하한값에 도달했을 때 어떻게 할지 정하세요. 이 변경은 위 스케치에 포함되어 있지 않습니다.

버튼을 더 추가할 수 있나요?

네. 추가 버튼마다 핀을 지정하고 입력을 설정한 뒤 감소나 수동 초기화처럼 서로 구분되는 동작을 할당하세요. 선택한 입력 모드에 맞춰 각 버튼을 배선해야 합니다. 메인 예제는 버튼 하나만 처리합니다.