
본문 계속 1/1
STEP 15. 조명 엔진 구축하기

조명 엔진은 PrismCast에서 표시되는 모든 효과를 생성하는 역할을 합니다. Solid, Wave, Breathe와 같은 내장 애니메이션과 함께, 브라우저가 실시간으로 ESP32에 RGB 값을 스트리밍하는 Display Sync도 지원합니다.
현재 효과는 간단한 상태 기계를 사용하여 선택됩니다.
단색
단색 모드는 선택한 색상으로 전체 스트립을 채웁니다.
파도 애니메이션
파도 효과는 스트립을 가로질러 색조를 지속적으로 이동시켜 움직이는 무지개를 생성합니다.
호흡 효과
호흡 효과는 사인파를 사용하여 선택한 색상을 부드럽게 서서히 나타나고 사라지게 합니다.
디스플레이 동기화
디스플레이 동기화는 PrismCast의 주요 기능입니다. ESP32에서 색상을 생성하는 대신, 브라우저는 화면을 캡처하고, 가장자리 색상을 샘플링하며, 이진 WebSocket 패킷을 사용하여 컨트롤러에 전체 RGB 프레임을 전송합니다.
각 LED는 빨간색, 초록색 및 파란색 값을 나타내는 세 바이트를 수신합니다.
밝기 조절
각 효과에 대해 밝기를 별도로 구현하는 대신, PrismCast는 LED를 업데이트하기 전에 전역 밝기 값을 적용합니다.
LED 업데이트
애니메이션 프레임이 생성되면, 전체 LED 버퍼가 스트립으로 전송됩니다.
NeoPixelBus를 사용하면 ESP32가 RMT 주변 장치를 사용할 수 있어 Wi-Fi 통신을 처리하는 동안에도 신뢰할 수 있는 LED 업데이트가 가능합니다.
주 애니메이션 루프
활성 조명 모드는 메인 루프 내에서 지속적으로 업데이트되며, 디스플레이, 버튼 및 WebSocket 서버는 계속 실행됩니다.
STEP 16. 웹 대시보드 구축하기

