1. 오늘 한 것
① 프로젝트 기획 및 요구사항 명세
- 기획 배경: 1인 가구 증가 및 독거노인 고독사 문제 해결을 위한 '고령 1인가구 안심 스마트홈 케어 시스템' 기획.
- 핵심 기능 도출 (페르소나 분리):
- 거주자 관점: 일상생활의 안전 확보 및 위급 상황 시 즉각적인 소통 창구 마련.
- 보호자 관점: 원격에서 거주자의 환경을 실시간 모니터링하고 이상 징후 발생 시 즉각적인 알림 수신.
② 전체 시스템 아키텍처 3계층 설계
- H/W (아두이노): 센서 데이터 수집 및 하드웨어(모터, LED) 직접 제어.
- Gateway & Server (Ubuntu Linux): 아두이노로부터 데이터를 수신하고, 이를 가공하여 DB에 저장 및 클라이언트로 중계.
- Client (Windows GUI): 거주자 및 보호자용 화면 렌더링 및 원격 제어 명령 송신.
③ 통신 방식 및 DB 스키마 확정
- 통신 인터페이스: * 아두이노 ↔ 리눅스 서버: Serial 통신 (UART, 9600bps)
- 리눅스 서버 ↔ 윈도우 클라이언트: TCP/IP 소켓 통신 (Port 9000)
- 데이터베이스(MariaDB) 스키마 초안:
- sensor_logs: 온습도, 모션 감지 등 주기적인 센서 데이터 적재 테이블.
- chat_logs: 거주자-보호자 간 소통 기록 테이블.
④ 하드웨어 부품 및 센서 목록 확정
- SHT21 (온습도 센서)
- HC-SR04 (초음파 센서)
- PIR (인체 감지 모션 센서)
- 액추에이터 및 제어부: DC 모터, LED, 스위치(SW)
2. 문제 / 헷갈린 점
- 아두이노의 네트워크 포지셔닝 (시리얼 vs TCP):
- 고민: 초반에는 아두이노에서 바로 서버로 TCP 통신을 쏘는 방식을 고민했으나 헷갈렸다.
- 설계 확정: 우리가 사용하는 아두이노 보드에는 독립적인 Wi-Fi 모듈이 없으므로, USB 시리얼로 연결된 Linux PC가 중간에서 게이트웨이(Gateway) 역할을 수행하여 TCP 통신으로 변환 및 중계해 주어야 한다는 네트워크 토폴로지를 명확히 확립함.
- 클라이언트 프로그램 분리 여부 고민:
- 고민: 거주자 UI와 보호자 UI를 하나의 프로그램 탭으로 나눌지 고민.
- 설계 확정: 두 타깃의 역할, 권한, 화면 구성이 완전히 다르기 때문에 아예 별도의 실행 프로그램(SeniorUI.cpp / GuardianUI.cpp)으로 분리하는 것이 유지보수와 사용성 측면에서 훨씬 낫다고 판단함.
- 데이터 패킷 구조 설계 (텍스트 vs 바이너리 구조체):
- 고민: 센서 데이터를 보낼 때 눈으로 보기 편한 텍스트(String)로 보낼지, 패킷 사이즈를 줄일 수 있는 바이너리(Struct)로 보낼지 확신이 안 섰음.
- 설계 확정: 개발 초기 단계에서는 디버깅 직관성을 위해 '텍스트 파싱(Parsing)' 방식으로 시작하고, 통신이 안정화되면 이전에 배운 #pragma pack을 적용한 구조체 바이너리 패킷으로 고도화하기로 결정.
- 멀티스레드 환경의 DB 연결 충돌:
- 리눅스 서버에서 여러 클라이언트의 요청(스레드)이 동시에 발생할 때, MySQL 연결 객체를 공유하면 충돌이 일어날 수 있다는 점을 초기 구조도 설계 시 미처 고려하지 못함. 스레드 동기화(Mutex)가 DB 쿼리 실행 구간에도 꼭 적용되어야 함을 깨달음.
3. 오늘 배운 핵심
- 아두이노는 엣지(Edge), 리눅스는 게이트웨이(Gateway)다: 아두이노 단독으로는 네트워크 노드가 될 수 없으며, 게이트웨이 역할을 하는 서버의 중계 프로세스가 IoT 시스템의 핵심이다.
- 데이터 흐름이 곧 아키텍처다: "누가 데이터를 생성해서, 어떤 통신으로 보내고, 누가 받아서 어디에 저장하는가"를 먼저 정의해야 구현 단계에서의 스파게티 코드를 막을 수 있다.
- 페르소나의 분리는 UI 설계의 첫걸음이다: 서비스 요구사항을 사용자 관점(거주자/보호자)으로 완벽히 쪼개면, 각 프로그램이 가져야 할 기능 우선순위가 자연스럽게 잡힌다.
4. 다음 목표
- 아두이노 브레드보드에 SHT21, PIR, HC-SR04 센서 하드웨어 배선 완료 및 개별 동작 테스트 진행.
- 각 센서별 로우 데이터(Raw Data)를 읽어오는 테스트 코드 작성 후 시리얼 모니터로 값 튀는 현상(노이즈) 확인하기.
- 수집된 센서 데이터를 묶어 시리얼(UART)로 전송하는 기초 통신 구현.
- Linux 환경에서 시리얼 포트(/dev/ttyACM0)를 열고 아두이노 데이터를 정상 수신하는지 터미널에서 확인.
'포트폴리오 > [IoT 기반 피지컬 AI 교육일지]' 카테고리의 다른 글
| [ C언어 IoT 프로젝트 ] #3 MySQL 연동 및 멀티스레드 TCP 소켓 구축(27일차 기록) (0) | 2026.03.24 |
|---|---|
| [ C언어 IoT 프로젝트 ] #2 스마트홈 센서 테스트 & 시리얼 통신 (26일차 기록) (0) | 2026.03.23 |
| [ C++ 윈도우 소켓 프로그래밍 ] 콜백 함수와 WPARAM / LPARAM 차이 정리 (24일차 기록) (0) | 2026.03.20 |
| [ C++ 네트워크 통신 ] 리눅스 멀티스레드(pthread)와 주요 소켓 옵션 및 기타 정리 (23일차 기록) (0) | 2026.03.20 |
| [ C++ 멀티스레드 TCP 서버 ] 데이터 구조화 및 스레드 동기화 (22일차 기록) (0) | 2026.03.11 |