티스토리 뷰

DIY/아두이노

침대 무드등 만들기

멍구쫑쫑 2017. 1. 30. 18:28

아두이노 LED 무드등

밤에 취짐 중 깨어나서 물을 마시거나 화장실을 갈때 어두워서 '무드등이 있었으면 좋겠다~' 생각했던 적이 있습니다. 대부분 무드등은 스탠드형태의 모양으로 협탁이 있어야 되거나, 벽걸이 형이 있습니다. 하지만 이런 형태의 직접 조명은 야간에 안구테러를 당할 것 같아서 피하게 되었습니다. 그래서 침대 하단에 간접 조명을 설치하려 했습니다만,제가 못찾은 걸 수도 있겠지만 국내에는 파는 제품들은 항상 켜져있었는 제품들이였습니다.
항상 켜져있으면 심리적으로 전기세 부담이 되기도 하고 실제로는 얼마안하겠지만, 켜져있으면 수면에 방해가 될 것 같아 이 또한 적합하지 않았습니다.

그래서 침대용 간접 센서 무드등을 만들게 되었습니다.
필요한 기능은 '센서점멸/점등','간접 조명','Fade In/Out'입니다.
이런 전자기기(?) 만들때에는 초보자도 아두이노가 적합하여 아두이노로 만들게 되었습니다.

시나리오

대부분의 센서등이 그렇듯 시나리오도 매우 간단합니다 :D

s=>start: 전원온!
csd=>condition: 어두운가?
man=>condition: 인체감지?
man2=>condition: 인체감지?
wait=>operation: 잠시대기
wait2=>operation: 잠시대기
fadein=>inputoutput: Fade in LED
fadeout=>inputoutput: Fade out LED

s->csd
csd(no)->wait(right)->csd
csd(yes)->man
man(yes)->fadein->man2
man(no)->wait
man2(yes,right)->wait2(right)->man2
man2(no)->fadeout(right)->csd

재료준비하기

품목 갯수 구입처
아두이노 UNO (또는 NANO) 1ea http://eleparts.co.kr/EPX7R9BJ
인체감지센서 1ea http://eleparts.co.kr/EPXF9YKT
광량감지센서 1ea http://eleparts.co.kr/EPX36MHM
WS2812 LED 55ea http://eduino.kr/product/detail.html?product_no=187
5V 5A 어댑터 1ea http://auction.kr/iAtOxPK
DC 배럴 잭 어댑터 1ea http://auction.kr/iAfIIwq
330Ω 저항 1ea http://eleparts.co.kr/EPX34LR6
1000uF 6.3V 커패시터 1ea http://eleparts.co.kr/EPXFNCYC

그 외 인두, 납, 와이어 스트리퍼, 전선, 몰딩, 수축튜브가 필요합니다.

시행착오

침대세로 길이가 1.9m이고, 위에서 구매한 LED 사이즈가 1.7cm입니다.
LED 전류 소모량도 계산안하고, 110개를 주문했습니다.
LED 한개당 약 최대 60mA를 소모한다고 합니다.
따라서 110개를 전부 쓰려면 110 x 60mA = 6600mA가 소모되는데 5V 7A이상 되는 어댑터를 구입하기 쉽지 않더군요.ㅠㅠㅠㅠㅠ
LED 구입하실분은 아마존에서 60ea/1m 구매하시는게 훨씬 저렴하고 편합니다.
검색키워드는 Neopixel이나 ws2812로 하시면됩니다.

제작과정

센서장착!



인체감지센서와 조도센서를 장착하였습니다.

#define PIN_CSD       3  //밝기 센서
#define PIN_MAN       4  //인체 센서
#define PIN_LED       6  //LED 표시

int CSD_LIMIT = 900;        // 밝기 센서제한 값

void setup() {
    pinMode(PIN_CSD, INPUT);
    pinMode(PIN_LED, OUTPUT);
    pinMode(PIN_MAN, INPUT);
}
void loop() {
  if (sensor_csd())  // 밝기센서 체크
    if (sensor_man()) // 인체센서 체크
         // LED ON되는 라인
  delay(10);
}

// 밝기 센서
bool sensor_csd()
{
  int val = analogRead(PIN_CSD);
  Serial.print("SENSOR_CSD : ");
  Serial.println(val);
  return val > CSD_LIMIT;
}

// 인체센서
bool sensor_man()
{
  int val = digitalRead(PIN_MAN);
  Serial.print("SENSOR_MAN : ");
  Serial.println(val);
  return val == HIGH;
}

전원장치


커패시터를 어댑터부분에 LED보호를 위해 설치를 권장합니다.
LED data 선에는 330Ω 저항을 설치 또한 권하는데요, 사진을 못찍었습니다.ㅠㅠ

LED 재조립

시행착오에서 말했듯이 LED를 잘 못 구해하여, 침대 길이에 맞게 LED 분리후 전선을 다시 연결했습니다... 아마존에서 led strip을 구입하시면 시간과 돈을 절약할 수 있습니다. ㅠㅠ
5V 5A 어댑터 구입하기 쉬우니, 저는 LED 55개(55*60mA=3.3A)로 충분히 전류를 공급할 수 있습니다.


