본문으로 바로가기

DIY 프로젝트 화장대에 밝기 조정 가능한 조명 설치하기 3편



안녕하세요. 애드라이프 입니다.

벌써 DIY 화장대 조명 설치 하기로 3번째 포스팅입니다.

화장대에 조명을 설치하기 위한 핵심 부품에 대해서 1편과 2편에서 

네오픽셀 조명과 OLED 디스플레이를 다뤄보는 포스팅을 했습니다.

이번에는 여러 사이드 부품을 조합하여 완성을 시키는 포스팅을 하려합니다.


개인적인 작업이다 보니 설명이 좀 부족한 부분이 있을 수 있습니다.

궁금한 부분이 있다면 댓글로 남겨주시면 답변드리겠습니다.


네오픽셀 LED와 OLED를 제외한 사이드 부품을 살펴보겠습니다.▼

DIY 프로젝트 화장대에 밝기 조정 가능한 조명 설치하기 3편



하나씩 설명 드리면


1. 5Kohm의 다이얼 모양의 가변저항이 있습니다.

조명의 밝기를 조절하기 위한 목적으로 쓰일 예정입니다.

저항은 적절한 값으로 아무거나 쓰셔도 됩니다.


2. Power SW는 당연하겠지만 쓸때만 전원 공급을 할 수 있도록 하기 위함입니다.


3. Push SW는 색을 변경하고 싶을 때 사용할 예정입니다.


4. 5V 전원 장치는 네오픽셀 LED에 단독으로 전원을 연결해줄 예정입니다.

솔직히 이론적으로는 제가 사용하고자하는 네오픽셀 타입을 커버하기에는 

1A짜리 전원공급장치는 매우 부족합니다.


이유는 제가 쓰는 네오픽셀 조명은 LED당 최대 소비 전류가 80mA인데

이런 LED가 60개가 달린 모델입니다. 그렇다면 최대로 사용할 경우에

4.8A(80mAx60=4800mA)의 전류가 필요합니다. 1A로는 턱없이 부족하죠.

하지만 LED하나에는 R,G,B,W의 4개의 LED가 내장되어있고

주로 쓰는 LED는 화이트(W)LED입니다. 모든 LED의 소비전류 값이 동일하다고 했을 경우에

R,G,B,W각각 최대 20mA(80mA/4=20mA)의 전류는 소비하고 

그럼 화이트 LED를 전부 켰을 경우에 1.2A(20mAx60=1200mA)가 소비 됩니다.

그 중에서 밝기 TEST를 해본결과 중간정도 밝기로도 충분히 주변이 밝아 지기 때문에 

밝기 제어시 Max 밝기를 중간밝기로 할 예정입니다.

결론적으로 실제 사용시 최대 600mA 내외의 전류를 소비하게 될 예정입니다.

거기에 안정적으로 여유를 주기 위해 1A를 선정하가 된 것입니다. 


5. 9V베터리는 아두이노의 전원을 공급해줄 예정입니다.


이제 전체 부품을 연결해본 회로도를 살펴보겠습니다.▼

DIY 프로젝트 화장대에 밝기 조정 가능한 조명 설치하기 3편

회로도 연결은 위와 같이 하면 되지만 한가지 주의 점은 

네오픽셀에 공급하는 전원과 아두이노에 전원을 서로 연결하지 않는 다는 점입니다.

GND는 서로 공유하고 있지만 각가의 5V는 개별로 연결되어 있는 것을 확인 하실 수 있습니다.


본격적인 프로그램을 살펴보기전에 혹시 네오픽셀 조명과 OLED디스플레이의 

사용법이 궁금하신 분은 아래 링크를 참고해 주세요.



이제 본격적으로 프로그램을 살펴보도록 하겠습니다.▼

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <Adafruit_NeoPixel.h>                          //네오픽셀 사용시 필요한 라이브러리 추가
#include <Wire.h>                                         //I2C 사용시 필요한 라이브러리 추가
#include <Adafruit_GFX.h>                                 //OLED 사용시 글씨지원 라이브러리 추가
#include <Adafruit_SH1106.h>                              //OLED 사용시 구동 IC 지원 라이브러리 추가
 
#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);
 
#define SW_PIN 2                                          // LED 색상변경용 스위치
#define NEO_PIN 6                                         // 네오픽셀 연결 디지털 핀 번호 적기
#define NUM_LEDS 60                                       // 네오픽셀 소자 수, 1부터 시작. (3개 연결시, 3 작성)
//#define BRIGHTNESS 100                                    // 네오픽셀 밝기 설정 0(어두움) ~ 255(밝음)
#define DialPin A0                                        // 밝기 조절용 가변저항값을 읽을 아날로그A0핀 
 
#define DISABLE 0                                         //함수에서 시리얼 모니터에 디스플레이 기능을 비활설용 변수정의
#define ENABLE 1                                          //함수에서 시리얼 모니터에 디스플레이 기능을 활설용 변수정의
 
unsigned int DialValue = 0;
unsigned int DialValue_analog = 0;
unsigned int DialValue_RangeChange = 0;
unsigned int ColorFlg=0;
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NEO_PIN, NEO_GRBW + NEO_KHZ800);  //RGBW 네오픽셀용 
//Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NEO_PIN, NEO_GRB + NEO_KHZ800);     //RGB 네오픽셀용
 
