본문 바로가기

강좌/아두이노 강좌

아두이노 기초강좌 12. 푸쉬버튼과 PWM으로 LED밝기 제어해보기

이번 강좌에서는 푸쉬버튼을 누르면 LED의 밝기가 서서히 밝아지다가, 다시 누르면 LED의 밝기가 서서히 어두워지고, 또 다시 누르면 서서히 밝아지는 회로를 만들어 보려고 합니다. 

이번엔 한 번 그림을 보기 전에, 지금까지 배워온 것들을 떠올리면서, 직접 회로를 구성해보시겠어요?

푸쉬 버튼은 7번 핀으로 입력 받고, LED는 9번 핀으로 출력 할 예정입니다. 앞의 강좌들을 다시 찾아보면서 참고해도 괜찮습니다. 

회로도는 글 맨 아래에 넣어두겠습니다! 


회로도를 구성해보셨다면, 코드를 한 번 넣어볼까요?


const int LED = 9;

const int BUTTON = 7;


int i = 128;

int val = 0;

int old_val = 0;


int state = 0;



void setup()

{

  pinMode(LED,OUTPUT);

  pinMode(BUTTON,INPUT);

}


void loop()

{1

  val = digitalRead(BUTTON);

  

  if( (val == HIGH) && (old_val ==LOW) )

  {

    state = 1 - state;

    delay(10);

  }

  if( (val==HIGH) && (old_val==HIGH) && (state==1) )

  {

    i++;

    delay(10);


    if(i>255)

    {

      i = 255;

    }

  }

  if( (val == HIGH) && (old_val==HIGH) && (state==0) )

  {

    i--;

    delay(10);


    if(i<0)

    {

      i = 0;

    }

  }

  old_val = val;

  analogWrite(LED,i);


위의 코드를 아두이노 보드에 업로드 해준 뒤 버튼을 누르면 밝기가 변하는 것을 확인하실 수 있을 겁니다.  아래 동영상처럼요!



비록 코드는 지금까지 사용한 코드들 중 가장 길지만, 사실 하나하나 뜯어 보면 이미 다 공부했던 코드들입니다. 

여기 쓰인 코드들은 이미 공부했던 것들이니 이번엔 코드가 진행되는 순서를 뜯어보면서, 왜 이런 코드를 사용했나 알아볼까요?



코드를 위 그림과 같이 구역을 나눠보겠습니다.

코드는 다음과 같은 순서로 진행합니다.


01. 1번 구역을 실행합니다. LED, BUTTON 등의 값을 정해주고, i, val, old_val, state 값을 초기화해줍니다.

02. 2번 구역을 실행합니다. LED를 출력으로, BUTTON을 입력으로 설정합니다.

03. 3번 구역을 실행합니다. val에 BUTTON에서 읽어온 값을 저장해줍니다. BUTTON이 눌려있는 동안에 HIGH 값이, 눌리지 않을 때는 LOW 값이 저장됩니다. 

04. 버튼을 누르기 전에는 7번 구역이 실행됩니다. old_val에 val 값이 저장되는데, 아직 버튼을 눌러주지 않았으니, old_val과 val 모두 LOW가 저장되어 있습니다. LED핀을 처음 i 값으로 설정해줬던 128의 밝기로 켜줍니다.

05. 버튼을 처음 누르는 순간 4번 구역이 한 번 실행됩니다. state에는 1- state의 값인 1을 저장해주고 0.01초간 대기합니다.

06. 버튼을 처음 누르는 그 순간 4번 구역이 실행된 뒤, 5번 구역 6번 구역은 조건을 충족시키지 못하기 때문에 조건문 안의 코드들이 실행되지 않습니다. old_val에는 val 값인 HIGH가 저장되고, LED는 처음 i에 저장해놨던 128이라는 값으로 켜지게 됩니다. 

07. 버튼을 계속 누르고 있게 되면, val과 old_val 모두 HIGH, state는1입니다. 따라서 5번 구역의 조건을 충족하기 때문에 5번 구역을 실행합니다. i를 1만큼 증가시키고 0.1초간 대기합니다.

08. 7번 구역이 실행됩니다. old_val에는 여전히 HIGH값이 저장되고, LED핀은 129의 밝기로 켜집니다.

09. 버튼을 계속 누르고 있다면, 다시 5번 구역이 실행된 뒤 7번 구역을 실행하는 것을 반복하게 됩니다. 버튼을 계속 누르고 있어서 i 값이 analogWrite의 최대값인 255를 넘어간다면 i에는 계속 255가 저장됩니다.

10. 버튼에서 손을 떼면 밝기의 증가가 멈추고, 7번 구역이 실행될 때 old_val에는 LOW값이 저장되게 됩니다.

11. 다시 한 번 버튼을 누르게 되면 4번 구역이 실행됩니다. state에는 1-state의 값인 0이 새롭게 저장된 뒤 0.01초간 대기합니다.

12. 7번 구역을 실행합니다. old_val에는 HIGH가 저장됩니다.

13. 버튼을 계속 누르고 있으면, val과 old_val 모두 HIGH 값이 저장되어 있고, state에는 0이 저장되어 있기 때문에 6번 구역의 조건을 충족시킵니다. 따라서 6번 구역을 실행하게 됩니다. i의 값을 1만큼 감소시키고 0.1초간 대기합니다. 버튼을 누르고 있는 동안에는 7번 구역을 실행한 뒤 6번 구역을 실행하는 것을 반복합니다. LED의 밝기가 서서히 줄어들게 되고 버튼을 오래 눌러서 i의 값이 analogWrite의 최소값인 0보다 작아지면, i에는 0이 계속 저장됩니다.

14. 버튼에서 손을 떼면 7번 구역이 실행되면서, old_val에는 LOW가 저장되게 됩니다.

15. 다시 LED를 누르게 되면 5번부터 9번까지의 과정을 다시 실행하게 됩니다. 마찬가지로 손을 다시 떼면 10번이 다시 실행됩니다.

16. 다시 한 번 더 LED를 누르게 되면 11번부터 13번까지의 과정을 실행하게 됩니다. 손을 다시 한 번 더 떼면 14번이 실행됩니다.


여기까지 오시느라 고생많으셨습니다!

다음 강좌에서는 센서를 이용해 LED의 밝기를 조정해보도록 하려고 합니다. 그 과정까지 진행하게 된다면, 이제 본격적인 인터렉티브 미디어 아트 작업을 시작할 준비가 어느 정도 되었다고 할 수도 있겠네요. 멀지 않았습니다! 힘내세요!


위의 회로도는 다음과 같이 구성하면 됩니다!

LED는 긴 다리가 오른쪽입니다.


이전 강좌 보기

2018/12/24 - [강좌/아두이노 강좌] - 아두이노 기초강좌 01. 아두이노란?

2018/12/24 - [강좌/아두이노 강좌] - 아두이노 기초강좌 02. 아두이노 설치하기

2018/12/24 - [강좌/아두이노 강좌] - 아두이노 기초강좌 03. 전기 이해하기, 전압, 전류, 저항

2018/12/24 - [강좌/아두이노 강좌] - 아두이노 기초강좌 04. 무작정 LED 켜보기

2018/12/24 - [강좌/아두이노 강좌] - 아두이노 기초강좌 05. 무작정 LED 켜보기 코드 분석

2018/12/29 - [강좌/아두이노 강좌] - 아두이노 기초강좌 06. 브레드보드, 빵판에 대하여

2018/12/29 - [강좌/아두이노 강좌] - 아두이노 기초강좌 07. 무작정 푸시 버튼으로 LED 제어하기

2018/12/29 - [강좌/아두이노 강좌] - 아두이노 기초강좌 08. 무작정 푸시 버튼으로 LED 제어하기 분석

2018/12/29 - [강좌/아두이노 강좌] - 아두이노 기초강좌 09. 푸쉬버튼과 저항을 써야하는 이유

2018/12/31 - [강좌/아두이노 강좌] - 아두이노 기초강좌 10. 무작정 on/off LED 만들기와 분석

2019/01/01 - [강좌/아두이노 강좌] - 아두이노 기초강좌 11. PWM을 이용해 LED밝기 제어해보기