반응형

이전 글 에서 택트 스위치(Tact Switch)를 이용해서 LED를 제어해 보았습니다. 스위치의 버튼을 누르고 있을때만 LED가 켜지고 스위치에서 손을 떼면 LED가 꺼졌었는데요. 이번에는 한 번 누르면 LED가 켜지는 것이 유지되고 다시 누르면 LED가 꺼진 상태로 유지되도록 해 보겠습니다. 그런데 이번에는 Debounce 라는 개념이 들어갑니다. 스위치는 기계적인 장치이므로 켜거나 끌 때 기계적인 진동이나 접촉에 의해서 스위치가 짧은 시간에 여러번 ON/OFF 된 것으로 인식할 수 있습니다. 이런 현상을 Bounce 현상이라고 하고 이것을 없애 주는것이 Debounce 입니다. 즉, 소프트웨어 적으로 Debounce 시간을 설정해두고 이 시간보다 짧은 시간에 일어나는 스위치의 ON/OFF 는 무시하도록 하는 것입니다.


택트 스위치 (Tact Switch) -출처 http://grobotronics.com


택트 스위치 입니다. 위와 같은 것을 사용 합니다. 스위치를 누를 시 초록색 또는 주황색 다리(Lead)끼리 대각선으로 전류가 흐르게 됩니다. 이 글에서는 한 쌍의 Lead 만 사용하면 되므로 쓰지 않는 쌍은 브레드보드에 꼽지 않았습니다.


■ 연결


_2xSwitch_2xLED_ON_OFF_2.fzz


위와 같이 연결했습니다. 실제로는 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에는 변화가 없을 것입니다. 손가락 빠른 분들은 도전해 보세요.



반응형

+ Recent posts