PIR 센서로 만드는 화장실 인체감지등
아두이노 기반 자동 조명 제어
사람이 들어오면 알아서 켜지고,
나가면 알아서 꺼지는 전등을
2번의 수업 동안 직접 만듭니다.
완성품은 집 화장실에 실제로 달아 씁니다.
| 5V | 센서 전원 |
| GND | 센서 접지 |
| D2 | 센서 신호 읽기 |
| D13 | 보드에 붙은 L LED |
const int PIR_PIN = 2; // 센서를 꽂은 핀 void setup() { // 켜질 때 한 번 pinMode(PIR_PIN, INPUT); Serial.begin(9600); // 컴퓨터와 대화 시작 } void loop() { // 그 뒤로 계속 반복 int state = digitalRead(PIR_PIN); // 1 or 0 Serial.println(state); // 화면에 보여 주기 delay(50); // 0.05초 쉬기 }
| PIR 핀 | 점퍼선 | 아두이노 |
|---|---|---|
| VCC | 주황 | 5V |
| OUT | 빨강 | D2 |
| GND | 갈색 | GND |
| 실험 | 방법 | 기록 |
|---|---|---|
| 감지 거리 | 1 m씩 물러나며 손 흔들기 | ___ m까지 |
| 감지 각도 | 센서 옆쪽에서 접근 | 좌 ___° 우 ___° |
| 느린 움직임 | 천천히 걷기 vs 빨리 | 느릴 때 감지 ○/× |
| 유지 시간 | 1이 된 뒤 몇 초 만에 0으로 | ___ 초 |
진짜 조명(네오픽셀 링)을 붙이고,
움직임이 멈추면 30초 뒤 저절로 꺼지게,
손잡이로 밝기를 조절하게 만듭니다.
부품은 오늘 배선 그대로 두고 보관하세요.
네오픽셀 링 · 30초 자동 꺼짐 · 손잡이로 밝기 조절
움직임 있음 → 1
움직임 없음 → 0
하지만 실제 전등이 센서 값을 그대로 따라 하면?
화장실에 앉아 가만히 있는 순간 불이 꺼집니다.
// millis() = 켜진 뒤 지난 시간 (밀리초) if (digitalRead(PIR_PIN) == HIGH) { lastMotion = millis(); // 지금 시각 기억 lightOn = true; } if (millis() - lastMotion >= 30000) { lightOn = false; // 30초 지났으면 끔 }
int raw = analogRead(A0); // 0~1023 int b = map(raw, 0, 1023, 5, 120); // 5~120 strip.setBrightness(b);
| 부품 | 선 | 우노 핀 |
|---|---|---|
| 네오픽셀 | 빨강 | 5V |
| 검정 | GND | |
| 초록 (DI) | D6 | |
| PIR | 주황 (VCC) | 5V (두 번째) |
| 갈색 (GND) | GND | |
| 빨강 (OUT) | D2 | |
| 가변저항 | 초록 (VCC) | 5V 여분 핀 |
| 노랑 (GND) | GND 여분 핀 | |
| 파랑 (OUT) | A0 |
스케치 › 라이브러리 포함 › 라이브러리 관리
→ Adafruit NeoPixel 검색 → 설치
// 1) 손잡이 → 밝기 int nb = map(analogRead(POT_PIN), 0,1023, 5,120); if (abs(nb - brightness) >= 3) { brightness = nb; ... } // 2) 움직임 → 시각 기억 + 켜기 if (digitalRead(PIR_PIN) == HIGH) { lastMotion = millis(); if (!lightOn) { lightOn = true; applyLight(); } } // 3) 30초 지났으면 끄기 if (lightOn && millis() - lastMotion >= HOLD_MS) { lightOn = false; applyLight(); }
| HOLD_MS | 유지 시간. 30000 = 30초 |
| BRIGHT_MAX | 손잡이 최대 밝기 (≤120) |
| COLOR_R/G/B | 색. 255,255,200 = 따뜻한 흰색 |
시리얼 모니터(9600)를 열면 1초마다
remain 25 s brightness 64 처럼 보입니다.
| HOLD_MS | 느낌 |
|---|---|
| 5000 | 앉아 있으면 금방 꺼짐 — 불편 |
| 30000 | 보통 화장실 사용에 적당 |
| 120000 | 편하지만 나간 뒤에도 오래 켜짐 — 전기 낭비 |
편의 ↔ 절전, 우리 집엔 몇 초가 맞을까?
밝기는 손잡이로 눈부시지 않은 지점을 찾고, 그 위치를 그대로 둔 채 설치.
문 쪽? 변기 쪽? 높이는? — 1차시 감지 각도 실험 결과를 떠올려 보세요.
| 증상 | 원인 | 해결 |
|---|---|---|
| 링이 전혀 안 켜짐 | DO 쪽에 선 연결 / D6 아님 / 라이브러리 없음 | DI 확인, 핀 번호, Adafruit NeoPixel 설치 |
| 켜지자마자 보드가 꺼졌다 켜짐 | 밝기 과다 → 전류 초과 | 손잡이 낮추기, BRIGHT_MAX 줄이기 |
| 계속 켜져 있음 | PIR Tx 손잡이가 길게 / 가까이서 계속 감지 | Tx 반시계 끝, 센서 방향 바꾸기 |
| 카운트다운이 중간에 처음으로 | 시리얼 모니터 열 때 자동 리셋 | 정상. 기다리면 됨 |
| 손잡이 방향이 반대 | map() 범위 방향 | map(raw, 1023, 0, …) |
| 포트가 안 보임 | USB 접촉 / 드라이버 | 다시 꽂기, CH340 드라이버 |
1 → 💡
센서의 1과 0을
규칙(30초, 밝기)을 거쳐
진짜 빛으로 바꿨습니다.
입력 → 판단 → 출력. 이 뼈대는 스마트홈 기기 대부분이 똑같습니다.