자기야 선물~! 블루투스 자기 부상 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]
'메이커 Maker' 카테고리의 다른 글
소리로 알려주는 분실물 방지 선반 (0) | 2022.01.17 |
---|---|
그대를 위한 만능 스탠드 (0) | 2022.01.14 |
음주 측정 킥보드 개발 완료 보고서 (1) | 2022.01.13 |
약 먹을 시간을 알려주는 미니 약국 (0) | 2022.01.12 |
의료 폐기물 자동 수거 로봇 (0) | 2022.01.10 |
인체 감지 세이프 헬멧 (0) | 2022.01.07 |
반자동 방충망 청소 로봇 (0) | 2022.01.06 |
비접촉 음성인식 자판기 (0) | 2022.01.05 |
더욱 좋은 정보를 제공하겠습니다.~ ^^