Mechanic 공방

11. 아두이노 LED 실습 (4) with Button module 본문

아두이노 (Arduino)

11. 아두이노 LED 실습 (4) with Button module

H-Mechanic 2020. 7. 19. 10:59
728x90
반응형

이번 포스팅에서는 버튼 모듈을 사용하여 원하는 특정 LED를 on/off 할 수 있는 예제를 실습해보고자 한다.

 

먼저, 키트에 포함된 버튼 모듈에 대하여 알아보도록 하겠다.

 

[Button module]

본 실습에서 사용할 스위치의 경우 클릭 방식의 스위치로, 누르는 순간에만 접지가 이루어지며 연결되는 구조이다.

 

내부 회로는 아래와 같이 이루어져 있다.

위와 같이 가운데 버튼을 누르게 되면 회로도가 연결이 되며 작동하는 구조이다.

 

따라서 회로도 구성 시, 동일한 라인에 전원부와 GND 부를 동시에 연결하면 쇼트가 일어날 수 있다.

 

그렇기 때문에 반드시 서로 다른 라인에 각각 연결해야 한다.

 

예를 들어, 1번에 전원부를 연결했다면, GND는 반드시 2번 또는 4번에 연결해야 한다.

 

[회로 구성]

 

[코드 설명]

#define Button1 2
#define Button2 3
#define Button3 4

#define LED1 9
#define LED2 10
#define LED3 11

void setup() {
    pinMode(Button1, INPUT_PULLUP);
    pinMode(Button2, INPUT_PULLUP);
    pinMode(Button3, INPUT_PULLUP);
    
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
}

void loop() {
    int ButtonInput1 = digitalRead(Button1);
    int ButtonInput2 = digitalRead(Button2);
    int ButtonInput3 = digitalRead(Button3);
    int ButtonInput[3] = {ButtonInput1, ButtonInput2, ButtonInput3};

    if (ButtonInput[0]==LOW) {
        if (ButtonInput[1]==LOW) {
            if (ButtonInput[2]==LOW) {
                digitalWrite(LED1,HIGH);
                digitalWrite(LED2,HIGH);
                digitalWrite(LED3,HIGH);
            } else {
                digitalWrite(LED1,HIGH);
                digitalWrite(LED2,HIGH);
                digitalWrite(LED3,LOW);
            }
        } else {
            if (ButtonInput[2]==LOW) {
                digitalWrite(LED1,HIGH);
                digitalWrite(LED2,LOW);
                digitalWrite(LED3,HIGH);
            } else {
                digitalWrite(LED1,HIGH);
                digitalWrite(LED2,LOW);
                digitalWrite(LED3,LOW);
            }
        }
    } else {
        if (ButtonInput[1]==LOW) {
            if (ButtonInput[2]==LOW) {
                digitalWrite(LED1,LOW);
                digitalWrite(LED2,HIGH);
                digitalWrite(LED3,HIGH);
            } else {
                digitalWrite(LED1,LOW);
                digitalWrite(LED2,HIGH);
                digitalWrite(LED3,LOW);
            }
        } else {
            if (ButtonInput[2]==LOW) {
                digitalWrite(LED1,LOW);
                digitalWrite(LED2,LOW);
                digitalWrite(LED3,HIGH);
            } else {
                digitalWrite(LED1,LOW);
                digitalWrite(LED2,LOW);
                digitalWrite(LED3,LOW);
            }
        }
    }
}

위 코드에서 switch의 경우, INPUT 신호를 받도록 설정하였다.

 

다만 단순히 INPUT이 아닌 INPUT_PULLUP이라는 신호를 받도록 설정하였는데, 이는 소프트웨어적으로 해당 핀에 PULLUP 저항 역할을 부여한 것이다.

 

풀업 저항이란,디지털 신호를 사용하는 스위치 구동 시 플로팅 현상을 방지하기 위해 전원 부쪽에 저항을 추가한 것을 의미하며, 자세한 내용은 다음 포스팅에서 다루도록 하겠다.

 

digitalRead() 함수는 지정된 핀으로부터 디지털 신호를 받을 수 있게 해주는 함수이며, HIGH 또는 LOW의 신호를 받을 수 있다.

 

위 코드에서는 각 스위치로부터 디지털 신호를 받도록 되어있다.

 

이번 코드에서는 특이하게 배열을 사용하여 코드를 작성해보았다.

 

사용한 스위치 3개로부터 입력되는 값을 ‘ButtonInput’이라는 이름의 배열에 각각 요소로 넣었다.

 

실제 LED를 켜지게 하는 조건문에서는 이 배열의 인덱스를 사용하여 on/off LED의 번호를 지정하였다.

 

C 언어에서의 배열의 인덱스는 0부터 시작한다는 것을 알 수 있다.

 

본 실습에서는 스위치를 누르게 되면 LOW 값이 인식되기 때문에 각 LED가 눌렸을 경우를 스위치로부터 들어오는 디지털 신호가 LOW 일 때로 조건문을 작성하였다.

 

각 경우에 맞게 LED가 켜지도록 코드를 구성하였다.

 

사용된 스위치의 경우, 눌렀을 경우에만 회로가 형성되는 방식이기 때문에, 버튼을 눌렀을 때만 LED가 켜지고 떼는 순간 바로 꺼지는 방식으로 동작한다.

 

[동작 영상]

 

728x90
반응형