Skip to content
@KCCI-Fridger

KCCI-Fridger

iot system with Raspberry pi tcp server

KCCI Fridger

STM32 기반 스마트 냉장고 모니터링 시스템

냉장고의 문 상태와 가스 센서 값을 실시간으로 감지하고,
LCD와 Bluetooth 통신을 통해 상태를 확인할 수 있는 임베디드 시스템입니다.

MCU Language RTOS Build


1. 프로젝트 목표

  • 실시간 상태 감지: 홀 센서로 냉장고 문 열림·닫힘을 감지하고 MQ-135 가스 센서 값을 주기적으로 측정
  • 직관적인 로컬 모니터링: 16×2 I²C LCD에 문 상태와 가스 센서 전압을 표시
  • 비동기 통신: UART 인터럽트와 Circular Queue를 이용해 수신 데이터 유실과 태스크 블로킹을 최소화
  • 안정적인 이벤트 전달: ACK 타임아웃으로 서버 연결 상태를 판단하고, 단절 중 발생한 이벤트를 재연결 후 순차 전송
  • 기능별 모듈화: Application, Hardware, BSP 계층을 분리하여 유지보수성과 확장성 확보

2. 전체 시스템 구조

flowchart LR
    subgraph Input[센서 입력]
        HALL[Hall Sensor<br/>문 상태]
        GAS[MQ-135<br/>가스 센서]
        RTC[DS1307 RTC<br/>시간 정보]
    end

    subgraph MCU[STM32F411 + FreeRTOS]
        SENSOR[Sensor Task]
        DEFAULT[Display Task]
        COMM[Communication Task]
        QUEUE[(Offline Event Queue<br/>최대 50건)]
    end

    HALL --> SENSOR
    GAS --> SENSOR
    RTC --> SENSOR
    SENSOR --> DEFAULT
    SENSOR --> COMM
    SENSOR --> QUEUE
    QUEUE --> COMM
    DEFAULT --> LCD[16×2 I²C LCD]
    COMM <--> BT[Bluetooth / UART]
    BT <--> SERVER[외부 서버]
Loading

하드웨어 구성

구분 구성 역할
메인 제어부 STM32F411 센서 처리, LCD 표시, 통신 및 FreeRTOS 태스크 실행
문 감지 Hall Sensor GPIO 상태를 이용한 문 열림·닫힘 감지 및 디바운싱
공기질 감지 MQ-135 ADC Polling으로 값을 읽고 0–3300 mV 범위로 변환
시간 관리 DS1307 RTC 문 상태 이벤트가 발생한 시각 기록
사용자 표시 16×2 LCD + PCF8574 시스템 상태, 문 상태, 가스 센서 전압 표시
외부 통신 Bluetooth / UART6 센서 데이터·이벤트 송신 및 ACK·제어 명령 수신
디버그 UART2 시간과 센서 측정값 출력

3. 소프트웨어 구조

FreeRTOS의 세 개 태스크가 표시, 센싱, 통신을 분담합니다.

태스크 실행 주기 주요 역할
defaultTask 100 ms 시스템 초기화, RTC 시간 출력, LCD 화면 갱신
sensorTask 10 ms 문 상태 디바운싱, 주기적 가스 측정, 이벤트 생성, 연결 상태 확인
commTask 10 ms UART Circular Queue 처리, 패킷 파싱, ACK 및 제어 명령 처리
MyApp/
├── Application/   # 태스크 로직, ACK 및 오프라인 이벤트 처리
├── Hardware/      # Bluetooth, Gas, Hall, LCD, RTC 드라이버
├── BSP/           # 보드 초기화 계층
└── Common/        # 공통 정의 및 하드웨어 의존성 관리

4. 핵심 기능

문 상태 감지

  • 홀 센서 입력을 통해 문 열림·닫힘 상태 확인
  • 연속 샘플 기반 디바운싱으로 채터링 방지
  • 상태 변경 시 OPEN 또는 CLOSE 이벤트 즉시 전송
  • 닫힘 이벤트 발생 후 LCD에 상태를 일정 시간 표시

가스 센서 모니터링

  • MQ-135 아날로그 출력을 12-bit ADC로 측정
  • 측정값을 밀리볼트 단위로 변환하여 LCD와 UART에 출력
  • 1초 주기로 외부 서버에 센서 데이터 전송

비동기 Bluetooth 통신

  • UART RX 인터럽트에서는 수신 바이트를 128-byte Circular Queue에 저장
  • 통신 태스크에서 줄 단위 패킷을 조립하고 명령을 파싱
  • 인터럽트 처리와 문자열 파싱을 분리해 응답성과 안정성 확보

오프라인 이벤트 복구

  • ACK가 5초 동안 수신되지 않으면 서버 연결 단절로 판단
  • 단절 중 발생한 문 이벤트와 RTC 타임스탬프를 최대 50건 저장
  • 연결 복구 후 저장된 이벤트를 3초 간격으로 순차 재전송

5. 통신 프로토콜

기본 패킷 형식은 다음과 같습니다.

[수신자 ID]명령@값\n
구분 예시 설명
문 이벤트 [KMS_RAS]EVENT@OPEN 냉장고 문 열림 알림
센서 데이터 [KMS_RAS]SENSOR@1250@0.0@0.0 가스 센서 전압 전송
오프라인 이벤트 [KMS_RAS]OFFLINE_EVENT@20260602@131530@CLOSE 단절 중 발생한 이벤트 재전송
ACK [...]ACK@... 서버 연결 상태 갱신
LED 제어 [...]LED@ON 보드 LED 원격 제어

6. 개발 환경

항목 사용 기술
MCU STM32F411 (Arm Cortex-M4)
Firmware STM32 HAL, CMSIS
RTOS FreeRTOS, CMSIS-RTOS v2
Language C11, Assembly
Build CMake, GNU Arm Embedded Toolchain
Configuration STM32CubeMX (Fridger.ioc)
Interfaces ADC, GPIO/EXTI, I²C, UART

7. 저장소

Repository 설명
RTC_ACK_FINAL RTC 타임스탬프, ACK 연결 감시, 오프라인 이벤트 큐가 통합된 최종 버전
Fridger-lcd-gas-blt LCD, 가스 센서 Polling, Bluetooth Circular Queue 기능을 통합한 기반 버전

8. 향후 개선 계획

  • 오프라인 큐 동시성 보호 및 Flash 기반 영구 저장
  • RTC 초기 시간의 외부 동기화
  • 센서 임계값 기반 경보와 원격 모니터링 화면 구축

Popular repositories Loading

  1. Fridger-lcd-gas-blt Fridger-lcd-gas-blt Public

    lcd - gas(polling) - bluetooth(Circular Queue)

    C

  2. RTC_ACK_FINAL RTC_ACK_FINAL Public

    rtc+lcd+hall offline ram buffer stacking and parsing

    C

  3. .github .github Public

    KCCI-Fridger organization profile

Repositories

Showing 3 of 3 repositories

Top languages

Loading…

Most used topics

Loading…