[아두이노] 스위치 노이즈, 디바운싱(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가 여러 번 토글되는 문제가 사라집니다.
🔁 동작 흐름 정리
- 버튼 상태를 읽는다
- 이전 상태와 다르면 5ms 대기
- 다시 읽어서 안정된 값 확보
- 이전 상태와 비교하여 변화 순간만 감지
- 그 순간에만 LED 토글
🏭 실무 관점 한 스푼
산업용 PLC에서는 이런 문제를
소프트웨어가 아니라 하드웨어 필터로 해결합니다.
입력 모듈에 필터 시간을 설정하면
짧은 노이즈는 아예 무시됩니다.
하지만 아두이노 같은 환경에서는
이런 기능이 기본으로 제공되지 않기 때문에,
👉 디바운싱 구현은 필수 기본기입니다.
🎯 마무리
버튼 하나에도 단순한 ON/OFF 이상의 세계가 숨어 있습니다.
- 물리적 접점의 진동
- 전기적 신호의 불안정성
- 이를 보정하는 소프트웨어 로직
이 세 가지가 맞물려야
비로소 정확한 입력 시스템이 완성됩니다.
이제 여러분의 프로젝트는
훨씬 더 안정적이고, 한 단계 더 엔지니어다운 동작을 하게 될 겁니다.
댓글
댓글 쓰기