로그인회원가입

[MicroPython] ESP32 기반 스마트 홈 온습도 통합 모니터링 디스플레이 제작기 (ST7789 + uasyncio)

집안 여러 공간(거실, 안방, 아이방, 베란다 등)에 배치된 센서 노드들의 온습도 데이터를 매번 개별 앱이나 웹으로 확인하는 것이 번거로워, 한눈에 모든 방의 상태를 파악할 수 있는 전용 모니터링 디스플레이를 제작했습니다.

이번 프로젝트는 ESP32와 ST7789 TFT LCD, 그리고 uasyncio 비동기 처리를 결합하여 화면이 끊김 없이 부드럽게 갱신되도록 설계했습니다.

🛠️ 주요 핵심 기능

  1. 멀티 노드 비동기 데이터 수집 (uasyncio)
    • 총 8~9개 센서 노드(거실, 주방, 안방, 서브룸, 드레스룸, 베란다, 야외 등)의 HTTP API를 non-blocking(비동기) 방식으로 순회 조회합니다.
    • 특정 노드의 응답이 늦어지더라도 시계나 전체 UI가 멈추지 않고 매끄럽게 동작합니다.
  2. 동적 스케일링 기반 UI 가시성 극대화
    • 측정된 집안 전체의 최저/최고 온습도 범위를 실시간 계산하여, 수치가 텍스트 박스 형태의 상대적인 가로 위치(x좌표)로 표현되도록 구현했습니다.
    • 단순 숫자가 아닌, 각 방의 상대적인 온도/습도 위치를 직관적으로 파악할 수 있습니다.
  3. 스마트 전원 관리 및 인터렉티브 경고 시스템
    • 터치 센서를 통한 화면 켜기/끄기 및 일정 시간 후 자동 절전(Auto Sleep) 모드를 지원합니다.
    • 자동 종료 10초 전 또는 터치 버튼을 1초 이상 길게 누르고 있을 때 우측 상단에 OFF 배지가 빨간색 반전으로 깜빡이며 종료 예고 신호를 줍니다.
  4. BLK 핀 부재 극복: 디스플레이 직접 전원 제어 방식 적용
    • 사용한 ST7789 LCD 모듈은 별도의 백라이트(BLK) 핀이 없는 타입입니다.
    • 단순히 백라이트만 끄는 방식이 불가능하므로, PowerManager를 통해 절전 모드 진입 시 액정 전원(VCC)을 직접 차단하거나 Sleep 명령을 제어하여 절전 모드 시 소비 전력을 최소화했습니다.

📐 시스템 구조 및 핀 맵 (Pinout)

  • MCU: ESP32 / ESP32-S3 계열
  • Display: ST7789 2.4″ / 2.0″ IPS TFT LCD (240×320)
  • Touch Sensor: TTP223 정전식 터치 모듈
ST7789 PinESP32 GPIO비고
SCKGPIO 4SPI1 Clock
MOSIGPIO 6SPI1 Master Out
RESETGPIO 3Reset
DCGPIO 2Data/Command
CSGPIO 7Chip Select
BLK(부재)GPIO 10Backlight PWM / On-Off
TOUCHGPIO 1터치 입력 (Active High)

💡 핵심 코드 설계 파트

1. 비동기 HTTP 센서 데이터 수집기

asyncio.open_connection을 사용하여 네트워크 지연으로 인한 UI 병목 현상을 방지했습니다.

Python

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

2. 동적 수치 계산 및 위치 맵핑

현재 수집된 모든 방의 최저/최고 온습도를 기준 삼아, 해당 수치가 차지하는 영역 내 x좌표 위치를 계산하여 텍스트를 출력합니다.

Python

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

3. 터치 버튼 롱프레스 & 자동 종료 깜빡임 알림

10초 전 자동 종료 알림과 1초 이상 터치 버튼 누름 동작을 실시간으로 감지하여 화면 상단에 OFF 배지를 깜빡이게 처리했습니다.

Python

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

🎬 완성된 동작 모습 및 소감

  • 실시간 시계 & 상태 배지: 매초 정확하게 시간을 업데이트하며, 각 방의 데이터 수집 시 노드 이름이 회색으로 강조된 후 수집이 완료되면 원복됩니다.
  • 통신 장애 대응: 특정 센서의 IP 통신이 차단되거나 수신에 실패하더라도 전체 시스템이 멈추지 않고 다음 노드로 넘어가 안전하게 작동합니다.
  • 메모리 관리: MicroPython 특성상 소켓 통신 반복 시 힙 메모리 파편화가 발생할 수 있어, 각 통신 직후 gc.collect()를 명시적으로 실행해 주어 한 달 이상 연속 동작에도 안정성을 확보했습니다.

코멘트

답글 남기기