void setup() {
  Serial.begin(115200);                                   //시리얼 통신 115200
  pinMode(SW_PIN, INPUT_PULLUP);                          //색변경용 SW를 기본 PULL UP상태 INPUT으로 설정 하고 회로는 스위치가 눌리면 LOW가 입력되는 형태로 구성
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);               //I2C 주소값 설정 OLED
  display.clearDisplay();                                 //OLED 화면 지움
  strip.begin();                                          // 네오픽셀 제어 시작 (실제로는 간순히 네오픽셀의 값을 젆부0으로 초기화)
  strip.show();                                           // 네오픽셀 점등(명령을 네오픽셀로 전달)
}
 
void loop() {
  DialValue = DialResult(DISABLE);                        //가변 저항값을 받아옵니다.
  strip.setBrightness(DialValue);                         //가변저항의 값을 밝기값으로 환산하여 실제 네오픽셀의 밝기를 조절하는 함수에 입력 <- RGBW타입만 사용
  delay(100);
  Steemitdrawchar(DialValue);                             //OLED 문자출력 함수
  display.display();                                      //OLED 실제 문자 출력
  display.clearDisplay();                                 //OLED 화면 지움
  if(digitalRead(SW_PIN) == LOW){                         //색변경용 SW가 눌렸을 경우 동작 정의
    ColorFlg++;                                           //ColorFlg를 사용하여 해당 색으로 변경 0 -> White , 1 -> Yellow
    Serial.println("스위치 눌림");
    Serial.println(ColorFlg);
    if(ColorFlg==2)ColorFlg=0;
    delay(1000);
  }
  if(ColorFlg==0){                                        //colorWipe(strip.Color(RED,GREEN,BLUE,White),Delay);
    colorWipe(strip.Color(0,0,0,255),0);                  // White           
    delay(100);
  }
  if(ColorFlg==1){
    colorWipe(strip.Color(255,255,0,0),0);                //  Yellow
    delay(100);
  }
//  if(ColorFlg==2){
//    colorWipe(strip.Color(255,0,0,0),0);                // RED
//    delay(100);
//  }
//  if(ColorFlg==3){
//    colorWipe(strip.Color(0,255,0,0),0);                // GREEN
//    delay(100);
//  }
//  if(ColorFlg==4){
//    colorWipe(strip.Color(0,0,255,0),0);                // BLUE
//    delay(100);
//  }
}
void colorWipe(uint32_t c, uint8_t wait) {                //네오픽셀의 LED를 순차적으로 제어하는 함수
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
int DialResult(unsigned int Display)
{
  DialValue_analog = analogRead(DialPin);
  DialValue_RangeChange = map(DialValue_analog,0,1023,0,150);                 //0~1023 의 범위를 0~255범위로 변경
  DialValue_RangeChange = Function_Multiples_of_10(DialValue_RangeChange);    //10의 배수로 값 변경
  if(Display){
    Serial.print("가변저항 초기값 :");
    Serial.println(DialValue_analog);
    Serial.print("초기값 범위 조정 후 :");
    Serial.println(DialValue_RangeChange);
  }
  return DialValue_RangeChange;
}
int Function_Multiples_of_10(int Value)                    //10단위로 나눠 밝기 조정 1단위로 하면 계속밝기가 변하는 현상이 생김
{
  if(Value<10)Value=0;
  if(Value>10 && Value<20)Value=10;
  if(Value>20 && Value<30)Value=20;
  if(Value>30 && Value<40)Value=30;
  if(Value>40 && Value<50)Value=40;
  if(Value>50 && Value<60)Value=50;
  if(Value>60 && Value<70)Value=60;
  if(Value>70 && Value<80)Value=70;
  if(Value>80 && Value<90)Value=80;
  if(Value>90 && Value<100)Value=90;
  if(Value>100 && Value<110)Value=100;
  if(Value>110 && Value<120)Value=110;
  if(Value>120 && Value<130)Value=120;
  if(Value>130 && Value<140)Value=130;
  if(Value>140 && Value<150)Value=140;
  if(Value==150)Value=150;                              //최대값은 255까지 가능하지만 중간 밝기를 Max로 지정
  return Value;
}
void Steemitdrawchar(unsigned int ValueStr) {           //OLED문자 출력함수
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(" [ LED Level 0~150 ]");
  display.println();
  display.println(" Dial -> Brightness");
  display.println();
  display.println(" SW -> Change color");
  display.display();
 
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,50);
  display.print(" Brightness:");
  display.println(ValueStr);
  display.display();
  
}
cs

프로그램에 대한 전체적인 흐름은 주석을 참고해주세요.(옆으로 넘기면서 보실 수 있습니다.)


위 프로그램이 제 첫번째 화장대 조명 프로그램입니다. Version 1.00.00인 셈이죠.

혹시나 프로그램에 주석을 보시고도 궁금한 점이 있으시면 댓글로 남겨주세요.

실제 설치된 화장대 조명을 확인 하면서 이번 포스팅을 끝내겠습니다.


지금까지 아두이노(Arduino) DIY 프로젝트 화장대에 밝기 조정 가능한 조명 설치하기 3편 포스팅이였습니다.

미적감각은 좀 떨어져서 마무리가 좀 이상합니다만 뭐 아내가 고맙다고 하니 뿌듯하네요.

계속해서 도움되는 포스팅으로 찾아 뵙겠습니다.

by 애드라이프