컨트롤러는 일상적인 사용에 완벽하지만, 고급 사용자 지정을 위한 훨씬 더 강력한 인터페이스가 필요했습니다. 데스크탑 애플리케이션을 만드는 대신, HTML, CSS, JavaScript를 사용하여 브라우저 기반 대시보드를 만들었고, 이를 통해 PrismCast를 모든 현대 브라우저에서 직접 제어할 수 있게 되었습니다.
대시보드는 둥근 패널, 미세한 투명도, 부드러운 애니메이션을 갖춘 서리 낀 유리 (글래스모피즘) 디자인을 따르며, 장치의 전체 미학과 잘 어울립니다.
장치 연결
개발 중에 항상 하드웨어가 연결되어 있지는 않았기 때문에, 데모 모드와 실시간 장치 모드를 모두 구현했습니다. 이를 통해 ESP32 펌웨어가 완성되기 전에도 거의 전체 대시보드를 구축하고 테스트할 수 있었습니다.
디스플레이 구성
모든 모니터의 크기가 다르기 때문에, 대시보드는 사용자가 모니터 크기와 3면 또는 4면 모두에 LED가 설치되어 있는지를 선택할 수 있게 합니다. 이러한 설정을 기반으로 PrismCast는 필요한 LED 수를 자동으로 계산하고 올바른 LED 레이아웃을 생성합니다.
조명 제어
대시보드는 모든 조명 모드에 대한 빠른 접근과 함께 밝기, 애니메이션 속도 및 색상 제어를 제공합니다.
색상 선택기
서드파티 라이브러리를 사용하는 대신, RGB 슬라이더와 HEX 값과 동기화된 사용자 정의 HSV 색상 선택기를 만들었습니다.
사용자 정의 LED 편집기
제가 가장 좋아하는 기능 중 하나는 사용자 정의 LED 편집기입니다. LED를 직선으로 표시하는 대신, 모니터의 윤곽을 따라 배치되어 최종 설치를 시각화하기가 훨씬 더 쉽습니다.
사용자는 개별 LED를 칠하고, 패턴을 미러링하고, 섹션을 채우고, 스트립을 지우거나, 현재 디스플레이 동기화 프레임을 캡처하여 추가 편집을 할 수 있습니다.
프리셋 및 실시간 미리보기
조명 프로필은 로컬에 저장되어 서로 다른 설정 간에 빠르게 전환할 수 있습니다. 대시보드에는 LED가 모니터 주위에 어떻게 보일지를 실시간으로 업데이트하는 실시간 모니터 미리보기도 포함되어 있습니다.
STEP 17. 디스플레이 동기화
PrismCast의 가장 큰 목표 중 하나는 Hyperion, Prismatik 또는 WLED와 같은 기존 소프트웨어에 의존하지 않고 디스플레이 동기화 시스템을 만드는 것이었습니다. 대신, 최신 브라우저 API와 사용자 정의 통신 프로토콜을 사용하여 전체 파이프라인을 처음부터 끝까지 구축했습니다.
브라우저는 먼저 Screen Capture API를 사용하여 선택한 모니터를 캡처합니다. 이 기능은 사용자 권한이 필요하므로 대시보드는 로컬에서 실행되며 사용자가 동기화해야 할 디스플레이를 선택하도록 요청합니다.
프레임 캡처
캡처된 모든 프레임은 숨겨진 캔버스에 그려집니다. 전체 이미지를 처리하는 대신, PrismCast는 LED가 설치된 디스플레이의 가장자리 주변의 작은 영역만 샘플링합니다.
LED 존 생성
고정 샘플링 위치를 사용하는 대신, 대시보드는 선택한 모니터 크기와 LED가 3면 또는 4면에 설치되어 있는지에 따라 자동으로 LED 존을 생성합니다.
24인치 모니터에서 27인치 모니터로 변경하면 펌웨어 설정을 변경하지 않고도 LED의 수와 위치가 즉시 재계산됩니다.
색상 샘플링
샘플링 영역이 생성되면, PrismCast는 모든 LED 위치에 대한 평균 색상을 계산합니다.
이것은 스트립의 모든 LED에 대한 하나의 RGB 값을 포함하는 배열을 생성합니다.
시간적 스무딩
원시 화면 캡처는 장면이 빠르게 변경될 때 깜박일 수 있습니다. 애니메이션을 더 부드럽게 만들기 위해, PrismCast는 이전 프레임과 현재 프레임을 ESP32로 전송하기 전에 혼합합니다.
이 작은 양의 보간은 훨씬 더 부드러운 조명을 생성하면서도 여전히 반응성을 유지합니다.
감마 보정
LED는 밝기에 선형적으로 반응하지 않으므로, PrismCast는 최종 프레임을 전송하기 전에 감마 보정을 적용합니다.
이것은 특히 어두운 장면에서 색상 정확도를 향상시킵니다.
이진 웹소켓 스트리밍
각 프레임에 대해 JSON을 전송하는 대신, 대시보드는 RGB 값을 이진 버퍼에 패킹한 후 ESP32로 전송합니다.
바이너리 패킷은 JSON보다 훨씬 작고 처리 속도가 훨씬 빠릅니다.
ESP32에서의 렌더링
패킷을 수신한 후, ESP32는 LED 스트립을 업데이트하기 전에 모든 RGB 값을 LED 버퍼에 직접 복사합니다.
STEP 18. 통신 프로토콜

PrismCast는 WebSockets를 사용하여 브라우저 대시보드와 ESP32 간의 실시간 통신을 수행합니다. 전통적인 HTTP 요청과 달리, WebSockets는 지속적인 연결을 유지하여 두 장치가 매우 낮은 지연 시간으로 즉시 데이터를 교환할 수 있도록 합니다.
모든 데이터가 동일한 형식으로 전송되는 것은 아닙니다. 조명 모드, 밝기, 색상 및 디스플레이 설정과 같은 구성 변경 사항은 JSON 패킷으로 전송되며, 이는 읽기 쉽고 가끔만 업데이트되기 때문입니다.
ESP32에서는 수신된 JSON 패킷이 파싱되어 현재 장치 상태에 적용됩니다.
디스플레이 동기화를 위해 JSON은 매초 수백 개의 RGB 값을 전송해야 하므로 불필요한 오버헤드를 발생시킵니다. 대신, PrismCast는 각 LED가 빨강, 초록, 파랑 값에 해당하는 세 바이트로 표현되는 압축된 이진 패킷을 전송합니다.
ESP32는 이진 패킷을 자동으로 감지하고 수신된 RGB 값을 LED 버퍼에 직접 복사한 후 스트립을 업데이트합니다.
설정에 대한 JSON과 실시간 동기화를 위한 이진 패킷의 조합은 통신을 효율적이고 유지 관리하기 쉽게 유지하면서 부드러운 실시간 성능을 제공합니다.
STEP 19. 성능 최적화
ESP32가 디스플레이, LED, 버튼 및 무선 통신을 동시에 처리하기 때문에 모든 것이 반응성을 유지하는 것이 프로젝트의 중요한 부분이었습니다. 이를 달성하기 위해 펌웨어는 블로킹 지연을 피하고 각 모듈을 독립적으로 업데이트하여 부드러운 애니메이션과 반응성 있는 제어를 제공합니다.
펌웨어가 완성되자 하드웨어가 마침내 작동하기 시작했습니다. 다음 단계는 브라우저 대시보드를 구축하는 것이었으며, 이는 디스플레이 동기화, LED별 편집 및 사용자 정의 모니터 레이아웃을 포함한 PrismCast의 모든 고급 기능을 잠금 해제합니다. 성능 최적화
ESP32가 디스플레이, LED, 버튼 및 무선 통신을 동시에 처리하기 때문에 모든 것이 반응성을 유지하는 것이 프로젝트의 중요한 부분이었습니다. 이를 달성하기 위해 펌웨어는 블로킹 지연을 피하고 각 모듈을 독립적으로 업데이트하여 부드러운 애니메이션과 반응성 있는 제어를 제공합니다.
펌웨어가 완성되자 하드웨어가 마침내 작동하기 시작했습니다. 다음 단계는 브라우저 대시보드를 구축하는 것이었으며, 이는 디스플레이 동기화, LED별 편집 및 사용자 정의 모니터 레이아웃을 포함한 PrismCast의 모든 고급 기능을 잠금 해제합니다.
STEP 20. 최종 테스트 및 통합



