아두이노 시리얼 모니터 입출력 - adu-ino silieol moniteo ibchullyeog

♣ 아두이노 시리얼 모니터 활용하기

시리얼 모니터를 활용하면 아두이노와 대화할 수 있어요. 스케치에 아두이노가 글자를 입력받도록 설정하고, 입력된 글자에 따라 아두이노가 대답하게 프로그래밍하는거죠~ 간단한 예제를 살펴볼까요?

1. 스케치를 실행합니다.

2. void setup() {  아래의 주석 //~~를 범위지정하고 지우세요.

3. void setup() { 에는 프로그램을 실행하기 위한 준비과정을 기록해요.
시리얼 모니터와 통신하기 위한 명령어를 입력해 주어야 한답니다.
Serial.begin(9600); 을 입력해요. 9600은 보드 레이트입니다. 아두이노와 통신할 때의 속도를 의미하는데요, 시리얼 모니터에서 설정한 값과 동일한 값을 기록해야 합니다.

 스케치에서 를 클릭하면 시리얼 모니터를 실행할 수 있습니다.


아래와 같이 시리얼 모니터가 나타났을 때 오른쪽 하단에서 보드레이트를 선택해요.
프로그램에 입력한 값과 같은 값을 선택해주세요!

 프로그래밍을 할 때는 Tab을 눌러서 적절한 들여쓰기를 하게되는데 매번 Tab을 누르지 않아도 된답니다. 아래와 같이 입력할 때는 편하게 첫 칸에 Serial.begin(9600);을 입력하구요,


프로그램 완료 후
Ctrl + T를 눌러요. 자동 포맷 기능이예요~! 아래와 같이 자동으로 들여쓰기를 실행해서 보기 좋게 정리해줍니다.

 대신 프로그래밍할 때 대문자와 소문자는 정확하게 구별해서 입력해야 해요. 대소문자를 잘못 입력해서 오류가 발생하는 경우가 많아요!

4. 이제 void loop() { 부분의 주석 //~~을 지워주세요. 이 곳에 명령어를 입력할 거예요.

5. 아래와 같이 명령어를 입력합니다.
char c = Serial.read(); 는 c 라는 변수를 정의하는 거예요. Serial.read() 즉, 시리얼 모니터로부터 전송받아 읽은 값을 c라는 방에 저장한다는 뜻이랍니다.
c 앞에
char 라고 정의되었으므로 c는 character, 즉 문자를 저장하는 방이 됩니다. 


if(c == 'r'){

    Serial.println("rosassam");

    }

c의 값이 만약 r 이라면 rosassam을 인쇄하라는 명령입니다. 그 외의 값이라면 아무 값도 표시하지 않겠지요. 

 if를 이용하면 다양한 일들이 가능해지는데요, 예를 들어 숫자를 입력하면 2진수로 변환한다거나, 알파벳을 입력하면 모스부호로 변경해준다던가.. 하는 일들이 가능해져요~ 다만 그 값들을 모두 입력하려면 시간이 조금 걸리겠지요? 자~ 그럼 위 프로그램을 실행해볼까요?

전송 버튼을 클릭해서 프로그램 내용을 아두이노 보드로 전송 해 주세요.

 를 클릭해서 시리얼 모니터를 실행합니다.

아두이노의 동작을 확인해볼까요?
  

 아래는 10진 숫자를 입력하면 이를 2진수로 변환하는 프로그램입니다.

 2진수 변환기능을 실행해볼게요~!

어때요~? 지금 표시되는 내용은 모두 줄바꿈을 하고 있지요? 바로 Serial.println 명령 때문이예요. 만약 Serial.print 라고만 입력한다면 줄바꿈 하지 않고 계속해서 옆으로 표시된답니다.

 알파벳을 넣으면 모스부호로 변환해주는 프로그램도 만들 수 있어요~ 위 프로그램에서 숫자 자리에 알파벳을 입력하고 프린트 부분에 모스부호를 기록하면 되겠지요. 딸아이가 만들어보고 싶다고 해서 만들어놓은 프로그램인데요~ 한 번 실행해볼까요? rosa를 입력해서 모스부호로 변환해볼게요. 모스부호가 연속으로 표시되도록 일부러 명령에 Serial.print 라고 입력했답니다. 그래서 줄바꿈 되지 않아요. 

자~ 이렇게 시리얼 모니터를 살펴보았어요. 시리얼 모니터를 잘만 이용하면 시리 못지 않은 비서가 탄생할 수 있을 것 같지 않나요~? 프로그래밍의 세계는 무궁무진해요~ 여러분이 어떻게 만드느냐에 따라 컴퓨터, 아두이노는 놀라운 기능을 발휘하지요~ 처음부터 모든 문장을 이해하고 만들어내기는 좀 어렵지만, 일단 책의 내용을 따라서 입력했다가 하나하나 조금씩 바꿔가면서 나만의 문장을 만들어내고 이를 통해 이해하는 방법을 이용해보세요~ 아두이노가 정말 재미있게 느껴질거예요~

아두이노 데이터 속도 설정하기:  문자 출력 선언(시리얼 모니터 사용 선언)

void setup(){
	Serial.begin(speed);
    // speed: 데이터의 속도값
    //일반적으로 아두이노 우노는 9600,아두이노 메가는 115200을 사용한다고 생각하면 된다.
}

void loop(){

}

문자/ 문자열 출력함수

아두이노에는 문자를 출력하는 다양한 종류의 함수들이 있다. 함수는 다음과 같다.

Serial.print(value);
// value값을 시리얼 모니터에 출력한다. 
//엔터는 함께 출력되지 않으므로 전에 출력된 끝 문자와 붙어서 출력된다.

Serial.println(value);
// value값을 시리얼 모니터에 출력한다. 가장 자주 사용되는 출력함수이다.
//엔터가 함께 출력되므로 시인성이 좋다.

Serial.write(value);
//value을 출력하는 함수. 하지만 value값에는 byte형과 문자열만 가질 수 있다.
//Serial.print 함수는 숫자를 넣으면 문자로 변환(아스키코드)되는 반면 write가 있으면 그대로 출력된다.

print의 형식

Serial.println(value);
//value의 형식에 따라 출력형식이 달라진다.
/* 예시
Serial.println(1234); != Serial.println("1234");
	 숫자(10진수)                  문자열
*/

Serial.println(value,format);
//format에 따라 여러 형식의 숫자을 출력할 수 있다.
/*
format의 종류

DEC: 10진수
HEX: 16진수
BIN: 2진수
*/

문자열 입력 확인하기

Serial.read();
//시리얼 모니터의 입력값을 확인하는 코드
//직관적으로 모니터의 값을 읽어온다(read)라고 생각하면 자연스럽게 이해가 될 것이다.
//일반적으로 입력된 값을 변수에 저장하여 사용한다.

String str = Serial.readString(); 
//시리얼 모니터의 문자열을 읽음.

char input = Serial.read();
//input이라는 변수에 시리얼 모니터에 입력된 값을 저장한다.

Serial.available();
//시리얼 모니터가 유효한지 확인하는 코드.
//시리얼 모니터에 문자가 적혔다면 참(0이 아닌 수), 아니면 거짓(0)를 반환한다.
//이 함수를 이용해 시리얼 모니터에 입력한(혹은 외부로부터 입력받은) 문자열을 출력할 수 있다.

시리얼 모니터에 값 입력하고 출력하기

void setup(){
	Serial.begin(speed);
    // speed: 데이터의 속도값
    //일반적으로 아두이노 우노는 9600,아두이노 메가는 115200을 사용한다고 생각하면 된다.
}

void loop(){
	if(Serial.available()){
    	//실행하고 싶은 코드
        char input = Serial.read(); // 입력받은 값을 input에 저장한다.
        //이때 저장한 값은 1바이트 (문자)임에 주의한다.
        Serial.println(input);//문자를 출력한다.
    }
}

이때 주의할 점은 입력한 값 중 문자 하나를 char형 변수에 저장한다는 점이다. 문자를 엔터가 끝날 때까지 받는게 아니라 엔터가 입력될 때 까지 출력을 한다는 점에 인간이 생각하는 프로그램 과정과 다르다는 것을 주의한다.

예를 들어 hello을 입력한다면 hello가 다 입력될때까지(엔터가 입력될 때 까지)기다린 후 출력하는 것이 아니라 h, e, l, l, o가 각각 출력되고 마지막에 엔터가 입력되어 출력됨을 주의하자. 이는 항상 헷갈리는 부분으로 나중에 반복문과 조건문에서 빈번하게 오류를 발생시키는 원인이된다.

시리얼 모니터 입력값 읽기(1): 문자열을 숫자로 변환

Serial.parseInt(data); //대문자 I(아이)임에 유의하자.
//시리얼 통신으로 입력되는 data가 문자열을 경우 그 값을 int형의 숫자로 변환하는 함수이다.
//문자열은 long형으로 변환되며, 예를 들어 문자열 "1000"시 숫자 1000으로 변환한다.
//입력값이 숫자형태인 문자열이 아닌 경우 0을 반환한다.

Serial.parseFloat(data);
//시리얼 통신으로 입력되는 data가 문자열을 경우 그 값을 float형의 숫자로 변환하는 함수이다.

시리얼 모니터 입력값 읽기(2): 정해진 바이트 만큼 입력받기

byte Serial.readByte(buffer,length);
//지정된 길이(개수)만큼 데이터를 읽어와 버퍼에 저장한다. 
//저장된 개수만큼 수신되지 않은 경우 읽어온 데이터만 저장 후 남은 데이터는 반환한다.
//구분문자와 같이 특정 값을 길이로 구분할 때 사용한다.

byte Serial.readByteUntil(point,buffer,length);
//지정한 문자가 수신될 때 까지 데이터를 읽어온다.

//point: 지정한 문자
//buffer: 데이터를 저장할 char형 배열 이름
//length: 읽어 올 데이터의 길이

기타 입출력함수

Serial.setTimeout(time);
//Serial.readByte()함수나 Serial.readByteUntil()함수에 사용되는 타임아웃 시간을 설정하는 함수.
//time: 지정한 길이만큼 데이터가 수신 중 수신이 원활하지 않은 경우 기다리는 시간. 기본 1초 설정(밀리초 단위).

Serial.end();
//시리얼 통신을 끊고 사용되던 핀(0,1)을 일반 디지털 핀으로 전환한다. 재사용시 Serial.begin()함수를 이용한다.

Serial.Event(); //시리얼 통신을 통해 데이터 수신시 자동으로 호출된다.

/*예시
Serial.Event(){
	//시리얼 통신 중 사용하고자 하는 코드 입력
}
*/​

Tip!

아두이노 시리얼 모니터를 키는 단축어는 다음과 같다.

Window : Shift + control + M

Mac: Shift + command + M