POV Globe - IoT Persistence-of-Vision LED Signboard
·Embedded, PCB & Web Developer
An IoT-controlled persistence-of-vision 3D globe LED signboard that renders text and graphics on a spinning WS2812B array, updatable live from any web browser over WiFi.
POV Globe turns a single 30-LED WS2812B strip into a full cylindrical display by exploiting persistence of vision: as the arm spins, the LEDs are repainted in sync with rotation so text and graphics appear in mid-air. A master ESP32 serves a web UI and drives the motor; a second ESP32 renders characters as 16x16 bitmaps, advanced by a Hall-effect interrupt once per revolution. Message, brightness and speed are all changeable live from a browser — no reflash or rewiring.
Role & Context
4-person university hardware/IoT coursework project; I owned all four subsystems end to end — ESP32 firmware (C++/Arduino), a 2-layer Altium PCB, the web/IoT control layer, and the rotating assembly + power delivery.
Problem
Traditional signboards are static, single-message and non-interactive, and a flat LED matrix needs one physical LED per pixel (hundreds even for a small display). POV Globe makes the display remotely re-programmable in real time over WiFi, and uses persistence of vision so a single 30-LED strip emulates a cylindrical surface a fixed matrix would need hundreds of LEDs to reproduce.
Approach & Architecture
Loading diagram…
Master ESP32 (web UI + motor + RPM) relays messages over WiFi to the display ESP32, which paints 16x16 bitmaps on the WS2812B arm in sync with a Hall-effect once-per-revolution trigger.
Best Practices Followed
Separation of concerns across two ESP32s (master/slave): web UI, motor and RPM on one; time-critical LED rendering + rotation sync on the other, so web traffic never stalls the POV refresh
Non-blocking I/O via the asynchronous ESPAsyncWebServer / AsyncTCP stack, so HTTP requests don't block the tight LED loop
Interrupt-driven synchronization: Hall-effect (FALLING) and RPM-pulse (RISING) ISRs instead of polling, for deterministic POV alignment independent of loop jitter
Signal conditioning: a moving-average filter to smooth the noisy tachometer (RPM) signal
Power integrity: a dedicated XL4015E1 buck converter with motor power isolated from logic/LED rails to prevent motor-induced brownouts and noise
Reproducible hardware: a complete 2-layer Altium PCB (top + bottom, PDF exports) plus an archived per-component datasheet library
Challenges & Resolution
ChallengePOV timing — characters smeared or drifted because rendering had to stay locked to the globe's angular position even as motor speed varied.
FixDrove character advancement from a Hall-effect interrupt (one positional reference per revolution) instead of fixed delays, painting each 16x16 character at a known rotational position and tuning per-row timing (~2 ms/row) against the measured RPM so the image stayed crisp across speeds.
ChallengeDelivering stable power to the continuously rotating arm without brownouts or tangling wires.
FixRegulated the supply with an XL4015E1 buck converter and separated motor and logic/LED rails.
Outcomes
Fully working, demonstrated prototype submitted as graded university coursework
Stable POV image sustained at >1000 RPM, with live RPM shown on an on-board 16x2 LCD
Real-time browser control over WiFi of message, LED brightness (0-255) and motor speed (0-255 PWM) — no reflash or rewiring
Complete 2-layer fabricated PCB (top + bottom) plus a full component datasheet/design archive
Effective 16x16 character-cell display surface from just 30 physical LEDs swept through rotation