[아두이노] 디바운스 (Debounce) - delay() VS millis()

아래는 푸시버튼 풀다운 저항으로 구성된 회로입니다.

기계식 스위치를 누르는 경우 바로 ON 상태가 되는 것이 아닙니다. 아래와 같이 ON 상태가 유지되기 전에 OFF-ON 상태를 반복하는 구간이 있는데 이를 바운스(bounce) 현상이라고 합니다. 그리고 바운스 현상을 처리하는 방법을 디바운스(debounce)라 합니다.


아두이노에서 디바운스 처리를 위한 대표적인 두가지 방법이 delay() 함수를 이용한 방법과 millis() 함수를 이용한 방법입니다.

아래는 delay() 함수를 이용한 코드의 캡처입니다.


위 코드는 상태변화가 감지되면 센서 안정화를 기다리기 위해 50ms 딜레이 시키는 형태입니다. delay() 함수는 아두이노가 코드를 실행하는 것 자체를 중단시키기 때문에 delay() 함수가 끝날때까지 다른 코드 또한 실행되지 않는다는 단점이 있습니다.

아래는 millis() 함수를 이용한 코드의 캡처입니다.


위 코드는 버튼의 이전상태와 현재상태를 비교하여 동일상태로 일정시간 유지되었다면 버튼의 상태에 반영하는 형태입니다. millis()는 delay() 함수를 이용한 처리와는 다르게 아두이노의 코드 실행을 멈추게 하지 않습니다.

millis() 함수는 아두이노가 실행된 이후 흐른 시간을 ms 단위로 반환해 줍니다. 반환되는 데이터형이 2Byte이므로, 50일 정도가 지나면 오버플로우 현상으로 인해 0으로 초기화되는 문제가 있습니다. 이는 16bit AVR 프로세서를 사용하는 아두이노 우노에 한정된 문제로 보이며, 32bit 프로세서를 사용하는 아두이노에서는 문제가 되지 않을 듯 합니다.


댓글

이 블로그의 인기 게시물

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

NPN, PNP 트랜지스터 차이점

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

3선 결선식 센서의 타입 PNP, NPN

커패시터에 저장된 에너지 계산

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

제너 다이오드에 저항을 연결하는 이유

3상 모터 전력에서 전류 계산하기 (How to Convert Three-Phase Power to Amps)

[공압밸브] 5포트 2웨이 & 4포트 2웨이, 단동 VS 복동 차이점

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