ㅇ 일 자 : 2026년 6월 2일(화)
ㅇ 실습 과제 : Arduino & AI를 응용한 "프로그램 기획서" 작성
ㅇ 주 제
파이썬 GUI 프로그램 및 데이터베이스 설치, 파이썬 GUI, MySQL 데이터베이스, 리눅스 지식을 갖춘 개발자들을 위한 2일내
완성 아두이노 연동 토이 프로젝트 기획안을 작성해 보고 프로그램도 구현해 보기
1. 프로젝트 명 : IoT 무인 매장 보안 및 방문객 관리 시스템
1.1. 시스템 구조 이해하기 (아두이노 - 통신 - 리눅스 - 사용자 인터페이스)

☆ 프로그램 개발 기획서 * 자료 별첨 및 시각화 *
1. 프로젝트 개요
1.1 프로젝트 배경 및 목적
최근 무인 매장의 급격한 증가로 인해 절도, 기물 파손, 주취자 소란 등의 보안 사고가 급증하고 있다. 상주 직원이 없는 무인 매장의 특성상, 실시간 위험 감지와 즉각적인 현장 제어 시스템의 부재는 큰 경제적 손실과 치안 공백을 야기한다.
실제로 무인아이스크림 매장에 들렀다가 앞에 고객이 스캔하는 척만 하고 그냥 가버려서 취소해도 다음 결재 진행이 안되는 상황을 목격한 적이 있다. 본 프로젝트는 이러한 한계를 극복하기 위해 아두이노 센서 네트워크, 리눅스 중앙 서버, MySQL 데이터베이스, 파이썬 GUI 관제 프로그램을 유기적으로 연동하여, '매장 상태 실시간 시각화'와 '원격 현장 제어'가 동시에 가능한 지능형 'IoT 무인 매장 보안 및 방문객 관리 시스템'을 구축하는 것을 목적으로 한다.
1.2 프로젝트 개발 범위
• 하드웨어 : 무인 매장 4대 구역(식품, 의류, 가구, 잡화)의 사람 움직임(PIR) 및 소음 레벨(사운드 센서) 데이터 수집, 경보(부저) 및 개폐(서보 모터) 구동 제어
• 미들웨어 / 인프라 : 리눅스 OS 기반 소켓 통신 서버 구축, 보안 로그 파일 관리 및 MySQL 데이터베이스 설계/운영
• 소프트웨어(GUI) : PyQt/Tkinter 기반 실시간 대시보드 화면 구현, 통계 데이터 시각화(그래프), 임계치 초과 시 경고 알림 팝업 및 원격 제어 인터페이스 제공
1.3 기대 효과
• 보안 효율성 극대화 : 다수의 분산된 무인 매장을 단일 관제 화면에서 효율적으로 모니터링 가능
• 즉각적인 초동 조치 : 위급 상황 발생 시 원격 제어를 통해 매장 잠금 및 경보를 작동시켜 2차 피해 방지
• 마케팅 활용: 매장 구역별 실시간/시간대별 방문객 통계 데이터를 분석하여 매장 운영 및 마케팅 전략에 활용
2. 추진 일정 및 인력 관리 Plan * 자료 별첨, 시각화 *
2.1 개발 일정 (2일 완성 타임라인)
본 프로젝트는 기존 보유 역량(Python, DB, Linux)을 기반으로 2일간 단기 집중형(Toy Project)으로 진행된다.
[1일 차: 하드웨어 빌드 및 데이터 연동]
• 오전 (09:00 ~ 12:00): 아두이노 센서 회로 구성 및 데이터 수집 시리얼 통신 테스트
• 오후 (13:00 ~ 16:00): Linux 환경에 MySQL 서버 구축 및 DB 테이블 설계
• 야간 (16:00 ~ 18:00): Python 시리얼 통신 연동 및 실시간 데이터 DB 저장 구현
[2일 차: GUI 개발 및 시스템 통합]
• 오전 (09:00 ~ 12:00): Python GUI 화면 레이아웃 및 실시간 그래프 시각화 구현
• 오후 (13:00 ~ 16:00): GUI 제어 명령의 리눅스 서버 경유 및 아두이노 액추에이터 원격 제어 구현
• 야간 (16:00 ~ 18:00): 전체 시나리오 테스트, 예외 처리 및 최종 프로젝트 디버깅
2.2 조직 구성 및 R&R (역할 분담)
팀원은 PM을 포함하여 총 5명으로 구성되며, 각 파트별 역할과 1, 2일 차 상세 To-Do 업무는 다음과 같다.
팀원 구분주요 역할1일 차 To-Do (인프라 및 단품 개발)2일 차 To-Do (시스템 통합 및 검증)
| 팀원 구분 | 주요 역할 | 1일차 (To-Do 인프라 및 단품개발) | 2일차 (To-Do 시스템 통합 및 검증) |
| PM | 일정 관리 및 데이터 흐름 조율 | • 연동 규격서(JSON) 배포 및 싱크 조정 • 1일 차 데이터 DB 적재 교차 검증 | • 데이터 엔드 투 엔드 흐름 모니터링 • 통합 테스트 및 최종 시연 주도 |
| 아두이노 개발자 | 센서 수집 및 펌웨어 개발 | • PIR/사운드 센서 회로 구성 및 테스트 • 1초 주기 JSON 데이터 시리얼 출력 | • 수신 JSON 제어 명령 파싱 로직 구현 • 부저 및 서보 모터 구동 통합 |
| GUI 개발자 | U/I 화면 및 시각화 개발 | • PyQt/Tkinter 기본 윈도우 구축 • 더미 데이터 기반 UI 레이아웃 구현 | • 실시간 꺾은선 그래프 시각화 구현 • 위험 팝업창 및 제어 버튼 이벤트 연동 |
| DB 엔지니어 | 데이터 모델링 및 쿼리 최적화 | • 리눅스 내 MySQL 실행 및 DDL 수행 • 외부 접근 권한 및 방화벽 설정 | • GUI용 실시간 로그 조회 쿼리 최적화 • 조치 상태(action_taken) 업데이트 쿼리 작성 |
| 시스템 엔지니어 | 리눅스 인프라 및 소켓 서버 구축 | • 리눅스 개발 서버 환경 구성 (IP 고정) • GUI-서버 간 소켓 통신 환경 테스트 | • 소켓-시리얼 제어 명령 중계 스크립트 완성 • 예외 로그 자동화 스크립트 작성 |
3. 시스템 아키텍처 및 하드웨어 구성
3.1 하드웨어 부품 구성 및 선정 이유
단기간 내 가시적인 연동 성과를 낼 수 있고 무인 매장 시나리오에 적합한 가성비 높은 부품을 선정한다.
• PIR 인체감지 센서 (HC-SR501): 매장 내 방문객 출입 및 움직임 감지용 (출입 인원 카운팅)
• 사운드 감지 센서 (LM393 등): 매장 내 비명, 유리가 깨지는 등 소란 행위 및 위험 소음 감지용
• 피에조 부저 (Piezo Buzzer): 위험 상황 발생 시 GUI 및 리눅스 원격 명령으로 현장 경보음 발생용
• 서보 모터 (SG90): GUI에서 출입문 잠금/해제 버튼 클릭 시 원격 도어락 개폐 연출용
3.2 시스템 파일 디렉터리 구조
형상관리(Git) 시 팀원 간 소스코드 충돌을 방지하기 위해 역할을 기준으로 디렉터리를 격리 설계한다.
| unattended-store-security/ ├── arduino/ │ └── store_security_node/ │ └── store_security_node.ino # 아두이노 센서/액추에이터 제어 펌웨어 ├── database/ │ ├── ddl.sql # 데이터베이스 테이블 생성 스크립트 │ └── sample_data.sql # 테스트용 초기 더미 데이터 스크립트 ├── linux_server/ │ ├── socket_server.py # GUI 명령 수신 및 아두이노 중계 소켓 서버 │ └── logger.sh # 시스템 예외 로그 관리 쉘 스크립트 └── python_gui/ ├── main.py # GUI 프로그램 실행 메인 엔트리 ├── config.py # DB 접속 정보 및 소켓 포트 설정 ├── ui/ │ └── main_window.py # UI 레이아웃 및 위젯 배치 소스 └── database/ └── db_handler.py # MySQL Connection 및 CRUD 처리 클래스 |
4. 데이터베이스 및 통신 규격 설계
4.1 데이터베이스 스키마 정의 (MySQL DDL)
매장 구분(식품, 의류, 가구, 잡화)을 마스터 테이블로 분리하고, 일자별 출입 로그 및 보안 이벤트를 관계형으로 설계하여 데이터 정규화를 달성한다.
sql
CREATE DATABASE IF NOT EXISTS unattended_store_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE unattended_store_db;
-- 1. 매장 구분 마스터 테이블
CREATE TABLE IF NOT EXISTS stores (
store_id INT AUTO_INCREMENT PRIMARY KEY,
store_name VARCHAR(50) NOT NULL UNIQUE, -- '식품매장', '의류매장' 등
congestion_limit INT NOT NULL DEFAULT 20 -- 혼잡판단 임계 인원
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 방문객 출입 로그 테이블 (매장 ID 외래키 연동)
CREATE TABLE IF NOT EXISTS visitor_logs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
store_id INT NOT NULL,
detected_at DATETIME DEFAULT CURRENT_TIMESTAMP,
visitor_count INT NOT NULL DEFAULT 1, -- 실시간 인원 변동값 (+1/-1)
status VARCHAR(20) NOT NULL, -- 'NORMAL'(원활), 'CROWDED'(혼잡)
FOREIGN KEY (store_id) REFERENCES stores(store_id) ON DELETE CASCADE,
INDEX idx_detected_at (detected_at),
INDEX idx_store_id (store_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 3. 보안 및 위험 상황 이벤트 테이블
CREATE TABLE IF NOT EXISTS security_events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
store_id INT NULL,
event_at DATETIME DEFAULT CURRENT_TIMESTAMP,
event_type VARCHAR(30) NOT NULL, -- 'SOUND_ALERT', 'FORCED_ENTRY'
sound_level INT NULL, -- 감지된 소음 데시벨 값
action_taken VARCHAR(20) DEFAULT 'PENDING', -- 'PENDING', 'BUZZER_ON', 'DOOR_LOCKED'
FOREIGN KEY (store_id) REFERENCES stores(store_id) ON DELETE SET NULL,
INDEX idx_event_at (event_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 초기 마스터 데이터 삽입
INSERT INTO stores (store_name, congestion_limit) VALUES
('식품매장', 15), ('의류매장', 10), ('가구매장', 5), ('잡화매장', 20);
4.2 매장 구분이 포함된 JSON 통신 규격 (Protocol)
① 아두이노 ➔ 파이썬 (센서 데이터 송신)
• 식품매장(ID: 1) 방문객 감지: {"type": "VISITOR", "store_id": 1, "store_name": "GROCERY", "motion": 1, "sound": 40}
• 잡화매장(ID: 4) 위험소음감지: {"type": "SECURITY", "store_id": 4, "store_name": "GENERAL", "motion": 1, "sound": 88}
② 파이썬 ➔ 아두이노 (원격 액추에이터 제어 수신)
• 잡화매장(ID: 4) 경보 부저 작동 명령: {"command": "BUZZER", "store_id": 4, "value": "ON"}
• 식품매장(ID: 1) 출입문 강제 잠금 명령: {"command": "DOOR", "store_id": 1, "value": "LOCK"}
5. 사용자 인터페이스 (GUI Layout)
파이썬 GUI 화면은 관리자의 즉각적인 모니터링과 제어가 가능하도록 좌측(모니터링)과 우측(현황/원격 제어) 레이아웃으로 2분할 설계한다.
============================================================================
[상태바] 🔴 시스템 상태: 위험 (보안 경고 발생!) | 🕒 현재 시간: 2026-06-02 16:19:00
============================================================================
(좌측) 📊 실시간 매장 모니터링 영역 | (우측) 🏬 매장별 현황 및 원격 제어 영역
------------------------------------------------|---------------------------------------
| [🏬 매장별 실시간 방문객 세부 내역]
[📈 실시간 총 방문객 추이 그래프] | -------------------------------------
+------------------------------------------+ | 🍎 식품매장 : [ 12 명 ] 🟢 원활
| (차트) | | 👕 의류매장 : [ 8 명 ] 🟢 원활
+------------------------------------------+ | 🛋️ 가구매장 : [ 3 명 ] 🟢 쾌적
| 🧸 잡화매장 : [ 25 명 ] 🟡 혼잡
[📉 실시간 매장 소음도 그래프] | -------------------------------------
+------------------------------------------+ | [🚨 실시간 보안 경고 알림]
| (차트) | | -------------------------------------
+------------------------------------------+ | ⚠️ [16:12:45] 잡화매장 사운드 센서 임계치 초과!
| -------------------------------------
| [🔒 출입문 및 경보기 원격 제어]
| 🚪 출입문 상태: [🔓 열림]
| [ 강제 원격 잠금 ] [ 원격 잠금 해제 ]
| 🚨 경보기 상태: [🔇 대기]
| [ 사이렌 강제 구동 ] [ 사이렌 끄기 ]
------------------------------------------------|---------------------------------------
(하단) 📜 최근 보안 이벤트 로그 (DB 연동 실시간 출력 테이블)
+-----------------------+-----------------------+-----------------------+-------------+
| 이벤트 시간 | 유형 | 수치 | 조치 상태 |
+-----------------------+-----------------------+-----------------------+-------------+
| 2026-06-02 16:12:45 | SOUND_ALERT | 85 dB | PENDING |
| 2026-06-02 15:30:12 | VISITOR | 잡화매장 감지 | NORMAL |
+-----------------------+-----------------------+-----------------------+-------------+
6. 최종 통합 테스트 및 검증 시나리오
개발 완료 시점(2일 차 16:00 이후) 시스템의 End-to-End 동작 신뢰성을 검증하기 위한 3단계 통합 시나리오 프로세스이다.
| • Step 1: 정상 방문객 출입 상황 검증 ◦ 시연 행동: 시연자가 식품매장 구역(PIR 센서)에 움직임을 발생시킨다. ◦ 검증 기준: GUI 우측 식품매장 실시간 인원이 즉시 1명 증가하고, 좌측 총 방문객 추이 그래프가 실시간 우상향하는지 확인한다. • Step 2: 매장 내 위급 상황 발생 검증 ◦ 시연 행동: 잡화매장 사운드 센서에 큰 소음(85dB 이상)을 노출시킨다. ◦ 검증 기준: 상단 상태바가 위험(Red) 상태로 즉시 변경되고, 우측 알림창에 빨간색 경고 메시지가 팝업되며, 하단 DB 로그 테이블에 PENDING 상태의 이벤트 행이 실시간 한 줄 추가되는지 확인한다. • Step 3: 관리자 원격 제어 및 상황 종료 검증 ◦ 시연 행동: GUI 개발자가 화면 우측의 [강제 원격 잠금] 및 [사이렌 강제 구동] 버튼을 마우스로 클릭한다. ◦ 검증 기준: 리눅스 소켓 서버를 거쳐 명령이 전송되어 아두이노의 피에조 부저에서 경보음이 울리고, 서보 모터가 90도 회전하여 도어락이 작동하는지 확인한다 최종적으로 하단 테이블의 조치 상태 컬럼이 BUZZER_ON / DOOR_LOCKED로 자동 업데이트되는지 검증한다. |

프로그램 개발 기획자가 작성하는 문서란 뭐야?
'학습 로그 > Python3' 카테고리의 다른 글
| D+42 [Python] hashlib 뭐야? 어떻게 활용해야 할까? (0) | 2026.06.08 |
|---|---|
| D+41[Python] Resource & 메모장 예제 실습 (0) | 2026.06.05 |
| D+36+[Python] 오버로딩,오버라이딩 (0) | 2026.06.02 |
| D+36 [Layout] .py 파일분리 왜 할까 ? 레이아웃 종합 예제 학습(2) (0) | 2026.05.28 |
| D+35 [Layout] 레이아웃 종합 예제 학습(1) (0) | 2026.05.27 |