이전 글 에서 택트 스위치(Tact Switch)를 이용해서 LED를 제어해 보았습니다. 스위치의 버튼을 누르고 있을때만 LED가 켜지고 스위치에서 손을 떼면 LED가 꺼졌었는데요. 이번에는 한 번 누르면 LED가 켜지는 것이 유지되고 다시 누르면 LED가 꺼진 상태로 유지되도록 해 보겠습니다. 그런데 이번에는 Debounce 라는 개념이 들어갑니다. 스위치는 기계적인 장치이므로 켜거나 끌 때 기계적인 진동이나 접촉에 의해서 스위치가 짧은 시간에 여러번 ON/OFF 된 것으로 인식할 수 있습니다. 이런 현상을 Bounce 현상이라고 하고 이것을 없애 주는것이 Debounce 입니다. 즉, 소프트웨어 적으로 Debounce 시간을 설정해두고 이 시간보다 짧은 시간에 일어나는 스위치의 ON/OFF 는 무시하도록 하는 것입니다.
택트 스위치 (Tact Switch) -출처 http://grobotronics.com
택트 스위치 입니다. 위와 같은 것을 사용 합니다. 스위치를 누를 시 초록색 또는 주황색 다리(Lead)끼리 대각선으로 전류가 흐르게 됩니다. 이 글에서는 한 쌍의 Lead 만 사용하면 되므로 쓰지 않는 쌍은 브레드보드에 꼽지 않았습니다.
■ 연결
위와 같이 연결했습니다. 실제로는 LED 저항은 연결하지 않았지만 LED 보호를 위해서 220Ω 정도의 저항을 연결해 주는 것이 좋습니다.
스위치에도 풀업 10kΩ 정도의 저항을 달아주어야 하나 아두이노의 자체 풀업저장 기능을 사용하면 되므로 소프트웨어적으로 해결 했습니다. (스위치 핀모드 설정에 INPUT_PULLUP 사용)
■ 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | int sw = 10; // 스위치(SW) 핀 설정 int led = 6; // LED 핀 설정 int state = LOW; // LED 상태 int reading; // SW 상태 int previous = LOW; // SW 이전 상태 long time = 0; // LED가 ON/OFF 토글된 마지막 시간 long debounce = 100; // Debounce 타임 설정 void setup() { pinMode(sw, INPUT_PULLUP); // SW 를 설정, 아두이노 풀업저항 사용 pinMode(led, OUTPUT); // LED 설정 } void loop() { reading = digitalRead(sw); // SW 상태 읽음 //SW 가 눌려졌고 스위치 토글 눌림 경과시간이 Debounce 시간보다 크면 실행 if (reading == HIGH && previous == LOW && millis() - time > debounce) { if (state == HIGH) // LED 가 HIGH 면 LOW 로 바꿔준다. state = LOW; else // LED 가 LOW 면 HIGH 로 바꿔준다. state = HIGH; time = millis(); } digitalWrite(led, state); previous = reading; } | cs |
소스를 보면 위에서 설명한 Debounce 시간을 100ms 로 주었습니다. 자신의 사정에 따라 적정 시간을 부여하면 되겠습니다. 그 이외 자세한 설명은 주석에 써 놓았습니다.
동작하는 모습 입니다. 잘 됩니다. Debounce 설정 때문에 100ms 보다 빠르게 스위치를 ON/OFF 하면 LED에는 변화가 없을 것입니다. 손가락 빠른 분들은 도전해 보세요.
'아두이노' 카테고리의 다른 글
[아두이노] 말하는 아두이노 만들기 - Talkie Library 이용 (17) | 2016.06.15 |
---|---|
[아두이노] 스위치와 릴레이로 가정용 전원 220V 제어하기 (14) | 2016.06.14 |
[아두이노] 택트 스위치(Tact Switch)를 사용하여 LED 제어하기 (0) | 2016.06.14 |
[아두이노] 스크래치(Scratch)로 아두이노를 제어해보자 - ScratchX (4) | 2016.06.09 |
[아두이노] 리눅스 민트에서 아두이노 IDE 폰트를 보기 좋게 하기 (0) | 2016.06.09 |