[아두이노] 스위치 노이즈, 디바운싱(Debouncing) 가이드


스위치를 한 번 눌렀는데 LED가 켜졌다가 바로 꺼지거나, 혹은 아예 반응하지 않는 경험.
처음엔 “내 코드가 잘못됐나?” 싶지만, 사실 문제는 코드가 아니라 물리 세계에 있습니다.

버튼은 우리가 생각하는 것처럼 “딱 한 번” 눌리지 않습니다.
접점이 닿는 순간, 내부에서는 금속이 튕기며 수십 번 ON/OFF를 반복합니다.

인간에게는 한 번의 클릭이지만, 마이크로컨트롤러에게는
이게 하나의 신호가 아니라 노이즈 덩어리로 보입니다.

이 현상을 바운싱(Bouncing)이라고 하고,
이를 해결하는 기술이 바로 디바운싱(Debouncing)입니다.


🔧 해결의 핵심: “잠깐 기다렸다가 다시 보자”

디바운싱의 핵심 아이디어는 단순합니다.

“변화가 감지되면, 바로 믿지 말고 잠깐 기다렸다가 다시 확인하자.”

접점이 안정되는 데 걸리는 시간은 보통 몇 ms 수준입니다.
그래서 약 5ms 정도 지연 후 다시 읽으면, 훨씬 신뢰할 수 있는 값을 얻을 수 있습니다.


🧠 함수로 만드는 이유

이 로직을 loop() 안에 직접 써도 되지만,
그렇게 하면 코드가 점점 지저분해집니다.

그래서 우리는 이 동작을 함수로 캡슐화합니다.


💻 전체 코드 (생략 없음)

const int LED = 9; // LED를 9번 핀에 연결
const int BUTTON = 2; // 버튼을 2번 핀에 연결

boolean lastButton = LOW; // 이전 버튼 상태 저장 변수
boolean currentButton = LOW; // 현재 버튼 상태 저장 변수
boolean ledOn = false; // LED의 현재 상태 (ON/OFF)

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT); // 입력 모드 설정 (풀다운 저항 필요)
}

/*
* 디바운싱 함수 (Debouncing Function)
* 이전 버튼 상태를 입력(last)받아,
* 노이즈가 제거된 현재 상태를 반환(return)합니다.
*/
boolean debounce(boolean last) {
boolean current = digitalRead(BUTTON); // 1. 현재 버튼 상태를 읽음

if (last != current) { // 2. 상태가 변했다면 (바운싱 의심)
delay(5); // 3. 5ms 동안 기다림
current = digitalRead(BUTTON); // 4. 다시 읽어서 안정된 상태 확인
}

return current; // 5. 최종 결과값 반환
}

void loop() {
// 1. 디바운싱 함수 호출
currentButton = debounce(lastButton);

// 2. 상승 에지 검출 (LOW → HIGH)
if (lastButton == LOW && currentButton == HIGH) {
ledOn = !ledOn; // LED 상태 토글
}

// 3. 상태 업데이트
lastButton = currentButton;

// 4. LED 출력
digitalWrite(LED, ledOn);
}

⚡ 핵심 포인트: “누르는 순간”만 잡아내기

if (lastButton == LOW && currentButton == HIGH)

이 조건은 버튼을 누르고 있는 동안이 아니라,
👉 “누르는 그 순간”만 감지합니다.

이걸 상승 에지(Rising Edge) 검출이라고 합니다.

덕분에 버튼을 길게 누르고 있어도
LED가 여러 번 토글되는 문제가 사라집니다.


🔁 동작 흐름 정리

  1. 버튼 상태를 읽는다
  2. 이전 상태와 다르면 5ms 대기
  3. 다시 읽어서 안정된 값 확보
  4. 이전 상태와 비교하여 변화 순간만 감지
  5. 그 순간에만 LED 토글

🏭 실무 관점 한 스푼

산업용 PLC에서는 이런 문제를
소프트웨어가 아니라 하드웨어 필터로 해결합니다.

입력 모듈에 필터 시간을 설정하면
짧은 노이즈는 아예 무시됩니다.

하지만 아두이노 같은 환경에서는
이런 기능이 기본으로 제공되지 않기 때문에,

👉 디바운싱 구현은 필수 기본기입니다.


🎯 마무리

버튼 하나에도 단순한 ON/OFF 이상의 세계가 숨어 있습니다.

  • 물리적 접점의 진동
  • 전기적 신호의 불안정성
  • 이를 보정하는 소프트웨어 로직

이 세 가지가 맞물려야
비로소 정확한 입력 시스템이 완성됩니다.

이제 여러분의 프로젝트는
훨씬 더 안정적이고, 한 단계 더 엔지니어다운 동작을 하게 될 겁니다.

댓글

이 블로그의 인기 게시물

공압 속도 제어: 미터인 vs 미터아웃

NPN, PNP 트랜지스터 차이점

[PLC] 센서 NPN, PNP 출력 타입별 결선방법 (OMRON E2E-X 시리즈 3선식 배선)

[주식] 한국거래소(KRX) 데이터 API 입문 가이드

[PLC] 서보 모터 브레이크 결선, 왜 릴레이 터미널을 써야 할까?

[투자] ETF 투자 가이드 : 카테고리별 ETF 선택 전략

[PLC] 릴레이

[PLC] PLC 아날로그 입출력 기본

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

[PLC] MELSEC-Q 시리즈 CPU RS-232C 6핀 커넥터 핀맵