메이커 Maker

블루투스 자기 부상 Mood Light

지구빵집 2022. 1. 11. 09:22
반응형

 

 

자기야 선물~! 블루투스 자기 부상 Mood Light  

 

작품 개요 

 

기존의 일반적인 무드등과는 차별화되는 자기부상 무드등으로서 블루투스를 이용하여 스마트폰으로 여러 조작이 가능한 MZ세대를 타겟으로 한 신개념 디자인 인테리어 무드등  

 

기능 

 

▶ 기존의 일반적인 무드등과는 다르게 블루투스를 이용해서 스마트폰과 연결해 고정된 색상 프리셋을 저장해놓고 사용할 수 있는 무드등.

▶기존의 일반적인 무드등과는 차별화되는 자기부상 무드등으로서 블루투스를 이용하여 스마트폰으로 여러 조작이 가능 MZ세대를 타겟으로 한 신개념 디자인 인테리어 무드등

▶ 무드등에 있는 버튼을 통해 설정해놓은 색상대로 켤 수 있다.

▶ 자기부상 모듈을 이용하여 둥둥 떠있는 무드등이라는 점에서 차별화된다.  

 

자기부상 원리

 

자기부상은 다른 지지대 없이 자기장의 인력과 반발만으로 물체를 띄우는 방법이다. 중력을 상쇄하는 방향으로 전자기력을 사용함으로써 물체가 중력으로부터 자유롭게 되고 떠오를 수 있게 된다. 자기부상열차, 비접촉식 용융 등에 이용된다  

 

기대효과와 개선점  

 

▶ 기대효과

- 자기부상모듈을 통해 떠있는 무드등을 사용하여 인테리어 아이템으로 많은 활용 가능

- 일반적인 무드등과 다르게 블루투스를 통하여 스마트폰으로 색상 선택이 가능하여 편리하게 이용 가능

 

▶ 아쉬운 점, 개선점

- 자기부상모듈이 배송되지 않아 자기부상을 구현하지 못한 점

- LED의 밝기가 어두움 -> LED를 여러 개 사용, 밝기가 아주 강한 LED 사용하여 개선 가능

- 앱에서 사용자가 원하는 LED 프리셋 값을 받아오려 했으나 구현 실패하여 고정된 값으로 설 정  

 

LED 컨트롤러 제어 코드

 

 

 

// LED 컨트롤러 (가변저항, 버튼) 파트
#include <SoftwareSerial.h>

