[아두이노] [강좌] 7. digitalRead() 함수(1) - 스위치를 이용한 DigitalReadSerial 예제
드디어 Blink 예제에서 벗어나, 새로운 함수를 살펴보는 시간!!
digitalRead() 함수는 INPUT 모드에서 사용되는 함수다. pinMode() 함수를 설명할 때 INPUT 모드에 대해서 이미 설명했으니 INPUT 모드에 대해서는 앞 강좌를 참고하도록 하고.
핀의 모드를 INPUT, 입력으로 설정하고, 실제로 핀의 상태를 읽어오기 위한 함수가 바로 digitalRead() 함수. 함수의 구조는 다음과 같다.
int digitalRead(pin)
매개 변수
pin : 입력 값을 읽어 올 핀의 번호. digitalWrite() 함수의 경우와 마찬가지로 아두이노 보드에서 사용할 수 있는 모든 핀 번호가 올 수 있다. |
반환 값
HIGH/LOW : 반환 값의 타입은 int지만 HIGH 또는 LOW 둘 중에 하나만 반환된다. (HIGH랑 LOW가 사실은 int 타입이기 때문에) |
digitalWrite() 함수에 대해서 잘 알고 있다면 digitalRead() 함수 역시 어렵지 않을 것이다. 매개 변수로 핀 번호를 주고, 그 핀으로 들어오는 값이 HIGH인지 LOW인지를 판단해서 반환하는 것이 digitalRead() 함수의 기능이다.
함수 자체는 어렵지 않으므로 바로 실습에 들어가보도록 하자.
준비물은 스위치와 LED. 아두이노 보드와 핀 케이블과 브레드 보드는 기본. 스위치는 아래처럼 생긴 스위치면 된다.
내가 사용하는 스위치는 이거. 사은품으로 받았..(부끄)
스위치를 뒤집어보자. 핀 4개가 마주보고 붙어있다. 마주보고 있는 두 핀은 연결되어 있고, 나란히 있는 두 핀은 떨어져 있다. 음? 다음 사진을 보자.
다시 한번. 마주보고 있는 두 핀은 연결되어 있고, 나란히 있는 두 핀은 떨어져 있다. 떨어져 있는 두 핀은 스위치가 눌리면 연결되는 구조이다. 즉 스위치가 눌리면 4개의 핀이 모두 연결됨.
그럼 아두이노 보드와 스위치를 연결해 보자. 다음 그림과 사진을 보면서 꽂으면 쉬울거에요.
음. 선 두 개만 연결하면 되는 아주 쉬운 예제이다.
그리고 “DigitalReadSerial” 예제를 열어보자. 스케치 툴에서 “파일→예제→01.Basics→DigitalReadSerial” 선택.
주석문을 제외하고 실제 소스만 옮기면 다음과 같다.
DigitalReadSerial.ino |
int pushButton = 2;
void setup() { Serial.begin(9600); pinMode(pushButton, INPUT); }
void loop() { int buttonState = digitalRead(pushButton);
Serial.println(buttonState); delay(1);
} |
어, 그런데 예제 소스에는 2번 핀으로 연결하라고 되어 있네. 아무 생각 없이 12번 핀에 연결해서 사진 찍었..;; 다시 사진 찍기 귀찮으니 소스를 수정하자. pushButton 변수의 초기값을 12로 수정!
DigitalReadSerial2.ino |
int pushButton = 12;
void setup() { Serial.begin(9600); pinMode(pushButton, INPUT); }
void loop() { int buttonState = digitalRead(pushButton);
Serial.println(buttonState); delay(500); } |
빨간 색으로 표시한 변수 선언 부분을 12로 바꾸고, loop() 함수 마지막의 delay() 시간을 500밀리초로 바꿨다. 1밀리초마다 한 번씩 읽으면 값이 눈 깜짝할 새에 지나갈 것 같아서.
새로운 “Serial”이라는 단어와 함수들이 생겼다. 지금 예제에서 “Serial”은 스위치의 상태를 사용자의 PC 모니터에 보여주기 위해 사용되었다. 자세한 내용은 다음에 “Serial” 강좌에서 따로 설명하도록 하고, 지금은 그냥 출력문이라는 정도만 알아두고 넘어가자.
코드를 우선 살펴보면, int 타입의 ‘pushButton’이라는 이름의 변수가 선언되고, 12라는 값으로 초기화 되었다. 스위치의 핀 번호를 저장하는 변수이다.
setup() 함수에서는 “Serial.begin(9600)”이라는 함수가 호출되었고, pinMode() 함수로 pushButton 핀을 ‘입력’ 모드로 설정하였다.
loop() 함수에서는 int 타입의 ‘buttonState’라는 변수를 지역 변수로 선언하고, 그 값으로 digitalRead() 함수의 반환 값을 저장한다. digitalRead() 함수의 매개 변수로 pushButton에 저장된 스위치 핀 번호를 넣어주었으므로, 12번 핀으로 입력되는 값이 buttonState 변수에 저장될 것이다. 저장되는 값은 “HIGH”나 “LOW” 둘 중에 하나겠지.
그리고는 “Serial.println()”이라는 함수가 호출되었는데, 이 함수가 바로 PC 모니터에 값을 보여주기 위한 함수이다. 그리고는 delay() 함수를 이용해 1밀리초만큼 딜레이를 준다. 그리고는 반복.
이제 소스 내용을 이해하는 건 어렵지 않죠, 여러분? (Serial에 관한 내용은 제외하고.)
업로드 하기 전에 생각해보자. 스위치의 두 핀은 서로 떨어져있고, 스위치가 눌리면 연결된다. 한 핀은 3.3V에 연결되어 있고, 한 핀은 아두이노의 12번 핀에 연결되어 값을 입력 받고 있다. 그럼 스위치가 눌려지면 어떤 값이 들어올까?
‘HIGH’가 들어오겠지. 스위치의 두 핀이 연결되어 3.3V가 들어올 테니까. 그럼 눌려지지 않은 상태에서는 어떤 값이 들어올까? 연결이 끊어져서 전기가 들어오지 않을 테니 ‘LOW’가 들어오겠지?
자, 업로드하자.
그리고 업로드가 완료되면 스케치 툴의 “도구→시리얼 모니터”를 선택하거나, 아래 그림에 표시된 돋보기 모양의 아이콘을 클릭하자.
그러면 다음과 같은 창이 열릴 것이다.
빨간색 네모 박스에 유의! “9600 보드 레이트”를 선택해야 제대로 값이 출력된다. 요건 setup() 함수에서 “Serial.begin(9600);”이라는 구문을 사용했기 때문인데, 매개 변수로 넣어준 값과 같아야 한다.
그리고는 ‘0’ 또는 ‘1’의 값이 다음과 같이 출력될 것이다.
여기서 ‘0’은 ‘LOW’를 뜻하고, ‘1’은 ‘HIGH’를 뜻한다. 그리고 스위치를 눌러보자. 누른 상태에서 값이 ‘0’인지 ‘1’인지 확인하고, 손을 뗀 후에 값이 ‘0’인지 ‘1’인지 확인하자.
스위치를 눌렀을 때 ‘1’이 나오고, 손을 뗐을 때 ‘0’이 잘 나오는가?
안 나올 것이다.
스위치를 누르면 ‘1’이 잘 나오겠지만, 손을 떼면 ‘0’이 나오거나 ‘1’이 나오거나 제 맘대로 나올 것이다.
왜!??
스위치를 안 누른 상태에서는 두 핀이 연결되지 않아 전기가 입력되지 않기 때문에 당연히 ‘0’이 나와야 하는데, 왜 ‘1’이 나왔다, ‘0’이 나왔다 하는 걸까?
이런 거 해보고 싶었ㅋㅋㅋㅋㅋㅋㅋㅋ던게 아니고, 사실은 글이 너무 길어져서;; 잠시 쉬었다가 다음 강좌에서 만나요. ㅜㅜ 안녕.