프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

종각 빛 알람 시계

2015-03-11 18:45:57

개요

 

 매일 아침 소란스러운 알람 시계소리에 눈을 뜨는 것이 불쾌하다고 생각하시는 분들이 많습니다. 이러한 사람들을 위해 시끄러운 알람 소리 대신 빛을 이용한 알람시계 제품도 시중에 나왔습니다.

 

 이러한 빛 알람시계를 이용하여 눈을 뜨는 것은 아침에 알람시계의 소리에 눈을 뜨는 것 보다 잠에서 깨는 것이 더 큰 효과가 있다고 합니다.

 

 서울 수면환경연구소에서는 밤에는 밤답게 실내를 어둡게 만들어 잠들고, 아침에는 빛을 받아 자연스럽게 몸이 반응해 잠에서 깨는 방법이 몸에 불필요한 부담을 주지 않고 기분좋고 자연스럽게 잠에서 깰 수 있는 방법이라고 소개합니다.

출처 : PHILIPS - Wake up Light

 

이번 컨텐츠에서는 영공방에서 나온 주니어 시리즈 종각을 이용해서 빛 알람 시계를 만들어 보겠습니다.

<영공방 - 종각>

 

LCD에 현재 시각을 출력하고 알람 시간이 되면 LED의 불이 켜지면서 서보모터로 종을 치고,, 피에주 부저로 알람 소리를 울리게 했습니다.

 

미리보기 동영상

 

 

부품 목록

 

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 LCD 1  
3 서보 모터 1  
4 Neopixel LED 4 Stick형
5 RTC모듈 1  
6 피에조 부저 1  
7 가변저항 1  
8 브레드보드 1  
9 점퍼케이블 27 연결하는 방법에 따라 변할 수 있습니다.

 

부품명 오렌지 보드 LCD 서보 모터 Neopixel LED
파트

 

부품명 RTC모듈 피에조 부저 가변저항 브레드보드 점퍼케이블
파트

 

 

하드웨어 Making

 

브레드보드 레이아웃

 

회로도

 

빛 알람 제작

영공방 종각 제작은 영공방 홈페이지에 있는 종각을 확인하시거나(링크) 종각 구매시 주는 설명서를 보고 제작하시기 바랍니다.

 