펌웨어가 완성되었으므로 전체 시스템을 테스트할 시간이었다.
최종 펌웨어를 ESP32에 업로드하고 TFT 인터페이스, 버튼 탐색, 조명 효과, 시계, 브라우저 대시보드와의 통신을 포함하여 모든 기능을 마지막으로 확인했다. 모든 것이 제대로 작동하는 것을 확인한 후, 모니터 옆에 컨트롤러를 설치하고 디스플레이 뒤에 LED 스트립을 장착했다.
LED가 화면에 반응하는 모습을 처음 보는 것은 프로젝트에서 가장 만족스러운 순간 중 하나였다. 몇 주간의 설계, 인쇄, 배선 및 프로그래밍 끝에 PrismCast가 마침내 생명을 얻었다.
포함할 이미지
- 업로드된 펌웨어
- 첫 번째 성공적인 부팅
- 모니터 옆의 컨트롤러
- 화면에 반응하는 LED
STEP 21. 최종 결과 및 향후 개선 사항




프리즘캐스트는 디스플레이 동기화 모니터 백라이트를 위한 간단한 아이디어로 시작했지만, 프로젝트가 끝날 무렵에는 훨씬 더 큰 것으로 성장했습니다. RGB 조명 프로젝트로 시작된 것이 결국 자체 컨트롤러, 맞춤형 펌웨어, 브라우저 대시보드 및 사용자 인터페이스를 갖춘 완전한 책상 동반자로 발전했습니다.
프로젝트에서 제가 가장 좋아하는 부분 중 하나는 상호작용할 수 있는 두 가지 완전히 다른 방법을 제공한다는 점입니다. 일상적인 사용을 위해 물리적 컨트롤러는 몇 번의 버튼 클릭만으로 조명 모드, 밝기 및 색상을 쉽게 변경할 수 있게 해줍니다. 더 고급 사용자 지정을 원할 때마다 브라우저 대시보드는 디스플레이 동기화 및 개별 LED 편집에서 모니터 레이아웃 구성 및 프리셋에 이르기까지 시스템에 대한 완전한 제어를 제공합니다.
모든 것을 처음부터 만드는 것은 확실히 프로젝트에서 가장 도전적인 부분이었지만, 또한 가장 보람 있는 일이었습니다. 기존의 펌웨어나 소프트웨어에 의존하는 대신, 프리즘캐스트의 모든 주요 부분은 이 프로젝트를 위해 특별히 설계되어 하드웨어와 소프트웨어 모두에 대한 완전한 제어를 가능하게 했습니다.
모든 프로젝트와 마찬가지로 항상 개선의 여지가 있습니다. 앞으로는 맞춤형 PCB를 설계하고, 더 정확한 시간 측정을 위한 RTC를 추가하며, 자동 밝기 조정을 위한 주변광 센서를 포함하고, 더 많은 조명 효과와 대시보드 기능을 도입하고 싶습니다.
이 프로젝트가 여러분이 자신만의 무언가를 만드는 데 영감을 주기를 바랍니다. 이 인스트럭터블이 마음에 드셨거나 도움이 되셨다면, 레인보우/RGB 콘테스트에서 여러분의 투표를 정말 감사하겠습니다. 질문이나 제안이 있으시면 언제든지 댓글을 남겨주세요.
읽어주셔서 감사합니다, 그리고 즐거운 제작 되세요!
































