스마트 모션 감지 알람 클락: 확실히 일어나기
부품 및 소모품
| Arduino Nano Every | × | 1 |
| 클락 모듈 (DS3231) | × | 1 |
| HC-SR501 PIR 모션 센서 | × | 1 |
| 부저 | × | 1 |
앱 및 온라인 서비스
프로젝트 소개
아침에 일어나기란 진짜 도전입니다. 이 모션 감지 알람 클락은 스누즈 버튼을 누른 후 움직임을 감지해 당신이 계속 깨어있도록 합니다. 다시 침대로 돌아가면 알람이 리셋되어, 알람이 멈추기 전까지 설정된 시간 동안 깨어있게 만듭니다.
조립
다음 부품을 준비하세요:
- DS3231 실시간 클락 모듈
- HC-SR501 PIR 모션 센서
- 부저 (5V 피에조 타입)
- 모멘터리 푸시 버튼
- Arduino Nano Every (또는 호환 보드)
다음과 같이 배선하세요:
- 부저 음극 → GND
- 부저 양극 → D11
- 버튼 그라운드 → GND
- 버튼 신호 → D9
- HC-SR501 VCC → 5V
- HC-SR501 출력 → D7
- HC-SR501 GND → GND
- DS3231 GND → GND
- DS3231 VCC → 5V
- DS3231 SDA → SDA (나노 A4 핀)
- DS3231 SCL → SCL (나노 A5 핀)
코드
코드 섹션에서 DS3231 라이브러리 ZIP을 다운로드해 아두이노 IDE의 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가로 설치하세요.
다음 스케치를 업로드하세요. 최초 업로드 후 날짜/시간 설정 라인을 주석 처리해야 리셋 시 RTC가 정확한 시간을 유지합니다.
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
int button = 9;
int pirPin = 7; // HC-SR501 입력
int pirValue;
// 알람 설정 시간
int set_hour = 7;
int set_minute = 0;
void setup() {
clock.begin();
pinMode(button, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
// clock.setDateTime(__DATE__, __TIME__); // 최초 업로드 후 주석 처리!
pinMode(pirPin, INPUT);
}
void alarm(int minute) {
bool button_pressed = false;
bool awake = false;
bool movement = false;
// 버튼이 눌릴 때까지 알람 울림
while (!button_pressed) {
for (int i = 0; i < 4; i++) {
tone(11, 523, 100); delay(100);
tone(11, 784, 50);
for (int i = 0; i < 20; i++) {
if (digitalRead(button) == LOW) {
button_pressed = true;
awake = true;
dt = clock.getDateTime();
minute = dt.minute;
}
delay(65);
}
}
}
dt = clock.getDateTime();
minute = dt.minute;
// 깨어있는 상태 유지 확인
while (awake) {
movement = false;
dt = clock.getDateTime();
for (int i = 0; i < 30; i++) {
if (digitalRead(pirPin)) movement = true;
}
digitalWrite(LED_BUILTIN, movement);
if (!pirValue) {
delay(5000);
for (int i = 0; i < 40; i++) {
if (digitalRead(pirPin)) movement = true;
}
if (!movement) alarm(minute); // 움직임 없으면 알람 재시작
}
if (abs(dt.minute - minute) >= 1) { // 센서 앞 유지 시간 설정
tone(11, 698, 50); delay(100);
tone(11, 698, 50);
digitalWrite(LED_BUILTIN, 0);
awake = false;
}
delay(100);
}
}
void loop() {
dt = clock.getDateTime();
if (set_minute == dt.minute && set_hour == dt.hour) {
alarm(set_minute);
}
delay(10000);
}
센서 조정
HC-SR501의 트리거 선택 점퍼를 반복 트리거 모드로 설정하세요.
지연과 감도를 미세 조정하세요. 최대 감도에 최소 지연이 최적입니다: 당신이 감지될 만큼 충분히 오래 활성화되지만, 다시 침대로 돌아가면 무시하지 않을 정도입니다.
컴팩트 제작
브레드보드 프로토타입 테스트 후, 부품을 아두이노 나노 에브리에 직접 납땜해 주머니 크기 알람을 만듭니다.
3mm 발사나무로 경량 케이스 제작 (55mm × 35mm × 40mm). PIR 센서용 큰 개구부, 마이크로 USB 케이블 슬롯, 부저용 구멍이 포함됩니다.
완성품:
코드
- 알람 클락 아두이노 코드
- 클락 라이브러리 (DS3231)
알람 클락 아두이노 코드
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
int button = 9;
int pirPin = 7;
int pirValue;
int set_hour = 7;
int set_minute = 0;
void setup() {
clock.begin();
pinMode(button, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
// clock.setDateTime(__DATE__, __TIME__); // 최초 업로드 후 반드시 주석 처리!
pinMode(pirPin, INPUT);
}
void alarm(int minute) {
bool button_pressed = false, awake = false, movement = false;
while (!button_pressed) {
for (int i = 0; i < 4; i++) {
tone(11, 523, 100); delay(100);
tone(11, 784, 50);
for (int i = 0; i < 20; i++) {
if (digitalRead(button) == LOW) {
button_pressed = true; awake = true;
dt = clock.getDateTime(); minute = dt.minute;
}
delay(65);
}
}
}
dt = clock.getDateTime(); minute = dt.minute;
while (awake) {
movement = false; dt = clock.getDateTime();
for (int i = 0; i < 30; i++) if (digitalRead(pirPin)) movement = true;
digitalWrite(LED_BUILTIN, movement);
if (!pirValue) {
delay(5000);
for (int i = 0; i < 40; i++) if (digitalRead(pirPin)) movement = true;
if (!movement) alarm(minute);
}
if (abs(dt.minute - minute) >= 1) {
tone(11, 698, 50); delay(100); tone(11, 698, 50);
digitalWrite(LED_BUILTIN, 0); awake = false;
}
delay(100);
}
}
void loop() {
dt = clock.getDateTime();
if (set_minute == dt.minute && set_hour == dt.hour) alarm(set_minute);
delay(10000);
}
클락 라이브러리 (DS3231)
DS3231 라이브러리 ZIP 파일입니다. 다운로드 후 아두이노 → 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가로 설치하세요. 미리보기 불가 (다운로드만 가능).
회로도
아두이노 5V를 브레드보드 양극 레일에, GND를 음극 레일에 연결하세요.