프로젝트 개요
이번 프로젝트에서는 Arduino Uno와 PIR(Passive Infrared) 모션 센서를 이용하여 방문자를 감지하고 카운트하는 시스템을 제작하였다. PIR 센서는 사람의 움직임에 의해 발생하는 적외선 변화를 감지하는 센서로, 인체가 감지 영역에 들어오면 신호를 출력한다.
방문자가 감지되면 LED가 점등되고 부저를 통해 알림음이 출력되며, LCD에 방문자 수를 표시하도록 구현하였다.
사용 부품
- Arduino Uno
- PIR 모션 센서 2개
- 16×2 LCD
- 가변저항(10KΩ)
- LED
- 220Ω 저항
- 부저
- 브레드보드
- 점퍼선
시스템 동작 원리
본 시스템은 입구와 출구에 각각 PIR 센서를 설치하여 방문자의 이동을 감지한다.
입장 감지
입구 PIR 센서가 사람을 감지하면
- 입장 인원(IN) 증가
- 현재 인원(NOW) 증가
- LED 점등
- 부저를 통해 "엘리제를 위하여" 멜로디 재생
퇴장 감지
출구 PIR 센서가 사람을 감지하면
- 퇴장 인원(OUT) 증가
- 현재 인원(NOW) 감소
- LED 점등
- 부저를 통해 "젓가락 행진곡" 멜로디 재생
LCD 출력 화면
LCD에는 다음과 같이 표시된다.
IN : 15 OUT : 10
NOW : 5
설명
- IN : 총 입장 인원
- OUT : 총 퇴장 인원
- NOW : 현재 실내 인원
PIR 센서 인식 문제 해결
프로젝트 구현 과정에서 PIR 센서가 인식되지 않는 문제가 발생하였다.
원인 1. 예열 시간 부족
PIR 센서는 전원이 인가된 직후 바로 동작하지 않는다.
보통 30초~60초 정도의 예열 시간이 필요하며, 예열이 완료된 후 정상적으로 움직임을 감지할 수 있다.
원인 2. 핀 연결 오류
PIR 센서의 핀 배열은 제조사에 따라 다를 수 있다.
일반적으로
- VCC
- OUT
- GND
순서로 구성되어 있으므로 반드시 센서의 표시를 확인해야 한다.
원인 3. 감도 설정
PIR 모듈에 장착된 가변저항을 이용하여 감도를 조절할 수 있다.
감도를 높이면 보다 먼 거리에서도 사람의 움직임을 감지할 수 있다.
원인 4. 핀 번호 불일치
프로그램에서 설정한 핀 번호와 실제 회로 연결이 일치하지 않을 경우 센서가 동작하지 않는다.
따라서 테스트 코드를 이용하여 센서 출력이 실제 어느 핀으로 연결되어 있는지 확인하는 과정이 필요하다.
개선 아이디어
본 프로젝트는 단순 방문자 카운터를 넘어 스마트 출입 관리 시스템으로 확장할 수 있다.
EEPROM 저장 기능
전원이 꺼져도 방문자 수를 저장
RTC 모듈 추가
입장 및 퇴장 시간 기록
SD 카드 저장
방문자 출입 로그 저장
Wi-Fi 연동
ESP8266 또는 ESP32를 이용한 실시간 모니터링
음성 안내 기능
MP3 모듈을 사용하여
- "환영합니다"
- "안녕히 가세요"
와 같은 음성 출력 가능
만석 경고 기능
설정 인원을 초과하면 LCD에 경고 메시지 출력 및 부저 경고
아두이노를 이용한 적외선(IR) 방문자 카운터 실험입니다. 만약 이와 유사한 수준의 다른 프로젝트를 만들고 싶다면 아래와 같은 프로젝트를 추천할 수 있습니다.
1. 아두이노 적외선 자동문 시스템
프로젝트 개요
IR 센서를 이용하여 사람이 접근하면 자동으로 문이 열리고 일정 시간이 지나면 닫히는 시스템입니다.
사용 부품
- Arduino Uno
- IR 센서 모듈
- 서보모터(SG90)
- LCD 16×2
- 브레드보드
- 점퍼선
동작 원리
- 사람이 IR 센서 앞을 지나감
- 센서가 물체를 감지
- 서보모터가 90도 회전
- LCD에 "Door Open" 표시
- 3초 후 자동으로 닫힘
학습 요소
- 디지털 입력
- 서보모터 제어
- LCD 출력
- 조건문 활용
2. 아두이노 주차장 차량 카운터
프로젝트 개요
주차장 입구에 IR 센서를 설치하여 차량 수를 자동으로 계산하는 시스템입니다.
추가 기능
- 현재 차량 수 표시
- 만차 경고 LED
- 부저 알림
사용 부품
- Arduino Uno
- IR 센서 2개
- LCD
- LED
- 부저
동작 원리
입구 센서는 차량 수를 증가시키고 출구 센서는 차량 수를 감소시킵니다.
3. 스마트 손 소독제 디스펜서
프로젝트 개요
손을 가까이 가져가면 자동으로 소독제가 분사됩니다.
사용 부품
- Arduino Uno
- 적외선 센서
- 워터펌프
- 릴레이 모듈
- LED
동작 과정
- 손 감지
- LED 점등
- 펌프 1초 동작
- 소독제 자동 분사
4. 침입자 감지 경보 시스템
프로젝트 개요
방문자 카운터와 거의 동일한 회로를 사용하지만 사람을 감지하면 경고음을 발생시키는 보안 시스템입니다.
사용 부품
- Arduino Uno
- IR 센서
- 부저
- LED
- LCD
동작 원리
사람 감지
↓
LED ON
↓
부저 울림
↓
LCD에 경고 표시
5. 스마트 교실 출입 인원 관리 시스템
프로젝트 개요
현재 실내 인원을 자동 계산하는 시스템입니다.
기능
- 입장 시 +1
- 퇴장 시 -1
- LCD 표시
- 정원 초과 경고
사용 부품
- Arduino Uno
- IR 센서 2개
- LCD
- LED
- 부저
활용 분야
- 학교 교실
- 독서실
- 회의실
- 스터디카페
방문자 카운터보다 한 단계 발전된 프로젝트
가장 교육 효과가 좋은 프로젝트는 "양방향 방문자 카운터" 입니다.
기존 프로젝트
사람 통과
↓
+1
개선 프로젝트
입장 센서
↓
+1
출구 센서
↓
-1
이 방식은 실제 건물 출입 관리 시스템과 동일한 원리로 동작하며, 센서 2개의 순서를 이용해 입장과 퇴장을 구분할 수 있습니다.
추가 기능
- 현재 인원 표시
- 최대 인원 설정
- 만석 경고
- 데이터 저장
- PC 연동
이 프로젝트는 학교 수행평가, 캡스톤 디자인, 아두이노 실습 과제로도 활용도가 높습니다.

