// 라이브러리 포함
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_LSM303.h>
// 감도 조절 (도 단위)
const int sens = 10;
// 센서 고유 ID 부여
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);
void setup(void) {
// 디버깅용 시리얼 (주석 처리됨)
// Serial.begin(9600);
// Serial.println("Starting...");
// 핀 13 설정 (부저 겸용)
pinMode(13, OUTPUT);
// 센서 초기화
if(!mag.begin()) {
// LSM303 감지 실패 시 LED 점멸 후 정지
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
while(1);
}
// 5초 대기 (센서 안정화)
delay(5000);
// 시작 알림 비프
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW);
}
// 방향 각도 읽기 (0-360도)
int getDeg(void) {
sensors_event_t event;
mag.getEvent(&event);
float Pi = 3.14159;
// 자력계 Y, X 성분으로 방위각 계산
float heading = int((atan2(event.magnetic.y, event.magnetic.x) * 180) / Pi);
// 0-360 정규화
if (heading < 0) heading = 360 + heading;
return heading;
}
void loop(void) {
int oldDeg = getDeg();
delay(1000);
int newDeg = getDeg();
// 10도 이상 변화 감지 시 알람
if (newDeg < (oldDeg - sens) && oldDeg != 0 && newDeg != 0) {
digitalWrite(13, HIGH); // 알람 ON
// Serial.println("Triggered");
} else if (newDeg > (oldDeg + sens) && oldDeg != 0 && newDeg != 0) {
digitalWrite(13, HIGH); // 알람 ON
// Serial.println("Triggered");
}
// 디버깅용 출력 (주석 처리됨)
// Serial.print("New:"); Serial.println(newDeg);
// Serial.print("Old:"); Serial.println(oldDeg);
// Serial.println();
}
4단계: 테스트
리셋 버튼 누르면 비프음 → 3초 정적 → 긴 비프음 순으로 울립니다. LSM303 보드를 돌리면 알람이 울려야 합니다. 너무 예민하면 sens 값 증가, 둔하면 감소시키세요.
시작 시 긴 비프 2번이면 배선 문제. 연결 확인하세요. 작동 안 하면 라이브러리 이름 문제일 수 있습니다. #include 줄 지우고 스케치 → 라이브러리 포함에서 'Wire', 'Adafruit LSM303DLHC', 'Adafruit Unified Sensor' 직접 선택해보세요. 강한 자기장 근처면 다른 장소로 이동, 보드가 수평/지면과 평행한지 확인하세요.
5단계: 키(무장/해제 스위치) 추가
9V 배터리를 매번 꽂다 빼는 건 번거로우니 6.35mm 오디오 잭을 키로 활용합니다. 3.5mm 잭은 이어폰 플러그로 해제 가능해 보안상 취약하지만 6.35mm는 전용 플러그 필요로 보안성 향상. 키드 스위치나 리드 스위치+자석, RFID, 스마트폰 앱 등 창의적 대체도 가능.
배터리와 DC 배럴 잭 사이에 스위치/잭을 직렬 연결하세요.
터미널 블록 배럴 잭 사용 시 한 선 잘라 연장선 연결 후 스위치 삽입. 저는 간단히 토글 스위치 사용했지만 원하는 방식 적용하세요.
6단계: 백팩 장착
축하합니다! 이제 완전히 작동하는 키 방식 경보기가 완성되었습니다. 9V 배터리 연결해 백팩에 장착하세요. 부저 구멍과 키홀 구멍 뚫고 케이블 타이나 영구 고정 방식으로 장착. 센서는 지면과 평행하게, 부저 구멍은 막히지 않게 주의.
더 나아가기
이 알람은 백팩뿐 아니라 문, 쿠키 항아리, 냉장고 등 지키고 싶은 모든 것에 적용 가능합니다. 가능성은 무한합니다!
코드
아두이노 코드
// Include Libraries
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_LSM303.h>
// Adjust the sensitivity
const int sens = 10;
// Assign a unique ID to this sensor at the same time
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);
void setup(void) {
pinMode(13, OUTPUT);
if(!mag.begin()) {
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
while(1);
}
delay(5000);
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW);
}
int getDeg(void){
sensors_event_t event;
mag.getEvent(&event);
float Pi = 3.14159;
float heading = int((atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi);
if (heading < 0) { heading = 360 + heading; }
return heading;
}
void loop(void) {
int oldDeg = getDeg();
delay(1000);
int newDeg = getDeg();
if (newDeg < (oldDeg-sens) && oldDeg != 0 && newDeg != 0) {
digitalWrite(13, HIGH);
}else if (newDeg > (oldDeg+sens) && oldDeg!= 0 && newDeg != 0) {
digitalWrite(13, HIGH);
}
}