반응형
일반적인 Tact Switch의 경우 버튼을 누를면 High-Low가 바로 바뀌는 것이 아니라 값이 흔들리게 됩니다.
위 그림처럼 버튼을 눌렀을때 바로 Low로 떨어지지 않는데, 이런 현상을 체터링이라고 합니다.
이런 현상을 방지해주는 방법으로 2가지 정도가 있는데, 하나는 버튼을 누를때마다 delay를 주는 것입니다.
하지만 delay방식을 사용할 경우 환경에 따라 delay시간을 변경해야 하며,
계속 누르고 있는경우 같은 값이 연속적으로 입력되게 됩니다.
위 방법보다 더 적극적인 체터링 방지방법으로는 버튼을 눌렀다가 떼었을때 입력되게 하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | if(!relay_button){ if(!digitalRead(RELAY_SW)){ relay_button=true; Serial1.println("pressed relay button"); } }else{ if(digitalRead(RELAY_SW)){ relay_button=false; Serial1.println("released relay button"); relay_push=relay_push^1; if(relay_push) digitalWrite(RELAY0,HIGH); else digitalWrite(RELAY0,LOW); } } | cs |
이때에는 2~3가지의 flag 변수를 사용하면 만들 수 있습니다.
Line 1 : relay_button은 flag변수입니다. 초기상태는 false입니다.
Line 2~3 : 버튼을 누르는 순간 이쪽으로 들어오게 되면
Line 3 : relay_button 변수가 true로 변경됩니다.
Line 7~17 : 버튼을 누른 후 relay_button변수가 true로 바뀌어 이쪽으로 들어옵니다.
Line 8~16 : 버튼을 떼는 순간 이리로 들어옵니다.
Line 9 : relay_button변수를 false로 바꾸어 버튼을 떼어도 Line8~17로 못들어 오게 합니다.
Line 11 : relay 상태변수입니다. 상태를 바꿔줍니다.
Line 12~15 : relay 상태에 따라 출력을 바꾸어 줍니다.
반응형
'Study > Arduino' 카테고리의 다른 글
arduino] 오토라이트컨트롤(LED+CDS) (0) | 2016.10.24 |
---|---|
플래쉬 다운로딩이 안될때 (0) | 2016.08.30 |
hex string to byte array (0) | 2016.06.01 |
아두이노 부트로더 구조 (0) | 2015.12.14 |
Intel Edison 초기설정하기 (0) | 2015.11.23 |