회로를 보면 다음과 같이 구성된 것으로 보입니다.
- PIR 센서 2개 (입구/출구)
- LCD 16x2
- 부저
- LED
- 가변저항(LCD 밝기 조절)
- Arduino Uno
따라서 사용자가 원한 기능인
- 입장 수(IN)
- 퇴장 수(OUT)
- 현재 인원(NOW)
- 입장 시 "엘리제를 위하여"
- 퇴장 시 "젓가락 행진곡"
- LED 점등
을 구현할 수 있습니다.
다만 사진만으로는 PIR 센서가 정확히 몇 번 핀에 연결되었는지 100% 확인이 어렵습니다.
현재 회로를 기준으로 아래처럼 가정하겠습니다.
입구 PIR → D7
출구 PIR → D6
LED → D8
부저 → D9
LCD
RS → 12
E → 11
D4 → 5
D5 → 4
D6 → 3
D7 → 2
전체 소스:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define PIR_IN 7
#define PIR_OUT 6
#define LED_PIN 8
#define BUZZER 9
int inCount = 0;
int outCount = 0;
int nowCount = 0;
bool inFlag = false;
bool outFlag = false;
// 엘리제를 위하여
int furElise[]={
659,622,659,622,659,494,587,523,440
};
// 젓가락 행진곡
int chopsticks[]={
523,587,659,523,587,659,523,587,659
};
void playEnter()
{
for(int i=0;i<9;i++)
{
tone(BUZZER,furElise[i],200);
delay(250);
}
noTone(BUZZER);
}
void playExit()
{
for(int i=0;i<9;i++)
{
tone(BUZZER,chopsticks[i],200);
delay(250);
}
noTone(BUZZER);
}
void updateLCD()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IN:");
lcd.print(inCount);
lcd.print(" OUT:");
lcd.print(outCount);
lcd.setCursor(0,1);
lcd.print("NOW:");
lcd.print(nowCount);
}
void setup()
{
pinMode(PIR_IN,INPUT);
pinMode(PIR_OUT,INPUT);
pinMode(LED_PIN,OUTPUT);
pinMode(BUZZER,OUTPUT);
lcd.begin(16,2);
updateLCD();
}
void loop()
{
int inSensor=digitalRead(PIR_IN);
int outSensor=digitalRead(PIR_OUT);
// 입장
if(inSensor==HIGH && !inFlag)
{
inFlag=true;
inCount++;
nowCount++;
digitalWrite(LED_PIN,HIGH);
updateLCD();
playEnter();
delay(1000);
digitalWrite(LED_PIN,LOW);
}
if(inSensor==LOW)
{
inFlag=false;
}
// 퇴장
if(outSensor==HIGH && !outFlag)
{
outFlag=true;
outCount++;
if(nowCount>0)
nowCount--;
digitalWrite(LED_PIN,HIGH);
updateLCD();
playExit();
delay(1000);
digitalWrite(LED_PIN,LOW);
}
if(outSensor==LOW)
{
outFlag=false;
}
}
추가로 전시회/과학전람회 수준으로 업그레이드하려면:
- EEPROM 저장 → 전원 꺼져도 카운트 유지
- RTC 모듈 → 입·퇴장 시간 기록
- 만석 경고 기능
- OLED 그래프 표시
- SD카드 출입 로그 저장
- ESP8266 Wi-Fi 연동 → 스마트폰 실시간 확인
- 음성 출력 모듈(MP3) → "환영합니다", "안녕히 가세요"
를 넣으면 완성도가 크게 올라갑니다.
1. PIR 센서 예열 시간 확인
HC-SR501 같은 PIR 센서는 전원을 넣고 바로 동작하지 않습니다.
전원 인가 후 30초~60초 대기
해야 정상 동작합니다.
2. PIR 출력 상태 확인
먼저 LCD, 부저, LED를 모두 제거하고 아래 테스트 코드만 업로드해 보세요.
#define PIR_PIN 7
void setup()
{
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
}
void loop()
{
Serial.println(digitalRead(PIR_PIN));
delay(200);
}
시리얼 모니터(9600bps)를 열고 확인합니다.
정상이라면
0
0
0
1
1
1
0
0
처럼 움직일 때 1이 출력됩니다.
3. 회로 확인
사진의 PIR 모듈 핀은 일반적으로
VCC OUT GND
또는
OUT VCC GND
순서가 제조사마다 다릅니다.
모듈 뒷면의 실크 인쇄를 확인하세요.
잘못 연결하면 항상 0만 나옵니다.
4. 감도 조절
사진 속 PIR에는 가변저항이 있습니다.
- Sensitivity (감도)
- Time Delay (유지시간)
감도를 시계방향으로 끝까지 돌려보세요.
5. INPUT_PULLUP 사용
일부 PIR 모듈은 출력이 불안정합니다.
pinMode(PIR_PIN, INPUT_PULLUP);
로 변경 후 테스트해 보세요.
출력 판정도 반대로 됩니다.
if(digitalRead(PIR_PIN)==LOW)
{
// 감지
}
6. 가장 흔한 원인
올려주신 회로를 보면 PIR 센서가 2개입니다.
현재 코드에서는
#define PIR_IN 7
#define PIR_OUT 6
로 가정했는데 실제 배선이 다를 가능성이 큽니다.
Arduino 상단 디지털 핀을 보면 사진상으로는 한 PIR이 D7이 아니라 D10 또는 D11 쪽에 연결된 것처럼 보입니다.
7. 핀 찾는 방법
아래 코드를 사용합니다.
void setup()
{
Serial.begin(9600);
}
void loop()
{
for(int i=2;i<=13;i++)
{
Serial.print("D");
Serial.print(i);
Serial.print(":");
Serial.print(digitalRead(i));
Serial.print(" ");
}
Serial.println();
delay(500);
}
움직여 보면서
D7:1
또는
D10:1
처럼 변하는 핀을 확인하면 실제 PIR 연결 핀을 알 수 있습니다.
현재 증상이
- LED도 안 켜짐
- 시리얼에 변화 없음
- 항상 HIGH
- 항상 LOW
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define PIR_IN 10
#define PIR_OUT 7
#define LED_PIN 9
#define BUZZER 8
int inCount = 0;
int outCount = 0;
int nowCount = 0;
bool inFlag = false;
bool outFlag = false;
// 엘리제를 위하여
int furElise[]={
659,622,659,622,659,494,587,523,440
};
// 젓가락 행진곡
int chopsticks[]={
523,587,659,523,587,659,523,587,659
};
void playEnter()
{
for(int i=0;i<9;i++)
{
tone(BUZZER,furElise[i],200);
delay(250);
}
noTone(BUZZER);
}
void playExit()
{
for(int i=0;i<9;i++)
{
tone(BUZZER,chopsticks[i],200);
delay(250);
}
noTone(BUZZER);
}
void updateLCD()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IN:");
lcd.print(inCount);
lcd.print(" OUT:");
lcd.print(outCount);
lcd.setCursor(0,1);
lcd.print("NOW:");
lcd.print(nowCount);
}
void setup()
{
pinMode(PIR_IN,INPUT);
pinMode(PIR_OUT,INPUT);
pinMode(LED_PIN,OUTPUT);
pinMode(BUZZER,OUTPUT);
lcd.begin(16,2);
updateLCD();
}
void loop()
{
int inSensor=digitalRead(PIR_IN);
int outSensor=digitalRead(PIR_OUT);
// 입장
if(inSensor==HIGH && !inFlag)
{
inFlag=true;
inCount++;
nowCount++;
digitalWrite(LED_PIN,HIGH);
updateLCD();
playEnter();
delay(1000);
digitalWrite(LED_PIN,LOW);
}
if(inSensor==LOW)
{
inFlag=false;
}
// 퇴장
if(outSensor==HIGH && !outFlag)
{
outFlag=true;
outCount++;
if(nowCount>0)
nowCount--;
digitalWrite(LED_PIN,HIGH);
updateLCD();
playExit();
delay(1000);
digitalWrite(LED_PIN,LOW);
}
if(outSensor==LOW)
{
outFlag=false;
}
}
동작을 시켜 보시면 됩니다.
결론
Arduino Uno와 PIR 센서를 활용하여 방문자 카운터를 구현할 수 있으며, LCD와 부저를 추가함으로써 사용자에게 실시간 정보를 제공할 수 있다. 또한 입장과 퇴장을 구분하여 현재 인원을 계산할 수 있어 학교, 도서관, 회의실, 사무실 등의 출입 관리 시스템으로 활용 가능하다.
본 프로젝트를 통해 센서 인터페이스, LCD 제어, 부저 제어, 인원 카운팅 알고리즘 등 다양한 임베디드 시스템 기술을 학습할 수 있었다.
'아두이노' 카테고리의 다른 글
| 아두이노로 구현하는 T-rex Run 게임 🎮 (0) | 2026.06.20 |
|---|---|
| 아두이노 메가 계산기 프로젝트 구현하기 (0) | 2026.06.20 |
| 아두이노 방문자 카운터 프로젝트 (입장/퇴장 + 멜로디 알림) (0) | 2026.06.18 |
| LED 피아노 만들기 (노트 표시 디스플레이 포함) (0) | 2026.06.11 |
| 아두이노 UNO로 만드는 LCD 알람 시계 (0) | 2026.06.02 |