Air-Alarm
설명 영상
기본 정보
- 사용 언어
- PythonFlaskSQLiteRaspberry Pipyserial
- 포지션
- 서버
- 기간
- 2021.06 ~ 2021.10
- 팀 / 개인
- 팀
- 깃허브 링크
- GitHub에서 보기 →
프로젝트 소개
자체 제작한 IoT 기기(라즈베리파이 + 센서 모듈)로 측정한 온도·습도·미세먼지·CO2 데이터를 서버를 거쳐 iOS 앱에서 확인할 수 있도록 만든 미세먼지 감지 장치 & 앱 프로젝트입니다. 시리얼 통신으로 들어오는 센서 원시 데이터를 파싱해 SQLite에 적재하고, 공공데이터포털 대기질 API와 결합하여 하나의 REST API로 노출하는 서버 백엔드를 담당했습니다.
프로젝트 구성
센서 데이터 수집
- 시리얼 통신으로 IoT 기기로부터 전달받은 W/T/H/D/C 형식의 원시 문자열을 파싱하여 온도·습도·미세먼지·CO2 값 추출
서버 API
- Python Flask를 이용한 REST API 구축
데이터 저장
- 파싱한 센서 데이터를 1초 주기로 SQLite에 적재
- 자정마다 하루치 데이터를 평균 내어 월별 테이블로 집계·이관
- SQLite DB에 저장된 데이터를 요청에 따라 REST API로 출력
외부 데이터 비교
- 공공데이터 API를 통한 도시 미세먼지 데이터를 매 정시 수집
- API에서 수집한 데이터를 실제 기기 데이터와 비교하여 전달
세부 설계
시리얼 프로토콜 파싱
- 임베디드 보드가 W:시간,T:온도,H:습도,D:먼지,C:CO2, 형식의 커스텀 프로토콜로 UART 전송
- pyserial로 한 줄을 읽어 W/T/H/D/C 접두문자 위치를 기준으로 값 슬라이싱
- 자릿수가 가변인 값은 다음 문자가 구분자(,)인지 검사하며 이어붙이는 방식으로, 정규식 없이 인덱스 기반 파서 직접 구현
적재와 주기 집계
- 스케줄러 없이 단일 프로세스의 무한 루프에서 1초마다 SQLite day 테이블에 적재
- 루프 내에서 시(hour)·일(day) 변화를 직접 비교해, 정시엔 외부 API 호출, 자정엔 day → month 평균 집계·이관 후 초기화
외부 공공데이터 연동
- 에어코리아 시도별 실시간 대기오염 정보 API, 기상청 초단기실황 API를 requests + BeautifulSoup(XML 파싱)으로 호출
- 지역 PM10·PM2.5, 기온, 습도를 local 테이블에 저장해 자체 센서 실측값과 관공서 데이터를 나란히 비교 가능하도록 설계
REST API 서빙
- Flask로 /get, /weather 엔드포인트를 구성해 SQLite 최신 로우를 JSON으로 응답
- day 데이터는 조회 시 JSON 파일로 직렬화한 뒤 다시 읽어 반환하는 방식 사용
- 같은 네트워크의 iOS 앱이 라즈베리파이 IP의 5000번 포트로 접근하는 구조