[아두이노] [강좌] 7. digitalRead() 함수(1) - 스위치를 이용한 DigitalReadSerial 예제

드디어 Blink 예제에서 벗어나새로운 함수를 살펴보는 시간!! 


brown_and_cony-75


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. 아두이노 보드와 핀 케이블과 브레드 보드는 기본스위치는 아래처럼 생긴 스위치면 된다.

 c8ce0ead25725c7f0cb361ebb4106d1c.png 


내가 사용하는 스위치는 이거사은품으로 받았..(부끄)


c8865074715825c2da6502e2a96ef6ae.jpg


스위치를 뒤집어보자 4개가 마주보고 붙어있다마주보고 있는 두 핀은 연결되어 있고나란히 있는 두 핀은 떨어져 있다다음 사진을 보자.

c4f75eb54a10db8bf07f8bba2282baa2.jpg

 bbfd9f581ac9e9d649f8ca5054f48fc0.jpg 

 

다시 한번마주보고 있는 두 핀은 연결되어 있고나란히 있는 두 핀은 떨어져 있다떨어져 있는 두 핀은 스위치가 눌리면 연결되는 구조이다즉 스위치가 눌리면 4개의 핀이 모두 연결됨.

  

그럼 아두이노 보드와 스위치를 연결해 보자다음 그림과 사진을 보면서 꽂으면 쉬울거에요


7b3a7dd390d4f75f5b623765e5bb8e40.png

 567fe1ec50595d1acb43b155db34820b.jpg


fed1c991052351c58147b3de7e964ea8.jpg

266fa78b5d7404fe3bf3c1db294a1703.jpg

94fe12071a9925a3eb8d4bf3e7143df8.jpg


선 두 개만 연결하면 되는 아주 쉬운 예제이다.


그리고 “DigitalReadSerial” 예제를 열어보자스케치 툴에서 파일→예제→01.BasicsDigitalReadSerial” 선택.

 

주석문을 제외하고 실제 소스만 옮기면 다음과 같다



 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’가 들어오겠지?

 



업로드하자.

 

 

그리고 업로드가 완료되면 스케치 툴의 도구→시리얼 모니터를 선택하거나아래 그림에 표시된 돋보기 모양의 아이콘을 클릭하자.


f6ed538a1c88c704a6e77d903a9a514f.png


그러면 다음과 같은 창이 열릴 것이다


a2f1c82f2873da289c4642eec8f2d36f.png


빨간색 네모 박스에 유의! “9600 보드 레이트를 선택해야 제대로 값이 출력된다요건 setup() 함수에서 “Serial.begin(9600);”이라는 구문을 사용했기 때문인데매개 변수로 넣어준 값과 같아야 한다.


그리고는 ‘0’ 또는 ‘1’의 값이 다음과 같이 출력될 것이다.


c16941a2afbe0bb69cabaaa950b26269.png


여기서 ‘0’은 ‘LOW’를 뜻하고, ‘1’은 ‘HIGH’를 뜻한다그리고 스위치를 눌러보자누른 상태에서 값이 ‘0’인지 ‘1’인지 확인하고손을 뗀 후에 값이 ‘0’인지 ‘1’인지 확인하자.

 

스위치를 눌렀을 때 ‘1’이 나오고손을 뗐을 때 ‘0’이 잘 나오는가?

 


 moon_and_james-33


 

안 나올 것이다.  

 

스위치를 누르면 ‘1’이 잘 나오겠지만손을 떼면 ‘0’이 나오거나 ‘1’이 나오거나 제 맘대로 나올 것이다.

 


!??

 

스위치를 안 누른 상태에서는 두 핀이 연결되지 않아 전기가 입력되지 않기 때문에 당연히 ‘0’이 나와야 하는데왜 ‘1’이 나왔다, ‘0’이 나왔다 하는 걸까?



 

 

이유는 다음 강좌에서. To be continue…brown_and_cony-79

 

 

 

 

이런 거 해보고 싶었ㅋㅋㅋㅋㅋㅋㅋㅋ던게 아니고사실은 글이 너무 길어져서;; 잠시 쉬었다가 다음 강좌에서 만나요ㅜㅜ 안녕.

 



brown_and_cony-77(어차피 난 계속 써야하지만…) 

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
118 아두이노 ESP32 Analog Inputs (ADC) +4 icon 양재동메이커 02-12 11,284
117 아두이노 TIP : Serial의 Port가 Open 시점 확인 icon 양재동메이커 01-21 8,628
116 아두이노 ESP32 Boot Mode icon 양재동메이커 12-28 8,071
115 아두이노 아두이노 에러 리스트(Arduino Error list) icon 양재동메이커 11-24 12,626
114 아두이노 ESP32 main.cpp +1 icon 양재동메이커 11-19 8,721
113 아두이노 ESP32 EEPROM 와 IR Remote icon 양재동메이커 08-06 8,855
112 아두이노 Learn ESP32 icon 양재동메이커 06-25 8,367
111 라즈베리 파이 라즈베리 파이 (Raspberry Pi) 기초 icon 양재동메이커 06-19 9,258
110 라즈베리 파이 (동영상 강의) 라즈베리 파이 강좌 Link icon 양재동메이커 06-17 8,872
109 STM32 / MBED [MED] Switch debouncing icon HellMaker 12-30 10,413
108 기타 [타이젠] 아두이노의 16x2 LCD Display라이브러리 LiquidCrystal_I2C의 타이젠 포팅 icon 양재동메이커 09-15 10,306
107 기타 [타이젠] GPIO의 디지탈 출력과 입력 인터럽트의 C++ Class 제작 icon 양재동메이커 09-12 9,861
106 마이크로비트 서보 모터 icon HellMaker 09-03 9,436
105 마이크로비트 아날로그 온도센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 10,264
104 마이크로비트 터치센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 9,557
103 마이크로비트 디지털 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 8,658
102 마이크로비트 리니어 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 8,276
101 마이크로비트 불꽃 감지 센서 (마이크로 비트 센서 활용) icon HellMaker 08-26 8,561
100 마이크로비트 로터리 엔코더 (마이크로 비트 센서 활용) icon HellMaker 08-25 8,687
99 마이크로비트 2컬러 LED(3mm) (센서 활용) icon HellMaker 08-22 8,702