아두이노 스위치 누를 때마다 LED ON OFF - adu-ino seuwichi nuleul ttaemada LED ON OFF

Button을 이용해서 LED 제어하기!!!!!!!!!!!!!!!!!

저번에는 그냥 LED를 깜빡거리기를 해봤으니 이번에는 버튼을 누를때마다 LED가 켜지고 꺼지게 해보았다.

까짓거 개껌이지 하고 시작했다가

다 안다고 무시했던 풀업과 풀다운 때문에 시간을 엄청 날렸다ㅠㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그러므로, 먼저 풀업과 풀다운에 대한 간단한 설명!

풀업과 풀다운은 일단 반대되는 개념이다.

예를 들어 어떤 스위치를 생각한다면,

풀업 에서는

스위치를 눌렀을때, 스위치가 ON 되었을때 스위치에 0V가 걸리고 0의 값을 가지게 되고

스위치를 누르지 않았을때, 스위치가 OFF 되어있을때 스위치에 5V가 걸리게 되어 1의 값을 가지게 된다.

풀다운 에서는

스위치를 눌렀을때, 스위치가 ON 되었을때 스위치는 1의 값을 가지게 되고

스위치를 누르지 않았을때, 스위치가 OFF 되어 있을 때 스위치에 5V가 걸리게 되어 1의 값을 가지게 된다.

표로 나타내면,

풀업(PULL UP)

풀다운(PULL DOWN)

 ON

 LOW(0)

 ON

 HIGH(1)

 OFF

 HIGH(1)

 OFF

 LOW(0)

과 같이 나타낼 수 있다.

두 방법의 차이는 저항을 어디 연결하느냐에 따라 달라지는데,

그것도 모르고 왜 LED가 반대로 동작하냐며 코드를 몇번이나 뜯어보고 삽질한건 비밀....ㅎㅎㅎ

풀업은 저항을 Vcc, 입력전압에 연결해줌으로써 설정이 가능하고,

풀다운은 저항을 GND에 연결해줌으로써 설정이 가능하다.

저항을 Vcc에 달아놓고 왜 스위치를 눌렀는데 HIGH가 안되냐며....ㅎㅎ

고민했던 내 아까운 시간.....ㅎㅎㅎ

이렇게 배우는거지 뭐 하하

일단 회로 구성은,

1. 풀업

아두이노 스위치 누를 때마다 LED ON OFF - adu-ino seuwichi nuleul ttaemada LED ON OFF

와 같이, 저항을 스위치와 Vcc사이에 연결해주면 된다. 

이렇게 연결이 되면 버튼을 눌렀을때 DigitalRead 함수는 LOW를 리턴한다.

그 외에 지난번에도 말했다시피 LED에도 항상 저항을 달아주어야 하고, (+) (-) 구분을 잘 해 주어야 한다.

그리고 LED는 12번, 버튼은 6번 핀에 연결하였다.

2. 풀다운

나머지 모든것은 풀업과 똑같이 연결하되, 저항을 GND와 버튼 사이에 연결해준다.

이렇게 연결이 되면 DigitalRead 함수는 버튼을 눌렀을때 HIGH 값을 리턴한다.

코드는 아래와 같이 작성할 수 있다.

회로 연결과 마찬가지로 버튼은 6번, LED는 12번으로 선언해주었다.

풀업저항을 연결했으므로 Button이 눌려졌음을 체크하기 위해서 DigitalWrite(BUTTON) == LOW가 되어야 한다.

만약 풀다운저항으로 회로를 연결했다면 LOW를 HIGH로 바꾸어주면 된다.

버튼을 한번 누를때마다 켜고 꺼지고를 반복하기 위해 flag 변수를 두어서 구현했다.

버튼이 눌려졌을때 flag가 0이면 LED를 켜고 flag를 1로 만들고,

버튼이 눌려졌을때 flag가 1이면 LED를 끄고 flag를 0으로 만들었다.

마지막 while문은 버튼이 눌러져있는동안 LED가 깜빡깜빡거리지 않도록 while문안에 묶여있게 하려고 넣은것이다.

사실 while문을 안넣어도 동작은 동일하다.

그러나 while문이 없을때 버튼을 꾹 누르고 있으면 미세하게 LED가 깜빡거리는 것이 보인다.

그러니까...뭐 만약 프로젝트를 하게 된다면 넣어주는게 좋지않을까.

넣어주지 않는다면 값이 과도하게 많이 들어가게 될 수도 있다.

위의 코드와 회로로 실행 시켜보았을때,

위와 같이 동작한다.

그리고 여기서 또 문제점 발견...^^

버튼의 입력을 한번으로 받지 못한다.

