본문 바로가기

메이커 이야기/아두이노

[UART통신] 아두이노간 채팅하기 예제

반응형

UART통신을 학습하기 위해서 아두이노를 활용해서 UART통신에 대해서 한번 알아보도록 하겠습니다.

 

UART통신은 RX,TX핀을 활용해서 데이터를 주고 받는 1:1 통신 방식입니다. 


UART 통신을 하기 위해서 고려해야 되는 것은 크게 3가지 입니다.

1. 아두이노 RX, TX핀은 교차로 연결

2. 아두이노 BaudRate 값 통일

3. GND 연결

 

위 세 가지만 주의해주면, 통신은 아주 간단합니다!!

 

그럼 예제를 통해서 한번 살펴 보아요~! 

 

아두이노 시리얼 통신 예제 1

아두이노의 0,1번 핀이 기본적으로 RX,TX 핀입니다.

그래서 이를 활용하면, 아두이노간에도 통신을 할 수 있습니다.

 

 

 

아두이노 0번 핀과 1번 핀의 RX,TX를 사용해서 두 개의 아두이노 간 통신을 해봅니다.

//보내는 사람
void setup(){
	Serial.begin(9600);
}
 
void loop(){
  if (Serial.available(){
  	Serial.write(Serial.read());
  }
}
//받는사람

void setup(){
  Serial.begin(9600);
}
void loop(){ 
  Serial.write("hello");
  Serial.println("");
}

 

 

아두이노 시리얼 통신 예제 2

0,1번 핀은 컴퓨터와 USB Serial 통신을 하는 핀이기 때문에,  업로드를 하게 되면 에러가 발생하게 됩니다.

그래서, 위에 예제를 사용하게 될 때에는 반드시, 업로드 이후에 선을 연결해야 가능하죠~!

 

그렇게 하지 않기 위해서는 아두이노의 SoftSerial 모듈을 활용해서 진행하면 됩니다.

 

 

 

위의 회로를 기반으로 시리얼 통신으로 LED를 켜보는 예제를 만들어 보았습니다.

 

 

 

#include <SoftwareSerial.h>
#include <string.h>
 
#define ledPIN 3
 
SoftwareSerial mySerial(10, 11);
 
void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(ledPIN,OUTPUT);
}
 
String stringON = "on";
String stringOFF = "off";

void loop(){ 
  if (mySerial.available()){
    String inString = mySerial.readStringUntil("\n");
    bool ref_on = inString.equals(stringON);
    bool ref_off = inString.equals(stringOFF);
    if(ref_on == 1){
      digitalWrite(ledPIN,HIGH);
      Serial.println(inString);
    }
    else if(ref_off == 1){
      digitalWrite(ledPIN,LOW);
      Serial.println(inString);
    }
    else{
      Serial.println(inString); 
    }
  }
  if (Serial.available()) {
  	mySerial.write(Serial.read());
  }
}

 

 

아두이노 시리얼 통신 예제 3

이번에는, 최종적으로 아두이노를 활용하여 채팅을 하는 프로그램을 만들어 보도록 하겠습니다.

LCD와 아두이노를 준비해주시고, 이를 활용해서 아두이노에서 받은 데이터를 LCD에 띄워 주도록 하겠습니다.

 

 

 

#include <SoftwareSerial.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <string.h>
 
SoftwareSerial mySerial(10,11);   //TX RX
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
void setup()
{
  lcd.begin();
  lcd.backlight();
  mySerial.begin(9600);
  Serial.begin(9600);
}
 
char lcdChar = "";
String lcdString = "";
 
String msg1 = "";
 
 
void loop()
{
  if (mySerial.available()) {
    delay(100);
    lcd.clear();
    lcd.print(msg1);
    while (mySerial.available()) {
      lcdChar = (char)mySerial.read();//문자 하나씩 읽고
      lcdString += lcdChar;              //읽은 문자를 하나씩 더해 문자열을 만듬
      lcd.setCursor(0,1);
    }
    lcd.print(lcdString);
    msg1 = lcdString;
    lcdString = "";
  }

  if(Serial.available()){
    Serial.write(Serial.read());
  }
}

 

반응형