로그인회원가입

[DIY] 아두이노 나노와 IR 수신기로 USB 선풍기 스마트 개조하기 (라이브러리 미사용 32비트 NEC 디코딩)

일반 USB 유선 선풍기를 리모컨으로 바람 세기를 조절하고 타이머까지 설정할 수 있는 스마트 무선 선풍기로 개조해 보았습니다.

시중의 IRremote 라이브러리를 쓰지 않고, 아두이노 외부 인터럽트(External Interrupt)와 비트 연산만으로 NEC 프로토콜을 직접 디코딩하여 응답 속도와 타이밍 정확도를 크게 높였습니다.

1. 주요 기능 및 스펙

  • 전원 및 풍량 제어: OFF / 1단 / 2단 / 3단 (PWM 방식)
  • 타이머 기능: 1시간 단위로 최대 12시간 예약 종료
  • LED 듀얼 디스플레이: LED 4개로 평상시엔 [풍량 단계], 타이머 설정 시 5초간 [2진수 타이머 시간] 표시
  • 경량화 제어 로직: 외부 인터럽트(INT0) 기반 Non-blocking 타이밍 디코딩

2. 회로 구성 및 핀 할당 (Pinout)

아두이노 나노의 핀 제약(D2: 외부 인터럽트, D3: PWM)을 고려하여 다음과 같이 핀을 배정했습니다.

핀 번호역할연결 대상상세 설명
D2입력VS1838B OUTIR 수신기 신호 입력 (INT0)
D3출력N-Channel MOSFET Gate팬 속도 조절 (PWM)
D4 ~ D7출력LED 1 ~ 4속도 및 2진수 타이머 표시
D8출력피에조 부저리모컨 수신 피드백 사운드
5V / GND전원USB 5V 입력메인 전원 공유

💡 회로 팁: 5V USB 팬 제어 시 N-Channel MOSFET(예: AO3400 또는 IRLZ44N)을 사용하며, Gate-GND 사이에 10kΩ 풀다운 저항을 달아 미동작 시 노이즈로 인한 팬 돎을 방지합니다.

3. 핵심 기술: 라이브러리 없는 NEC 32-bit 디코딩

범용 IRremote 라이브러리는 무거운 타이머 틱과 상태 머신을 돌려 간혹 저가형 수신기(VS1838B)에서 타이밍 오차로 신호를 놓치는 경우가 생깁니다.

이를 해결하기 위해 Falling Edge 인터럽트가 발생할 때마다 이전 인터럽트와의 시간 간격(micros())을 측정하여 LSB First 방식으로 32비트를 즉시 채워 넣도록 구현했습니다.

NEC 프로토콜 타이밍 조건

  • Leader Code: Falling-to-Falling 약 13.5ms (9ms LOW + 4.5ms HIGH)
  • Bit ‘0’: 약 1.12ms 간격
  • Bit ‘1’: 약 2.25ms 간격

4. 전체 아두이노 소스코드

C++

무료 회원가입 하고 코드 보기

5. UI/UX: 4개 LED로 12시간 표시하기

LED 개수를 줄이기 위해 2진수(Binary) 비트 조합을 사용했습니다.

  • 1시간: LED 1
  • 2시간: LED 2
  • 3시간: LED 1 + LED 2 (1+2)
  • 4시간: LED 3
  • 8시간: LED 4
  • 12시간: LED 3 + LED 4 (4+8)

타이머 버튼을 누르면 5초 동안 LED 4개가 설정 시간을 반짝여 보여준 후, 다시 현재 바람 세기 표시(1~3단)로 깔끔하게 돌아옵니다.

마치며

라이브러리를 떼어내고 인터럽트 레벨에서 비트를 직접 핸들링하니 반응 속도가 매우 민첩해졌고 코드 용량도 크게 줄었습니다. 만약 집에 놀고 있는 USB 선풍기가 있다면 아두이노 나노와 IR 수신기를 붙여 스마트하게 개조해 보시길 추천합니다!

코멘트

답글 남기기