물론 한번의 입력으로 받는 경우도 있지만, 

버튼을 분명 한번 놓았다 뗐는데도 두번의 입력을 받는 거 같았다.

내 손이 정확하게 한번만 누르지 못하는게 문제일수도 있지만.. 

아무리 그래도 2번 이상으로 입력받는 빈도가 높아서... 

이건 작년 하드웨어 실험할때도 끊임없이 나를 괴롭혔던건데...아직도 괴롭...ㅎ...

혹시 방법이 없을까

아니면 아예 버튼을 다른걸 써야하나 하는 생각이다.

작년에도 몰랐는데 아직도 모르네...^^

풀업 풀다운만 아니었으면 오늘 블루투스 모듈까지 손대고 싶었는데 실패했다..ㅠㅠ

뭔가 살때는 이것저것 많이산줄 알았는데 막상 뭐 해볼려니 버튼이랑 LED가 다다.

스텝모터나 DC모터나...아니면 둘다나... 구매해볼 생각이다

다음번엔 모터가 있다면 모터를 좀 가지고 놀던지,

아니면 블루투스모듈을 사용해서 안드로이드 앱으로 LED 켜고 끄기 를 해봐야지

아무래도 블루투스는 앱도 만들어야하니까....모터를 얼른 구매해야겠다

컴공 공작소

코딩

버튼 사용하여 LED 불켜기 - 누를때마다 상태 변환

쑤깨비 2018. 7. 24. 23:17

처음 아두이노를 혼자 공부할때 버튼 사용하는 것이 정말 쉬운 일 이라고 생각했다.

막상 제대로 버튼 사용하는 방법을 배워보니 생각보다 손이 많이 가는 녀석이었다.

뭘 이리 신경써야 하는 일이 많은지....

버튼을 연결만 한다고 해서 되는 것이 아니라 디바운싱도 해줘야 하고 풀다운이나 풀업 방식으로 저항도 연결해 줘야 하고 버튼 상태를 변경하기 위해서는 적당한 변수도 사용할 수 있어야 했다.

아두이노에서 버튼은 빼놓을 수 없는 부품 중 하나이니 제대로 익히고 넘어가야 한다.

디바운싱이나 풀다운/풀업 저항에 대해서는 다음 기회에 정리해 보기로 하고 오늘은 버튼을 사용할 수 있다는 전제하에 버튼을 이용한 LED 불 켜기를 해보려고 한다.

먼저 이번에 해보려고 하는 내용에 대한 동영상이다.

버튼을 한번 누르면 불이 켜지고 또 다시 누르면 불이 꺼지는 내용이다.

먼저 회로도....

회로도는 그렇게 어렵지 않다.

LED 에는 220Ω 을 (-)쪽에 연결하면 되고, 버튼은 10㏀을 연결했고 풀다운 방식으로 연결했다.

버튼의 입력값은 2번 핀으로 연결했고 LED 입력은 13번 핀에 연결해줬다.

아래에 스케치 코드에 보면 2번과 13번 핀을 전역변수 값을 사용해서 지정해 줬다.

전역변수를 사용하면 이후 코드 수정할 때 유리하므로 될수 있으면 변수를 사용해서 지정해 주는 방법으로 연습하면 좋을 것 같다.

그리고 스케치로 작성된 코드

아두이노 스위치 누를 때마다 LED ON OFF - adu-ino seuwichi nuleul ttaemada LED ON OFF

코드에 대한 주석을 달았다.

코드 중에서 if 를 사용한 토글(상태변환)을 눈여겨 봐야 한다.

변수를 사용해서 버튼이 눌렸다는 상태를 판단한 후 LED에 불을 켜고 다시 버튼이 눌렸다는 상태를 판단하고 LED에 불을 끈다.

이해를 돕기 위해 변수값을 표로 정리해 봤다.

current_Button 변수는 현재 버튼이 눌린 상태인지 아닌지를 판단하는 변수이다.

last_Button 변수는 현재 버튼의 값(current_Button)을 받는 변수이다.

처음 버튼이 눌렸을때는 1값을 갖게 되는데 loop() 함수를 돌면서 값이 '0'으로 바뀌게 된다.

Led_On 변수는 버튼이 눌릴때마다 이전과 반대의 상태를 갖게 되는 변수이다. '0'과 '1'값을 번갈아 가며 갖는다.

그렇게 어려운 코딩은 아닌데 변수의 상태 변화를 이해해야 완성할 수 있다.

버튼 상태를 토글 시키려고 할때는 위의 if 구문을 사용하면 된다.

조금 더 정확한 동작을 시키려면 디바운싱 처리도 해줘야 하는데 그건 다음에 정리하는 걸로... ^^;;;;