자기야 선물~! 블루투스 자기 부상 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 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