brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Aug 07. 2020

9. LED와 스위치 : 앞 선 내용 복습

6개의 LED를 모두 켜고 끄는 앞 선 예제에 스위치를 달아 새로운 기능을 만드는 예제를 통해 지금까지 배운 코딩과 아두이노 사용에 대해 복습해 보자.


이번 예제는 2번 핀에 연결된 스위치를 누르면 누를 때마다 8번부터 연결된 LED가 하나씩 추가로 켜지는 예제이다.

앞서 만든 회로에 스위치를 아래와 같이 추가해 보자.

스위치의 핀 하나는 디지털 2번 핀에 접속하고 다른 하나는 GND에 접속한다. 

이미 브레드보드 상단에 GND가 연결되어 있으므로 이 곳에 연결하면 된다.


2번 핀에 연결된 스위치가 눌려졌는지 아닌지 확인하는 방법은 이미 앞서 설명을 했으므로 전체 코드를 만들어 보자면 아래와 같다.


int count=0;                                     ----- 몇 번 눌렸는지 저장할 변수

void setup()

{

     for (int i=8; i <=13; i++)   

                  pinMode(i, OUTPUT);   ----- 8번 ~ 13번 핀을 출력 지정

     pinMode(2, INPUT_PULLUP);  ----- 2번 핀을 입력 핀으로

}


void loop()

{

  if (digitalRead(2)==LOW){

      if (count>5){                               ----- 6번 눌렸으면 count를 리셋

         count=0;

         for (int i=8; i <=13; i++) 

                    digitalWrite(i, LOW);   ----- 모든 불 끄기

      }

      else {

         digitalWrite(8+count, HIGH);    ----- 6번 이하로 눌렸으면 해당 불 켜기

         count++;                                        ----- 눌린 숫자 1 증가

      }

      delay(500);                                       ----- 계속 눌려지는 것을 0.5초 동안 방지

   }

}


다른 프로그램과 달리 void setup 앞에 count라는 정수형 변수 하나를 선언하고 그 값을 0으로 지정하였다.


이 변수는 스위치가 몇 번 눌렸는지를 저장할 변수이고, 6번 눌릴 때까지는 그 값을 유지하다가 6개의 LED가 모두 켜지고 나면 0으로 리셋하여 다음 신호를 기다리게 된다.



현재 만들어진 회로에서는 8번부터 13번까지의 핀을 사용하여 이를 코딩 내부에 직접 핀 번호로 입력했지만,

만일 이 핀이 변경된다거나 연결된 LED가 6개가 아니고 5개라던가 하는 변화가 있을 경우 코드의 내부를 모두 고쳐야 하는 어려움이 생길 수 있다.

이를 방지하기 위하여 #define이라는 명령어를 사용한다.


특정한 이름에 필요한 숫자 또는 데이터를 미리 지정해 두고 사용하는 것이다.

#define으로 정의된 문자는 변수와는 다르게 코드 내에서 변경이 불가능하다.

이를 이용하여 위의 코드를 수정하면 다음과 같이 된다.


#define pinSW 2   // pinSW에 2 지정 - 스위치

#define pinF 8      // pinF에 8 지정 - 시작 핀

#define pinL 13    // pinL에 13 지정 - 끝 핀


int count=0;

void setup()

{

  for (int i=pinF; i <=pinL; i++) pinMode(i, OUTPUT);

  pinMode(pinSW, INPUT_PULLUP);

}

void loop()

{

  if (digitalRead(pinSW)==LOW){

    if (count>(pinL-pinF)){

       count=0;

       for (int i=pinF; i <=pinL; i++) digitalWrite(i, LOW);

    }

    else {

       digitalWrite(pinF+count, HIGH);

       count++;

    }

    delay(500);

  }

}


앞선 코드와 동일한 결과를 보여주는 코드이다.


위의 보기처럼 #define에 정의된 이름에 해당 숫자가 대치된다고 생각하면 된다.

만일 시작 LED 핀이 8번이 아니고 4번이라면 #define pinF 4라고 정의하면 된다.

스위치가 연결된 핀이 2번이 아니라 3번이라면 #define pinSW 3이라고 정의하면 된다.



위의 그림은 버튼스위치를 5회 눌렀을 때 5개의 LED가 켜진 모습이다.

자주 사용하는 명령어이니 차후에 또 설명할 기회를 갖도록 하겠다.


이제 아주 기본적인 이론 공부는 마쳤다. 속성 코스이니까 ^^



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari