산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기

부품 및 소모품

아두이노 나노 R3 1
Maxim DS3231MPMB1 RTC 모듈 정확한 실시간 시계, 정전 시에도 시간 유지 1

프로젝트 소개

겨울철 새벽 6시, 어둡고 추운 방에서 일어나는 건 고역입니다. 인공적인 '일출'을 만들어 방을 서서히 밝고 따뜻하게 해준다면 어떨까요?

기존 천장 등기구에 끼울 수 있는 스마트 전구를 제작합니다. 해가 뜨듯 서서히 조도를 높여 자연스러운 기상을 유도하고, 향후 스마트폰과 연동해 제대로 된 알람 시계로 발전시킬 계획입니다.

전구 베이스 제작

일반 전구를 망치로 깨서 유리구를 제거하고, 알루미늄 소켓과 바닥 단자에 전선을 납땜해 스마트 전구의 베이스로 활용했습니다.

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
페르프보드에 아두이노 나노, 5V 전원, 회로 부품 실장

고전압 회로 (TRIAC 디밍)

⚠ 안전 경고: 50V 이상 고전압을 다룹니다. 감전 시 중상 또는 사망할 수 있습니다.

일반 전구는 교류 전원으로 작동하므로 마이크로컨트롤러로 직접 제어할 수 없습니다. TRIAC을 사용해 교류 파형의 위상을 제어, 디밍을 구현합니다. 교류 사인파의 제로크로싱(영점 교차) 시점을 정확히 맞춰야 깜빡임 없는 부드러운 디밍이 가능합니다.

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
교류 파형 위상 제어로 디밍 구현

제로크로싱 검출: 4N35 옵토커플러(U1)로 교류 영점 교차 시 트랜지스터가 턴온되어 MCU에 하이 신호 전달. 저전압 회로와 메인 전압 회로 절연 역할도 겸함.

TRIAC 구동: MOC3063 옵토커플러(U2, 출력단에 TRIAC 내장)로 MCU와 고전압 TRIAC(Q2) 완전 절연. 제로크로싱 기능이 없는 옵토커플러를 사용해야 임의 위상에서 턴온 가능.

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
고전압 회로: 제로크로싱 검출 + TRIAC 구동

저전압 회로

아두이노 나노가 TRIAC 제어 및 알람 시각 관리를 담당. DS3231 RTC 모듈로 정확한 시각 유지(배터리 백업). 5V 전원은 소켓에서 들어오는 교류를 5V 700mA 강압형 SMPS로 변환해 공급.

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
아두이노 나노, RTC, 5V SMPS 실장

소프트웨어 동작

코드는 비교적 단순하며 자명합니다. 이해 안 되면 제가 개발을 못 한 겁니다!

향후 계획

며칠~몇 주간 실사용해 보고 기상 효과가 검증되면, 더 스마트하고 정교한 버전으로 발전시킬 예정입니다.

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
선라이즈 알람 작동 모습

소스 코드

/* 스마트 전구 - 기상 시각에 맞춰 서서히 점등
 * 1) 전원 투입 시 점등 후 서서히 소등 (동작 확인)
 * 2) 밤 동안 대기
 * 3) 오전 6시 서서히 점등 → 최대 밝기 유지
 * 4) 실내가 밝으면(조도 센서) 점등 안 함
 * 사용법: 취침 시 전등 켜두면 아침에 자동 점등, 외출 시 스위치로 끄기
 * DS3231으로 시간 보존
 * @author Jiri Praus
 * AC 디밍 참고: https://arduinotehniq.blogspot.com/2014/10/ac-light-dimmer-with-arduino.html
 */
#include <TimerOne.h>
#include "RTClib.h"

#define TRIAC_PIN 2
#define ZERO_CROSS_PIN 3
#define LIGHT_SENSOR_PIN A6
#define FREQUENCY_STEP 75      // 50Hz 기준 밝기 단계당 지연(µs), 60Hz면 65로 변경
#define CHANGE_DIM_LEVEL_EVERY 1  // 디밍 단계 변경 주기(초)
#define MAX_DIM_LEVEL 128      // 완전 소등
#define MIN_DIM_LEVEL 0        // 최대 점등
#define DARK_THRESHOLD 300     // 조도 센서 임계값(이하면 어두움)