LED 길이
55 x 1.7cm = 93.5cm


LED와 LED를 연결시켜줄 개당 전선길이
(190cm - 93.5cm) / 54 = 1.7cm

VCC, DATA, GND 각 3개가 필요합니다... 헐...
162개 1.7cm 전선이 필요하게 되었습니다.
또 LED를 사면 돈이 아까우니.. 있는 재료로 노가다를 했습니다.


선은 랜선을 이용했습니다.
눈알 빠지는 줄 알았습니다.ㅠ


스탠드 있는 책상으로 이동해서, 와이어 스트리퍼로 양쪽을 잘라줬습니다.
324번의 와이어 스티러퍼질!!


LED를 자른 뒤!


LED를 보시면 화살표가 있는데, 화살표 방향으로 데이터가 순차적으로 입력됩니다.
Din이 Data Input 같고, DO가 Data Out인 것 같습니다.


납땜질 사진을 보니.. LED가 54개네요..
하나는 본체랑 연결해야되서 빠져있네요!


10개씩 나눈뒤 합치기전!


모두 연결한뒤 테스트 샷입니다.
다행이도 잘 되네요..
총 5시간은 걸린 듯 합니다.



테스트 영상입니다.

LED소스는 https://github.com/adafruit/Adafruit_NeoPixel 여기서 다운 받을 수 있습니다.

LED Fade In/Out 소스입니다.

#define NUMPIXELS     55 // 제어하고 싶은 LED 개수

unsigned long FADE_OUT_TIMER = 3000;  // 페이드 아웃대기 시간

#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN_LED, NEO_GRB + NEO_KHZ800);
void setup() {
  // put your setup code here, to run once:
  pixels.begin();
  pixels.setBrightness(100);
  Serial.begin(9600);
  pinMode(PIN_CSD, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_MAN, INPUT);
}

void loop() {
  if (sensor_csd())  // 밝기센서 체크
    if (sensor_man()) // 인체센서 체크
      fade_led(FADE_OUT_TIMER, 255, 127, 0);    // LED RGB값 입력
  delay(100);
}

// LED 페이드인아웃
void fade_led(unsigned long timer, int target_r, int target_g, int target_b) {
  float x;
  int r, g, b;
  bool isStopped = false;
  for (float i = 0; i <= 3.14; i = i + 0.01) {
    x = sin(i);

    r = target_r * x;
    g = target_g * x;
    b = target_b * x;

    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.setPixelColor(i, r, g, b);
    }
    pixels.show();

    if (x > 0.995 && isStopped == false) {
      isStopped = true;
      while (sensor_man())
      {
        delay(100);
      }
    }
    delay(10);
  }
  delay(timer);
}

설치준비

LED와 전선의 힘이 있어 1자로 쭉 피기가 힘들어서 몰딩위에다가 부착하였습니다.


굳굳 잘됩니다.

간소화

아두이노 UNO보다 작은 사이즈인 NANO가 있길래 이걸 추가로 구매해서 납땜질하여 간소화 시켰습니다.


센서 2개와 수츅튜브로 보호했습니다.


LED와 전원도 연결!


모듈화

정작 침대 밑에 다가 설치하니, 버그나 수정하고 싶을 때마다 LED를 통채로 들고 가거나 노트북을 들고 침대 밑에서 작업을 해야합니다. ㅠㅠㅠ
왜 납땜질을 해가지고...
LED와 탈부착이 쉽게 다시 납땜질을 하였습니다.



후기 및 버그

실전에 사용해보니 매우 만족스럽습니다. 후후훗 노가다한 보람이 있습니다 :D
하지만 버그가 있는지 밤에 혼자 켜지곤 합니다. ㅠㅠㅠ
인체센서가 고장인지 설치조건이 잘못 되었는지 도대체 원인을 못 찾겠더군요..
바람부는 곳에는 설치하지말라고 명시되어있는데, 방에 바람이 불리가 없고.. ㅠㅠ
차후에 인체감지 센서를 거리측정 센서로 변경해서 해봐야겠습니다.

또 이번 포스팅을 작성하면서 검색해봤는데, 해외에 제가 원하던 제품이 있더군요... 거기에 가격도 저렴!! 띠로리~ㅠㅠ
그 제품은 'Fade In/Out이 안될꺼야..', '색이 변하지 않을꺼야.. ㅠㅠ' 이러면서 혼자 정신승리 중에 있습니다..ㅠ

그래도 아두이노니까 나중에 확장도 가능하고.....
장나면 알아서 고치면되고....
..
...
....
하지만 가격은 5배 넘는 비용이 들었네요..
제대로 알고 했으면 이보다 반은 저렴하게 끝났을 것 같네요!
아두이노를 처음작업해보니 총 일주일 정도 고생한 것 같네요... ㅠ
그래도 아주 유용하게 사용중입니다!!
끗!


관련글
- Delay()와 센서

'DIY > 아두이노' 카테고리의 다른 글

Delay()와 센서  (0) 2017.02.03
댓글