LED스틱은 아래와 같이 4개를 이어 줍니다.(아두이노와 연결할 수 있도록 DI가 있는 방향으로 선을 빼줍니다.

 

빼낸 선에서 5V, GND를 연결해 주시고 DI 핀은 오렌지 보드 6번핀에 연결해 줍니다.(위에 회로도와 브레드보드 레이아웃에는 LED Stick 연결부분이 없습니다. 연결을 꼭 확인해주세요)

 

LED Stick은 종각 주변으로 감싸 줍니다.(위의 사진을 참고하시면 됩니다.)

 

밑의 상자 안에는 오렌지보드와 건전지 기타 외부로 나올 필요가 없는 부품들은 다 넣어 줍니다. LCD나 LED, 모터 같은 부품들은 상자에 구멍을 뚫어서 선을 빼줍니다.

 

연결선이 많아서 상자안에 부품들을 넣을 때 연결선이 빠지거나 잘못 연결 할 수 있으니 조심히 넣어줍니다.

 

서보와 피에조 부저는 뒷면으로 빼서 붙여 주고 모터가 돌때 종을 칠 수 있도록 길이를 잘 맞춰서 막대기 같은 것을 붙여 줍니다.

 

앞부분에는 LCD 선이 나올만한 구멍을 뚫고 LCD를 연결해 줍니다. 그리고 LCD를 상자에 고정시켜 줍니다.

 

 

소프트웨어 Coding

 


#include <Time.h>  
#include <TimeAlarms.h>
#include <Wire.h>  
#include <LiquidCrystal.h>
#include <Servo.h>
#include <Adafruit_NeoPixel.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

#define PIN 6

Servo myservo;
LiquidCrystal lcd(12,11,5,4,3,2);
String lcdString = "";

Adafruit_NeoPixel strip = Adafruit_NeoPixel(32, PIN, NEO_GRB + NEO_KHZ800);

void setup()  {
  Serial.begin(9600);

  myservo.attach(9);
  myservo.write(150);
  lcd.begin(16,2);
  lcd.clear();

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  Alarm.alarmRepeat(hour(),minute(),second()+2, TestAlarm);
  Alarm.timerRepeat(80, TestAlarm);   

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}

void loop()
{  
  displayTime();
  Alarm.delay(1000);
}

void displayTime(){
  lcd.setCursor(0, 0);
  lcd.print(year());
  lcd.print("-");
  lcd.print(printDigits(month()));
  lcd.print("-");
  lcd.print(printDigits(day()));

  lcd.setCursor(0, 1);
  lcd.print(printDigits(hour()));
  lcd.print(":");
  lcd.print(printDigits(minute()));
  lcd.print(":");
  lcd.print(printDigits(second()));
}

String printDigits(int digits){
  if(digits < 10)
    return "0" + String(digits);

  return String(digits);
}

void TestAlarm(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Alarm");

  for(int i = 0; i <= 255; i++){
    colorWipe(strip.Color(0, 0, i), 10); // Blue
    //Alarm.delay(10);
  }
  int j = 0;
  while(j < 5){
    myservo.write(30);
    delay(400);
    tone(8, 360, 1000);
    delay(1000);
    myservo.write(150);
    delay(500);
    j++;
  }
  for(int i = 255; i >= 0; i--){
    colorWipe(strip.Color(0, 0, i), 10); // Blue
    //Alarm.delay(10);
  }
  myservo.write(150);
  lcd.clear();
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i

위의 코드를 사용하기 위해서는 Adafruit_Neopixel 라이브러리와, Time, TimeAlarms 라이브러리를 받으셔야 합니다.

 

아두이노 라이브러리 사용법은 코코아팹 Get Started에 있는 Arduino 라이브러리를 참고하시면 됩니다.

 

RTC모듈 시간 세팅하는 방법은 전에 올렷던 컨텐츠 RTC모듈을 사용하여 현재시간을 LCD에 출력해 봅시다. 를 참고하셔서 세팅하시면 됩니다. 

 


  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  Alarm.alarmRepeat(hour(),minute(),second()+2, TestAlarm);
  Alarm.timerRepeat(80, TestAlarm);  

RTC모듈로 부터 현재 시간을 받고, 알람시계를 세팅하는 부분입니다. alarmRepeat함수는 매일 알람시각이 되면 TestAlarm이라는 함수를 실행하게 됩니다.(추가 변수를 주어서 특정 요일만 동작하게 할수 있습니다.)

 

timerRepeat함수는 정해진 주기마다 TestAlarm함수를 실행 합니다.(초 단위 입니다.) 위의 두 함수를 잘 이용하셔서 자신이 원하는 알람 시간을 설정하시면 됩니다.

 

(매일 일정시간에 알람을 할 경우 alarmRepeat함수, 일정 주기마다 계속 알람을 할 경우 timerRepeat함수를 이용하시면 됩니다.)

 

TimeAlarms 라이브러리 함수에 대한 자세한 설명은 링크를 참고 하시기 바랍니다. 

 


void TestAlarm(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Alarm");

  for(int i = 0; i <= 255; i++){
    colorWipe(strip.Color(0, 0, i), 10); // Blue
    //Alarm.delay(10);
  }
  int j = 0;
  while(j < 5){
    myservo.write(30);
    delay(400);
    tone(8, 360, 1000);
    delay(1000);
    myservo.write(150);
    delay(500);
    j++;
  }
  for(int i = 255; i >= 0; i--){
    colorWipe(strip.Color(0, 0, i), 10); // Blue
    //Alarm.delay(10);
  }
  myservo.write(150);
  lcd.clear();
}

알람시각이 되면 동작하는 TestAlarm함수 입니다. 현재 시간을 출력하던 LCD화면을 대신 Alarm 이라는 글자를 띄우고, LED Stick에 파란색 빛을 서서히 밝혀줍니다.(밝기 1부터 255까지 0.01초 단위로 1씩 올려줍니다.)

 

최대 밝기가 되면 서보모터를 움직여서 종을 쳐주고 종을 칠 때(서보모터가 해당 각도로 움직였을 때) 피에조 부저에서 소리를 내줍니다. 그 상태에서 잠깐 대기했다가 서보모터 각도를 원상태로 돌려줍니다. 이것을 5번 반복하고 LED Stick을 밝혀줄 때와 마찬가지로 빛을 서서히 줄여줍니다.(마찬가지로 밝기 255에서 1까지 0.01초 단위로 1씩 내려줍니다.)

 

LED Stick에 색상은 colorWipe(strip.Color(0, 0, i), 10); 이부분에서 strip.Color 부분을 바꿔 주면 됩니다. 변수는 빨/녹/파 순서 입니다. 흰색을 원하시는 분은 3개다 켜지게 하시면 됩니다.

 

어두운 방안에서 이 빛알람이 켜지면 기분 좋게 일어 날 수 있을 것 같습니다.(일부로 좋아하는 색깔인 파란색을 선택했습니다.)

판다마니아

오렌지 보드, LCD, Neopixel, LED, Servo, Piezo, RTC