← 프로젝트 목록으로

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번 포트로 접근하는 구조