아두이노 코딩 : HC-06을 사용하여 스마트폰으로 RGB LED 제어 (Color LED Controller 앱 사용)
Lucy Archive
Lucy 2023
2020. 10. 20. 00:20

Arduino HC-06 RGB LEDArduino HC-06 RGB LED

Arduino Uno : (블루투스) 스마트폰으로 RGB LED 제어

이번 포스트는

HC-06 블루투스 모듈을 사용하여 스마트폰으로 RGB LED를 제어하는 예제

를 소개합니다. HC-06 및 RGB LED 사용과 관련된 기초적인 내용은 하단의 관련 포스트를 참고해주세요.

Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • Bluetooth Module HC-06 x 1EA
  • RGB LED Module x 1EA (공통 캐소드 타입)
  • JumperWires

※ 스마트폰에서 RGB LED 제어하기 위해 Color LED Controller 앱을 사용하였습니다. 


회로도 및 연결

블루투스 모듈 HC-06을 사용하여 스마트폰으로 아두이노에 연결된 RGB LED 의 색을 제어하기 위해 아래와 같이 회로를 연결하였습니다.

Arduino Uno, HC-06, RGB LED 연결Arduino Uno, HC-06, RGB LED 연결

Color LED Controller APP

본 포스트는 안드로이드 스마트폰 기준으로 설명하겠습니다. 

Color LED Controller 앱 설치

안드로이드 스마트폰에서 선택한 RGB 색상 데이터를 블루투스로 보내기 위해 Color LED Controller 앱을 사용하였습니다. 구글 플레이 스토어에서 Color LED Controller 어플을 설치해서 테스트를 진행 할 수 있습니다. 해당 어플을 설치 후 실행한 다음 자신의 HC06을 연결하여 사용 할 수 있습니다.

Color LED Controller 앱 설치Color LED Controller 앱 설치


Color LED Controller 전송 데이터 포멧

이 앱에서 동그란 부분 또는 각종 슬라이드 바를 변경하면 실시간으로 변경되는 RGB 좌표를 블루투스로 송신합니다. 스마트폰에서 송신되는 데이터 포멧을 하기 위해 아래의 코드를 아두이노에 업로드 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <SoftwareSerial.h>
 
#define HC06RX A0 //HC-06의 TX Pin - Arduino Uno의 RX
#define HC06TX A1 //HC-06의 RX Pin - Arduino Uno의 TX
SoftwareSerial HC06(HC06RX,HC06TX);
 
void setup(){
    Serial.begin(9600);
    HC06.begin(9600);
}
 
void loop(){
    if(HC06.available()){
        Serial.write(HC06.read());
    }
    if(Serial.available()){
        HC06.write(Serial.read());
    }
cs

위 코드를 업로드 후 Color LED Controller 앱에서 HC06을 연결하고 컬러를 선택 또는 슬라이드 바를 변경 하면 아래와 같은 형식의 데이터가 아두이노로 송신됩니다. 데이터의 포멧이 괄호 열고 닫고 하는 등의 일반적으로 생각되는 데이터 포멧은 아니지만, 결론적으로 HC-06을 통하여 아두이노에 수신된 데이터는 RGB값이 콤마(,)로 구분되고 최종적으로 ')'기호로 RGB 데이터 전송을 마무리 합니다.

ex) 255,173,89) -> Red Value,Green Value,Blue Value)

예제 : 스마트폰으로 RGB LED 제어하기

코드

아래의 코드는 Color LED Controller 앱에서 수신된 메세지에서 Red, Green, Blue 값을 추출하여 RGB LED를 제어하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <SoftwareSerial.h>
 
#define HC06RX A0 //HC-06의 TX Pin - Arduino Uno의 RX
#define HC06TX A1 //HC-06의 RX Pin - Arduino Uno의 TX
 
#define RED 11 // RGB LED Module의 RED 핀
#define GREEN 10 // RGB LED Module의 GREEN 핀
#define BLUE 9 // RGB LED Module의 BLUE 핀
 
SoftwareSerial HC06(HC06RX,HC06TX);
String recvString;
int flag;
 
