일반 USB 선풍기를 단순히 켜고 끄는 것을 넘어, 터치 제어, IR 리모컨, 웹 UI 실시간 모니터링, 예약 스케줄 기능까지 한 번에 제어할 수 있는 스마트 컨트롤러 모듈을 제작했습니다.
MicroPython의 비동기 처리(uasyncio)와 웹소켓(WebSocket) 통신을 활용하여 반응성을 극대화하고, 동작 로그는 외부 데이터베이스(PHP/MySQL)로 연동되도록 구성했습니다.

🛠️ 주요 스펙 및 기능 정의
- 메인 MCU: ESP32-C3 SuperMini (MicroPython 기반)
- 전원 제어: N-Channel MOSFET (GPIO 제어 기반 USB VBUS 라인 switching)
- 제어 방식 (4-Way Multi-Control):
- 터치 버튼: GPIO 1번의 capacitive touch 센싱을 활용한 즉각적인 제어
- IR 리모컨: 37.9kHz 적외선 수신 모듈을 통한 IR 명령 처리
- 웹 Dashboard: 비동기 웹서버 + WebSocket 기반의 실시간 상태 확인 및 Web UI 제어
- 스케줄링: Cron 형태의 예약 스케줄러를 통한 자동 On/Off
- 데이터 연동: iFrame 기반의 Web UI 구조 및 외부 PHP/MySQL 서버로의 동작 상태 로그 전송
🔌 하드웨어 구성 및 회로 포인트
USB 선풍기의 전원을 안전하게 제어하기 위해 MOSFET 스위칭 회로를 기본 구조로 잡았습니다.
- MOSFET Switch (GPIO 0): Low-power MCU 신호로 USB 선풍기의 5V 전류를 손실 없이 제어하기 위해 Gate 드라이브 회로를 구성했습니다.
- Touch Sensor (GPIO 1): 물리 버튼 없이 깔끔한 외관을 위해 내부 Touch 센서를 활용했습니다.
- IR 수신부 (GPIO 2): 리모컨 신호 인터럽트 처리 및 디코딩.
💻 소프트웨어 아키텍처 및 핵심 코드

웹 인터페이스의 실시간 반응성과 물리 입력(터치/리모컨) 간의 상태 동기화를 위해 MicroPython의 uasyncio를 기반으로 설계했습니다.
1. 비동기 이벤트 루프 및 상태 동기화
터치, IR 수신, 웹소켓 신호, 예약 스케줄러가 하나의 state_manager를 바라보도록 하여, 어느 매체에서 켜고 끄든 모든 인터페이스(웹 UI, LED 등)에 즉시 동일한 상태가 반영되도록 처리했습니다.
2. WebSocket 기반 실시간 웹 UI
HTTP 폴링(Polling) 방식의 지연을 없애기 위해 웹소켓을 직접 구축했습니다.
- 웹 페이지 접속 시 현재 상태 동기화
- 웹 버튼 클릭 시 즉시 MOSFET 제어 및 다른 웹 클라이언트로 상태 패킷 브로드캐스트
- iFrame 구조를 통해 기존 메인 웹 대시보드나 홈 서버 페이지에 유연하게 삽입 가능
3. 외부 PHP / MySQL 데이터 로깅
상태 변경(On/Off) 이벤트가 발생할 때마다 비동기 HTTP POST 요청으로 외부 PHP API를 호출하여 데이터베이스에 동작 이력을 남깁니다.
Python
🌟 제작 및 시운전 결과
- 터치 반응성: 반응 지연 없이 즉각적으로 On/Off 토글이 작동합니다.
- 리모컨 연동: 가정용 남는 IR 리모컨의 특정 키를 맵핑하여 멀리서도 손쉽게 제어 가능합니다.
- 웹 제어 & 모니터링: 스마트폰이나 PC 웹 브라우저에서 웹소켓을 통해 실시간으로 선풍기 상태가 갱신되고 제어됩니다.
- 예약 동작: 밤에 일정 시간 후 꺼지도록 스케줄을 걸어두는 용도로 유용하게 활용할 수 있습니다.
💡 마치며
ESP32-C3의 작은 폼팩터와 MicroPython의 강력한 라이브러리 ecosystem 덕분에 단순한 USB 선풍기를 완성도 높은 IoT 스마트 가전으로 업그레이드할 수 있었습니다.


답글 남기기
댓글을 달기 위해서는 로그인해야합니다.