volatile byte triacCounter = 0;
volatile boolean zeroCrossed = false;
byte dimLevel = MIN_DIM_LEVEL;
boolean lightOn = false;

RTC_DS3231 rtc;

void setup() {
  Serial.begin(115200);
  digitalWrite(TRIAC_PIN, LOW);
  pinMode(TRIAC_PIN, OUTPUT);
  pinMode(ZERO_CROSS_PIN, INPUT);
  pinMode(LIGHT_SENSOR_PIN, INPUT);

  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while(1);
  }
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  noInterrupts();
  attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossDetected, RISING);
  interrupts();
  Timer1.initialize(FREQUENCY_STEP);
  Timer1.attachInterrupt(triacTimerInterrupt, FREQUENCY_STEP);
}

void loop() {
  delay(CHANGE_DIM_LEVEL_EVERY * 1000);
  checkAlarmClock();
  adjustDimLevel();
  debugPrint();
}

void zeroCrossDetected() {
  zeroCrossed = true;
  triacCounter = 0;
  digitalWrite(TRIAC_PIN, LOW);
}

void triacTimerInterrupt() {
  if (dimLevel >= MAX_DIM_LEVEL) {
    digitalWrite(TRIAC_PIN, LOW);
  } else if (dimLevel <= MIN_DIM_LEVEL) {
    digitalWrite(TRIAC_PIN, HIGH);
  } else if (zeroCrossed) {
    if (triacCounter >= dimLevel) {
      digitalWrite(TRIAC_PIN, HIGH);
      zeroCrossed = false;
    } else {
      triacCounter++;
    }
  }
}

void adjustDimLevel() {
  if (lightOn && dimLevel > MIN_DIM_LEVEL) dimLevel--;
  else if (!lightOn && dimLevel < MAX_DIM_LEVEL) dimLevel++;
}

void checkAlarmClock() {
  if (!lightOn && isRoomDark()) {
    DateTime now = rtc.now();
    if (now.hour() == 6 && now.minute() == 0) {
      lightOn = true;
    }
  }
}

boolean isRoomDark() {
  return analogRead(LIGHT_SENSOR_PIN) < DARK_THRESHOLD;
}

void debugPrint() {
  Serial.print("lightOn="); Serial.println(lightOn);
  Serial.print("dimLevel="); Serial.println(dimLevel);
  DateTime now = rtc.now();
  Serial.print("datetime=");
  Serial.print(now.year(), DEC); Serial.print('/');
  Serial.print(now.month(), DEC); Serial.print('/');
  Serial.print(now.day(), DEC); Serial.print(' ');
  Serial.print(now.hour(), DEC); Serial.print(':');
  Serial.print(now.minute(), DEC); Serial.print(':');
  Serial.println(now.second(), DEC);
  Serial.print("lightLevel="); Serial.println(analogRead(LIGHT_SENSOR_PIN));
}

회로도

스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기
스마트 선라이즈 알람: 은은한 빛으로 자연스럽게 기상하기

제조공정

  1. 직렬 배터리 연결로 전압 더하기 실험
  2. 전압 분배기 랩: 설계, 측정, 키르히호프 전압 법칙 검증
  3. 열전기: 열전대와 제벡 효과 이해
  4. 전위차계 전압계: 최소 부하로 정밀한 전압 측정
  5. 감자 배터리 만들기: DIY 전기화학 전지 단계별 가이드
  6. 저전압 AC 전원 장치: 위상 시프트 회로 부품 및 모범 사례
  7. 12V 제너 다이오드 전압 레귤레이터 실험
  8. 전압 추종자 증폭기: 설계, 제작 및 측정 가이드
  9. 부정 귀환을 적용한 고이득 다단 공통 이미터 증폭기 설계
  10. 특수 목적 다이오드: 쇼트키, 터널, LED, 레이저, 포토다이오드, 태양전지 혁신