void setup(){
    Serial.begin(9600);
    HC06.begin(9600);
 
    Serial.println("HC06 Setting...");
    delay(1000);
    
    HC06.print("AT");
    Serial.println("Arduino -> HC06 : AT");
    hc06ResponseCheck();
 
    HC06.print("AT+PIN0000");
    Serial.println("Arduino -> HC06 : AT+PIN0000");
    hc06ResponseCheck();
 
    HC06.print("AT+NAMEmyHC06");
    Serial.println("Arduino -> HC06 : AT+NAMEmyHC06");
    hc06ResponseCheck();
 
    HC06.print("AT+BAUD4");
    Serial.println("Arduino -> HC06 : AT+BAUD4");
    hc06ResponseCheck();
}
 
void loop(){
    char temp;
    String tempString;
 
    // HC-06으로 부터 RGB 좌표가 수신되어, 시리얼 수신 버퍼에 저장되어 있는 경우 실행되는 if문
    if(HC06.available()){
        temp = HC06.read();
        recvString += temp;
        if(temp == ')'){
            flag = 1;
            tempString = recvString;
            recvString = "";
        }
    }
 
    // RGB 좌표 전체가 수신 완료 될 때 실행되는 if문
    if(flag == 1){
        flag = 0;
 
        int first = tempString.indexOf(".");
        int second = tempString.indexOf(".",first + 1);
        int third = tempString.indexOf(")");
 
        int red, green, blue;
        red = (tempString.substring(0, first)).toInt();
        green = (tempString.substring(first+1, second)).toInt();
        blue = (tempString.substring(second+1, third)).toInt();
 
        setRGBLED(red, green, blue);
    }
}
 
void hc06ResponseCheck(){
    boolean flag = false;
    delay(1000);
    if(HC06.available()){
        flag = true;
    }
    if(flag){
        Serial.print("HC06 -> Arduino : ");
        while(HC06.available()){
            Serial.write(HC06.read()); 
        }
        Serial.println("");
    }
    else{
        Serial.print("HC06 -> Arduino : ");
        Serial.println("No Response!");
    }
}
 
void setRGBLED(int red, int green, int blue){ // gRgbColorIndex 배열의 인덱스 값으로 RGB LED 색 표시
    analogWrite(RED, red);
    analogWrite(GREEN, green);
    analogWrite(BLUE, blue);
}
cs

코드 설명

선언부

  • 1줄 : Software Serial을 사용하기 위한 라이브러리 참조
  • 3~4줄 : HC-06 시리얼 포트 연결 핀 번호 설정
  • 6~8줄 : RGB LED 연결 핀 번호 설정
  • 10줄 : SoftwareSerial 객체 생성
  • 11줄 : 블루투스로 수신되어 SoftwareSerial 포트로 수신되는 메세지를 저장하는 문자열 recvString 변수 선언
  • 12줄 : SoftwareSerial 수신 버퍼에서 RGB Data 전체 메세지를 읽어 오는 경우 활성화 하는 flag

void setup()

  • 시리얼 포트 초기화
  • HC-06 설정 초기화
    • PIN 번호 0000으로 설정
    • 장치 이름을 myHC06으로 설정
    • 시리얼 통신 속도를 9600으로 설정

void Loop()

  • 43~51줄 : SoftwareSerial 수신 버퍼에서 RGB 데이터 읽기가 완료되면 flag 를 활성화, 읽어온 데이터를 임시 저장소 tempString 변수에 저장 후 recvString 을 초기화
  • 54~67줄 : RGB 데이터로부터 Red, Green, Blue 값을 추출 후 RGB LED를 제어하는 setRGBLED 호출

void hc06ResponseCheck()

  • HC06을 설정하기 위해 AT명령을 보낸 후 정상적으로 응답이 오는지 확인

void RGBLED()

  • RGB LED를 제어하는 함수


실행 결과

위 코드를 아두이노에 업로드 후, 스마트폰에서 HC-06을 연결하여 RGB LED의 색상을 원하는대로 제어 할 수 있습니다. HC-06의 상태 LED는 페어링 모드에서 깜빡이고, 스마트폰이 연결되면 점등 된 상태를 유지 합니다. 


마무리

이번 포스트에서는 HC-06을 사용하여 스마트폰으로 RGB LED를 제어하는 방법에 대해 소개하였습니다. 본 포스트에서 사용한 SoftwareSerial 사용 방법, RGB LED제어, HC-06 사용 방법은 하단의 관련 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.😄

관련포스트

👉 아두이노 RGB LED 관련글 목록 보기

👉 아두이노 블루투스 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기