포트폴리오/[IoT 기반 피지컬 AI 교육일지]

[ C언어 IoT 프로젝트 개발 ] #2 멀티스레드 적용 및 위험 자동 감지 (19일차 기록)

개발자혜콩 2026. 3. 10. 16:08

1. 오늘 한 것

① Linux 멀티스레드 아키텍처 구현

  • pthread를 활용하여 메인 스레드(메뉴 UI)와 모니터 스레드(HW 감시) 완벽 분리.
  • 전역 변수(공유 메모리)를 통한 실시간 상태 동기화.
C
// 예시 구조 (Linux C)
pthread_create(&monitor_thread, NULL, monitor_system, NULL);
show_main_menu(); // UI는 멈춤 없이 작동

 

② 자동 제어 및 채터링 방지 로직 (Arduino & C)

  • 30도 이상 고온 감지 시 제어 명령 송신 (L, M).
  • 상태 관리 플래그 및 '최소 10초 모터 가동 타이머' 적용으로 오작동 방지.

③ 자료구조 기반 로깅 및 데이터 보존 (File I/O)

  • 경고 발생 시 malloc으로 연결 리스트(Linked List) 노드 생성.
  • 프로그램 종료 시 warning_data.txt에 로그 자동 백업.
  • 재시작 시 텍스트 파일 Load 하여 리스트 복구 기능 구현.

2. 직면했던 문제

 

  • 센서 미세 오차로 인한 모터 무한 깜빡임(채터링) 현상
    • 원인: 온도가 임계점(30.0도)과 29.9도 사이를 미세하게 오갈 때마다, 루프가 돌며 불필요한 On/Off 제어 명령을 중복 송신함.
    • 해결: C언어 코드에 **'상태 관리 플래그'**를 도입해 현재 상태(켜짐/꺼짐)가 변할 때만 제어 명령을 1회 전송하도록 수정. 추가로 한 번 가동되면 **'최소 10초 이상 가동'**되도록 소프트웨어 타이머를 적용하여 하드웨어 안정성 확보.
  • 하드웨어 스위치 플로팅(Floating) 현상
    • 원인: 스위치를 누르지 않았음에도 핀에 걸리는 전압이 붕 떠서(Floating) 계속 0이 출력되거나 값이 흔들림.
    • 해결: 회로에 복잡하게 저항을 추가하는 대신, 아두이노 코드에서 pinMode(pin, INPUT_PULLUP);을 선언하여 보드 내장 풀업 저항을 활성화. 이를 통해 기본 상태를 안정적으로 유지함.

 


3. 오늘 배운 핵심 개념

  • OS 레벨 스레드 스케줄링(Multi-threading) 및 블로킹(Blocking) 현상 방지.
  • 동적 메모리 할당(Linked List) 및 데이터 영속성(File I/O).

4. 현재 진행도

  • 비동기 실시간 환경 모니터링 구축 완료.
  • 하드웨어 제어 및 데이터 로깅 시스템 통합 완료.

5. 다음 목표

  • 발표용 아키텍처 다이어그램 제작.
  • 전체 시스템 시연 영상 촬영 및 발표 자료 완성.