LED 시세 전광판 제작기 · 01
[IoT DIY 1편] ESP8266과 16구 도트매트릭스 기반 세로형 시세 전광판: 하드웨어 설계, 화면 분할(Zone), 그리고 전력 트러블슈팅
![[IoT DIY 1편] ESP8266과 16구 도트매트릭스 기반 세로형 시세 전광판: 하드웨어 설계, 화면 분할(Zone), 그리고 전력 트러블슈팅](/iot-lab/assets/led-ticker/hero-1.jpg)
2022년 암호화폐와 증권 시장의 급등락 속에서 많은 투자자들이 하루에도 수십 번씩 스마트폰 잠금을 해제하거나 모니터 창을 전환하며 시세를 확인하는 피로감을 겪었습니다. 이러한 행동은 작업의 흐름을 끊고 인지적 스트레스를 극대화합니다.
이러한 문제를 해결하기 위한 가장 직관적인 인프라는 ‘내가 원할 때 고개만 들면 즉시 정보를 확인할 수 있는 전용 데스크탑 시세 전광판’을 구축하는 것입니다. 본 시리즈의 첫 번째 글에서는 시세 전광판 제작을 위한 최적의 디바이스 하드웨어 선정 이유, 다수의 LED를 구동할 때 발생하는 전압 강하 트러블슈팅, 그리고 세로형 화면 분할(Zone)을 활용한 빅 폰트 UI 설계 로직을 엔지니어링 관점에서 상세히 다룹니다.
1. 디스플레이 및 컨트롤러 하드웨어 선정의 기술적 타당성
디지털 시계나 시세 표시 장치를 제작할 때 TFT LCD나 OLED 디스플레이를 선택하는 경우가 많습니다. 하지만 책상 위나 선반에 두고 ‘2~3미터 거리에서 주간 광원 아래 직관적으로 읽는 디스플레이’로서는 도트매트릭스 LED(MAX7219)가 압도적인 기술적 우위를 가집니다.
1) 왜 LCD/OLED 대신 도트매트릭스(MAX7219)인가?
- 광학적 시인성과 공간 활용: 4-in-1 모듈 4개를 직렬 연결하여 총 16개의 도트매트릭스(8×128 픽셀)를 세로로 세워 배치하면, 좁은 데스크탑 공간을 차지하지 않으면서도 수많은 데이터를 한눈에 보여줄 수 있습니다. 빨간색 고휘도 LED는 낮 시간대 밝은 책상 위에서도 쨍한 가독성을 제공합니다.
- MCU 렌더링 리소스 최적화: 고해상도 LCD에 폰트를 스크롤하려면 마이크로컨트롤러(ESP8266)의 그래픽 버퍼(RAM)와 CPU 주기를 대량으로 소모합니다. 하지만 MAX7219 IC가 내장된 모듈은 SPI 통신으로 픽셀 데이터만 전송하면 IC 자체가 디스플레이 멀티플렉싱(Multiplexing)을 상시 하드웨어 연산하므로 MCU의 연산 부담을 90% 이상 덜어줍니다.
2. 하드웨어 명세서(Bill of Materials)
| 구분 | 부품명 | 역할 및 선택 이유 | 동작 스펙 / 인터페이스 |
|---|---|---|---|
| 메인 MCU | ESP8266(Wemos D1 Mini) | 와이파이 통신 및 디스플레이 제어 | 3.3V Logic, 80MHz CPU |
| 디스플레이 | MAX7219 4-in-1 모듈(4개) | 총 16개 모듈(8×128 픽셀) 직렬 연결 | 5V VCC, SPI 통신 |
| 전원부 | 5V / 2A SMPS 어댑터 | LED 매트릭스 및 MCU 전원 공급 | Peak Current 2A 대응 |
| 디커플링 | 470µF 전해 커패시터 + 0.1µF 세라믹 | 전압 강하(Brownout) 방지 및 노이즈 제거 | 전원 입력단(VCC-GND) 병렬 배치 |
3. 화면 분할(Zone)과 빅 폰트(Big Font)를 활용한 UI/UX 설계
단일 텍스트가 흘러가는 일반적인 전광판과 달리, 실시간 시계와 다양한 금융 데이터를 동시에 보여주기 위해서는 디스플레이의 물리적 공간 분할(Zone)과 가독성 높은 폰트 렌더링이 필수적입니다. 총 16개의 도트매트릭스를 세로로 세운 뒤, MD_Parola 라이브러리의 다중 Zone 제어 기능을 활용하여 화면을 상하단으로 완벽히 분리했습니다.
- 상단 영역(시계 및 날씨): 공간의 시각적 중심을 잡아주기 위해 빅 폰트(Big Font) 또는 더블 하이트(Double-height) 글리프를 적용했습니다. 방 어디서든 고개만 돌리면 현재 시간(예:
23:21)을 즉각적으로 확인할 수 있도록 고정 또는 간결한 애니메이션으로 렌더링합니다. - 하단 영역(시세 및 환율): 기본 폰트를 사용하여 환율(
CNY: 219.73), 요일(Tuesday), 코인 시세 등 정보 밀도가 높은 텍스트를 지속적으로 스크롤 롤링하여 제한된 8픽셀 폭 안에서 최대한 많은 데이터를 제공합니다.
4. [실무 코드 블록] 16 모듈 화면 분할(Zone) 및 비동기 렌더링 엔진
다음은 MCU의 루프를 막지 않고(No delay()) 상하단 화면을 완전히 독립적으로 구동하는 MD_Parola 기반의 실무 보일러플레이트 코드입니다.
#include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> // ============================================================================== // 1. 하드웨어 설정 및 핀 매핑 (16개 디스플레이 모듈 구성) // ============================================================================== #define HARDWARE_TYPE MD_MAX72XX::FC16_HW #define MAX_DEVICES 16 // 4-in-1 모듈 4개 직렬 연결 (총 16개 디스플레이) #define CLK_PIN 14 // D5 #define DATA_PIN 13 // D7 #define CS_PIN 15 // D8 // MD_Parola 인스턴스 생성 (2개의 독립된 Zone 사용) MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); #define ZONE_LOWER 0 #define ZONE_UPPER 1 void setup() { Serial.begin(115200); Serial.println("🚀 [SYSTEM INIT] LED 시세 전광판 초기화 시작"); // 1. 디스플레이 엔진 2개의 Zone으로 초기화 myDisplay.begin(2); myDisplay.setIntensity(3); // 2. 물리적 화면 분할 설정 // 하단 영역(Zone 0): 0번 ~ 7번 모듈 (시세, 환율 정보 스크롤 영역) myDisplay.setZone(ZONE_LOWER, 0, 7); // 상단 영역(Zone 1): 8번 ~ 15번 모듈 (빅 폰트 기반 실시간 시계 영역) myDisplay.setZone(ZONE_UPPER, 8, 15); // 3. Zone별 초기 텍스트 및 효과 세팅 myDisplay.displayZoneText(ZONE_LOWER, "CNY: 219.73 / Tuesday", PA_LEFT, 35, 0, PA_SCROLL_UP, PA_SCROLL_UP); // 상단은 시계를 위한 빅 폰트 설정 적용 (사전 정의된 BigFont 헤더 필요) // myDisplay.setFont(ZONE_UPPER, BigFont); myDisplay.displayZoneText(ZONE_UPPER, "23:21", PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT); } void loop() { // 4. 논블로킹 독립 애니메이션 핸들러 // myDisplay.displayAnimate()를 호출하면 각 Zone이 비동기적으로 동시에 렌더링됩니다. if (myDisplay.displayAnimate()) { if (myDisplay.getZoneStatus(ZONE_LOWER)) { // 하단 정보창 롤링이 끝나면 다음 API 데이터(환율 -> 코인)로 버퍼 교체 myDisplay.displayReset(ZONE_LOWER); } if (myDisplay.getZoneStatus(ZONE_UPPER)) { // 분에 변경이 생길 때만 상단 시계 영역 업데이트 myDisplay.displayReset(ZONE_UPPER); } } }
5. 하드웨어 배선 및 전력 제어 트러블슈팅
총 16개의 도트매트릭스(128픽셀)를 안정적으로 구동하기 위해서는 철저한 전력 설계가 뒷받침되어야 합니다. 데이터시트의 이론과 현장의 물리적 현실은 크게 달랐습니다.
Case: 빅 폰트 출력 시 보드 무한 재부팅(Brownout Reset)
- 증상: 상하단에 시계와 시세가 꽉 차게 렌더링되는 순간 ESP8266 보드가 예기치 않게 재부팅(wdt reset 또는 Brownout detector triggered)되는 현상.
- 원인: 16개의 매트릭스(총 1,024개 개별 LED)에 불이 대거 들어오면 순간 소비 전류가 2A 이상으로 치솟습니다. 이를 ESP8266 보드의 5V 핀에 직접 연결할 경우 순간적인 전압 강하(Voltage Dip)가 발생합니다.
- 엔지니어링 해결책:
- 전원 공급선 완벽 분리: 16개 매트릭스 모듈의 전원(VCC, GND)은 5V/2A 이상의 독립 어댑터에 직접 병렬로 묶어 결선하고, ESP8266 보드와는 GND(그라운드) 핀만 공통으로 연결(Common Ground)했습니다.
- 디커플링 커패시터 추가: 매트릭스 전원 입력단 곳곳에 470µF / 16V 전해 커패시터를 부착하여, 상단 시계의 분(Minute) 단위가 바뀔 때 발생하는 고주파 전류 스파이크를 물리적으로 흡수했습니다.
6. 결론 및 시리즈 로드맵
단순한 호기심과 불편함에서 출발한 비트코인 시계 제작은, 총 16개의 모듈을 상하단으로 쪼개고(Zone) 독립적인 폰트와 애니메이션을 구사하는 탄탄한 하드웨어 기초 공사로 이어졌습니다. 안정적인 전류 공급과 비동기 스크롤 엔진을 얹음으로써 24시간 켜둬도 멈추지 않는 단단한 물리적 기반이 마련된 것입니다.
하지만 이 기기에 와이파이를 연결하고 거래소 API 키를 직접 넣어 시세를 계산하려 하는 순간, 보안과 메모리 한계라는 또 다른 거대한 벽에 부딪히게 됩니다. 시리즈의 다음 포스트에서는 기기의 보안을 지키고 연산 부담을 없애기 위한 ‘서버-클라이언트 역할 분리 아키텍처’에 대해 깊이 있게 살펴보겠습니다.