int R_value, G_value, B_value; // 가변저항 쓸 때 RGB 값 받는 변수
const int poten1 = A1; // 가변저항
const int poten2 = A2;
const int bluetoothRX = 7; // 블루투스
const int bluetoothTX = 8;
const int preset_mode_check = 12; // 프리셋 기능 on off 알려주는 용도의 녹색LED
const int preset_onoff = 6; // 프리셋 기능 on off 버튼
int for_6_flag = 0;
boolean for_6_toggle_state = 0;
const int button[4] = {2,3,4,5}; // 프리셋 버튼 4개
int flag[4] = {0, 0, 0, 0};
boolean toggle_state[4] = {0, 0, 0, 0};
int pre_button=0; // 가장 최근에 누른 프리셋 버튼의 번호 저장하는 변수 (프리셋 제어에 쓰임)
SoftwareSerial ble ( bluetoothTX, bluetoothRX );
void setup() {
for (int i=0; i<=3; i++) {
pinMode(button[i], INPUT);
pinMode(preset_onoff, OUTPUT);
pinMode(preset_mode_check, OUTPUT);
Serial.begin(9600);
ble.begin (9600)
void loop() {
preset_onoff_button_toggle();
preset_check();
if(for_6_toggle_state == 0) { // 프리셋 온오프 버튼이 on일때 => 프리셋기능 모드
button_toggle();
if (pre_button == 2) {
preset_button1();
delay(70);
}
else if (pre_button == 3) {
preset_button2();
delay(70);
}
else if (pre_button == 4) {
preset_button3();
delay(70);
}
else if (pre_button == 5) {
preset_button4();
delay(70);
}
}

else if (for_6_toggle_state == 1) { // 프리셋 기능 off면 => 가변저항 모드
int val1 = analogRead(poten1);
int val2 = analogRead(poten2);
int LED_bright = map(val1, 0, 1023, 0, 255);
int LED_color = map(val2, 0, 1023, 0, 255);
LED_setting(LED_bright, LED_color);
}
}
void preset_check() { // 프리셋 기능 사용중이면 녹색LED on 아니면 off
if(for_6_toggle_state == 0) {
digitalWrite(preset_mode_check, HIGH);
}
else {
digitalWrite(preset_mode_check, LOW);
}
}
void preset_onoff_button_toggle() { // 프리셋 온오프 버튼 토글 제어 함수
if(digitalRead(preset_onoff) == 0) {
if(for_6_flag == 0) {
for_6_flag = 1;
for_6_toggle_state = !for_6_toggle_state;
}
}
else {
if(for_6_flag == 1){
for_6_flag = 0;
}
}
}
void preset_button1() { // 1번 버튼 프리셋
ble.write(1);
Serial.println("preset 1 transmission completed");
}
void preset_button2() { // 2번 버튼 프리셋
ble.write(2);
Serial.println("preset 2 transmission completed");
}
void preset_button3() { // 3번 버튼 프리셋
ble.write(3);
Serial.println("preset 3 transmission completed");
}
void preset_button4() { // 4번 버튼 프리셋
ble.write(4);
Serial.println("preset 4 transmission completed");
}
void button_toggle() { // 1~4번 프리셋 버튼들 토글 시키는 함수
for (int i=0; i<=3; i++) {
if(digitalRead(button[i]) == 0) {
if(flag[i] == 0) {
flag[i] = 1;
toggle_state[i] = !toggle_state[i];
if(toggle_state[i] == 0){
pre_button = button[i];
}
}
}
else {
if(flag[i] == 1){
flag[i] = 0;
if(toggle_state[i] == 0){
pre_button = button[i];
}
}
}
}
}
void potentiometer_Red() {
ble.write("R");
delay(60);
ble.write(R_value);
delay(50);
}
void potentiometer_Green() {
ble.write("G");
delay(60);
ble.write(G_value);
delay(50);
}
void potentiometer_Blue() {
ble.write("B");
delay(60);
ble.write(B_value);
delay(50);
}
void potentiometer_Yellow() {
ble.write("Y");
delay(60);
ble.write(R_value);
delay(50);
}

void potentiometer_Purple() {
ble.write("P");
delay(60);
ble.write(R_value);
delay(50);
}
void potentiometer_Cyan() {
ble.write("C");
delay(60);
ble.write(B_value);
delay(50);
}
void potentiometer_White() {
ble.write("W");
delay(60);
ble.write(R_value);
delay(50);
}

void LED_setting(int bpot, int cpot){  // 가변저항으로 RGB 제어
// 가변저항에 따른 R_value, G_value, B_value 값을 슬레이브로 보내주는 코드
// cpot : 색상조절하는 가변저항 값 받아오는 매개변수
// bpot : 밝기조절하는 가변저항 값 받아오는 매개변수
if (cpot <= 36) { // red
R_value = bpot;
G_value = 0;
B_value = 0;
potentiometer_Red();
}
else if (cpot <= 72) { // green
R_value = 0;
G_value = bpot;
B_value = 0;
potentiometer_Green();
}
else if (cpot <= 108) { // blue
R_value = 0;
G_value = 0;
B_value = bpot;
potentiometer_Blue();
}
else if (cpot <= 144) { // yellow
R_value = bpot;
G_value = bpot;
B_value = 0;
potentiometer_Yellow();
}
else if (cpot <= 180) { // purple
R_value = bpot;
G_value = 0;
B_value = bpot;
potentiometer_Purple();
}
else if (cpot <= 216) { // cyan
R_value = 0;
G_value = bpot;
B_value = bpot;
potentiometer_Cyan();
}
else if (cpot <= 255) { // white
R_value = bpot;
G_value = bpot;
B_value = bpot;
potentiometer_White();
}
}
[/code]

 

아두이노 controller와 블루투스 통신하는 무드등 LED 제어 코드 

 

[code]
// 아두이노 controller와 블루투스 통신하는 무드등 LED 파트
#include <SoftwareSerial.h>
//Initial pin number
const int Red = 3;
const int Green = 5;
const int Blue = 6;
const int Red2 = 9;
const int Green2 = 10;
const int Blue2 = 11;
const int bluetoothRX = 4;
const int bluetoothTX = 7;
int Pre_R1, Pre_G1, Pre_B1;
int Pre_R2, Pre_G2, Pre_B2;
int Pre_R3, Pre_G3, Pre_B3;
int Pre_R4, Pre_G4, Pre_B4;
//Define to use bluetooth module
SoftwareSerial ble ( bluetoothTX, bluetoothRX );
void setup() {
  Serial.begin ( 115200 );
  ble.begin ( 9600 );
}
void loop() {
  if(ble.available()){
      int c = ble.read(); 
      Serial.print("Color or bright :"); Serial.println(c);
      delay(60);
      int b = ble.read();
      Serial.print("bright or color :"); Serial.println(b);
      delay(50);       
      if ((c==82 && b==82) || (c==71 && b==82) || (c==66 && b==82) || (c==89 && b==82) || (c==80 && b==82) || (c==67 && b==82) || (c==87 && b==82)
       || (c==82 && b==71) || (c==71 && b==71) || (c==66 && b==71) || (c==89 && b==71) || (c==80 && b==71) || (c==67 && b==71) || (c==87 && b==71)
       || (c==82 && b==66) || (c==71 && b==66) || (c==66 && b==66) || (c==89 && b==66) || (c==80 && b==66) || (c==67 && b==66) || (c==87 && b==66)
       || (c==82 && b==89) || (c==71 && b==89) || (c==66 && b==89) || (c==89 && b==89) || (c==80 && b==89) || (c==67 && b==89) || (c==87 && b==89)
       || (c==82 && b==80) || (c==71 && b==80) || (c==66 && b==80) || (c==89 && b==80) || (c==80 && b==80) || (c==67 && b==80) || (c==87 && b==80)
       || (c==82 && b==67) || (c==71 && b==67) || (c==66 && b==67) || (c==89 && b==67) || (c==80 && b==67) || (c==67 && b==67) || (c==87 && b==67)
       || (c==82 && b==87) || (c==71 && b==87) || (c==66 && b==87) || (c==89 && b==87) || (c==80 && b==87) || (c==67 && b==87) || (c==87 && b==87))
       {
        // LED에서 사용할 7가지 색의 이니셜 R, G, B, Y, P, C, W 의 아스키코드 값이 서로 중복되는게 하나라도 있는 경우 예외처리
       }
      else if (c == 82) {  // 변수값 82(Red)일 때
        analogWrite(Red, b);
        analogWrite(Green, 0);
        analogWrite(Blue, 0);
        analogWrite(Red2, b);
        analogWrite(Green2, 0);
        analogWrite(Blue2, 0);
      }
      else if (b == 82) {
        analogWrite(Red, c);
        analogWrite(Green, 0);
        analogWrite(Blue, 0);
        analogWrite(Red2, c);
        analogWrite(Green2, 0);
        analogWrite(Blue2, 0);
      }
      else if (c == 71) { // 변수값 71(Green)일 때
        analogWrite(Red, 0);
        analogWrite(Green, b);
        analogWrite(Blue, 0);
        analogWrite(Red2, 0);
        analogWrite(Green2, b);
        analogWrite(Blue2, 0);
      }
      else if (b == 71) {
        analogWrite(Red, 0);
        analogWrite(Green, c);
        analogWrite(Blue, 0);
        analogWrite(Red2, 0);
        analogWrite(Green2, c);
        analogWrite(Blue2, 0);
      }
      else if (c == 66) { // 변수값 66(Blue)일 때
        analogWrite(Red, 0);
        analogWrite(Green, 0);
        analogWrite(Blue, b);
        analogWrite(Red2, 0);
        analogWrite(Green2, 0);
        analogWrite(Blue2, b);
      }
      else if (b == 66) {
        analogWrite(Red, 0);
        analogWrite(Green, 0);
        analogWrite(Blue, c);
        analogWrite(Red2, 0);
        analogWrite(Green2, 0);
        analogWrite(Blue2, b);
      }
      else if (c == 89) { // 변수값 89(Yellow)일 때
        analogWrite(Red, b);
        analogWrite(Green, b);
        analogWrite(Blue, 0);
        analogWrite(Red2, b);
        analogWrite(Green2, b);
        analogWrite(Blue2, 0);
      }
      else if (b == 89) {
        analogWrite(Red, c);
        analogWrite(Green, c);
        analogWrite(Blue, 0);
        analogWrite(Red2, c);
        analogWrite(Green2, c);
        analogWrite(Blue2, 0);
      }
      else if (c == 80) { // 변수값 80(Purple)일 때
        analogWrite(Red, b);
        analogWrite(Green, 0);
        analogWrite(Blue, b);
        analogWrite(Red2, b);
        analogWrite(Green2, 0);
        analogWrite(Blue2, b);
      }
      else if (b == 80) {
        analogWrite(Red, c);
        analogWrite(Green, 0);
        analogWrite(Blue, c);
        analogWrite(Red2, c);
        analogWrite(Green2, 0);
        analogWrite(Blue2, c);
      }  
      else if (c == 67) { // 변수값 67(Cyan)일 때
        analogWrite(Red, 0);
        analogWrite(Green, b);
        analogWrite(Blue, b);
        analogWrite(Red2, 0);
        analogWrite(Green2, b);
        analogWrite(Blue2, b);
      }
      else if (b == 67) {
        analogWrite(Red, 0);
        analogWrite(Green, c);
        analogWrite(Blue, c);
        analogWrite(Red2, 0);
        analogWrite(Green2, c);
        analogWrite(Blue2, c);
      }
      else if (c == 87) { // 변수값 87(White)일 때
        analogWrite(Red, b);
        analogWrite(Green, b);
        analogWrite(Blue, b);
        analogWrite(Red2, b);
        analogWrite(Green2, b);
        analogWrite(Blue2, b);
      }
      else if (b == 87) {
        analogWrite(Red, c);
        analogWrite(Green, c);
        analogWrite(Blue, c);
        analogWrite(Red2, c);
        analogWrite(Green2, c);
        analogWrite(Blue2, c);
      }
      else if (c==1 && b==1) { // 프리셋 1 
        get_preset1_color();
        analogWrite(Red, Pre_R1);
        analogWrite(Green, Pre_G1);
        analogWrite(Blue, Pre_B1);
        analogWrite(Red2, Pre_R1);
        analogWrite(Green2, Pre_G1);
        analogWrite(Blue2, Pre_B1);
      }
      else if (c==2 && b==2) { // 프리셋 2
        get_preset2_color();
        analogWrite(Red, Pre_R2);
        analogWrite(Green, Pre_G2);
        analogWrite(Blue, Pre_B2);
        analogWrite(Red2, Pre_R2);
        analogWrite(Green2, Pre_G2);
        analogWrite(Blue2, Pre_B2);
      }
      else if (c==3 && b==3) { // 프리셋 3
        get_preset3_color();
        analogWrite(Red, Pre_R3);
        analogWrite(Green, Pre_G3);
        analogWrite(Blue, Pre_B3);
        analogWrite(Red2, Pre_R3);
        analogWrite(Green2, Pre_G3);
        analogWrite(Blue2, Pre_B3);
      }
      else if (c==4 && b==4) { // 프리셋 4
        get_preset4_color();
        analogWrite(Red, Pre_R4);
        analogWrite(Green, Pre_G4);
        analogWrite(Blue, Pre_B4);
        analogWrite(Red2, Pre_R4);
        analogWrite(Green2, Pre_G4);
        analogWrite(Blue2, Pre_B4);
      }
}
}
void get_preset1_color() { // 앱과 연동해서 프리셋 색을 받아오도록 변경 
  Pre_R1 = 255;
  Pre_G1 = 255;
  Pre_B1 = 255;
}
void get_preset2_color() {
  Pre_R2 = 0;
  Pre_G2 = 0;
  Pre_B2 = 255;
}
void get_preset3_color() {
  Pre_R3 = 255;
  Pre_G3 = 255;
  Pre_B3 = 0;
}
void get_preset4_color() {
  Pre_R4 = 255;
  Pre_G4 = 0;
  Pre_B4 = 0;
}
// 문제점 -> 마스터로부터 순차적으로 값을 받아올 수가 없음 
// 컬러값, 밝기값을 순서대로 받아서 변수에 순서대로 저장하는 것이 안 됨
// LED 7가지 색상  
// Red -> R , Green -> G , Blue -> B , Yellow -> Y , Purple -> P -> Cyan -> C , White -> W
// 각각의 이니셜 대문자 알파벳으로 마스터로부터 값을 받아옴
// read값 중
// 82가 있음 -> R 82 나머지 값 하나는 밝기값
// 71가 있음 -> G 71
// 66이 있음 -> B 66
// 89가 있음 -> Y 89
// 112가 있음 -> P 80
// 67이 있음 -> C 67
// 119가 있음 -> W 87
// 예외처리 : 다음 47가지 경우엔 LED값을 변경하지 않음.
//    
// 82 82  or 71 82  or 66 82  or 89 82  or 80 82  or 67 82  or 87 82
// 82 71  or 71 71  or 66 71  or 89 71  or 80 71  or 67 71  or 87 71 
// 82 66  or 71 66  or 66 66  or 89 66  or 80 66  or 67 66  or 87 66
// 82 89  or 71 89  or 66 89  or 89 89  or 80 89  or 67 89  or 87 89
// 82 80  or 71 80  or 66 80  or 89 80  or 80 80  or 67 80  or 87 80
// 82 67  or 71 67  or 66 67  or 89 67  or 80 67  or 67 67  or 87 67
// 82 87  or 71 87  or 66 87  or 89 87  or 80 87  or 67 87  or 87 87
[/code]

 

핸드폰 앱과 블루투스 통신하는 무드등 LED 제어 코드

 

[code]
// 핸드폰 앱과 블루투스 통신하는 무드등 LED 파트
#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);
}
[/code]

 

 

 

 

자기야 선물~! 블루투스 자기 부상 Mood Light

 

 

반응형