Arduino UNO Controlled NeoPixel Ring Light Show

Arduino UNO Controlled NeoPixel Ring Light Show | MakeMindz
Arduino UNO · WS2812B NeoPixel · Daisy-Chain RGB Light Show  |  MakeMindz.com
LED & Lighting Projects

Arduino UNO
NeoPixel Ring
Light Show

Daisy-chain multiple WS2812B NeoPixel rings with Arduino UNO for programmable rainbow cycles, breathing effects, and dynamic lighting animations — all through a single data wire.

🟢 Difficulty: Beginner–Intermediate
Build Time: ~1.5 Hours
💡 LEDs: 72 (6 × 12-ring)
🔌 Power: 5V External PSU

Project Overview

Arduino Uno drives up to 6 daisy-chained NeoPixel rings (72 LEDs total) through a single digital data pin. Each LED is individually addressable, creating stunning animations with minimal wiring — just one data line for the entire chain.

🎮
Controller
Arduino UNO
💡
LED Type
WS2812B
🔗
Topology
Daisy Chain
📡
Data Pins
1 (Pin 6)
Voltage
5V DC
🌈
Effects
4+ Modes
Why daisy-chaining? All 6 rings are controlled through a single GPIO pin using the WS2812B serial protocol. The Arduino sends one long bitstream — each ring consumes its 24 bits per LED, then forwards the rest downstream. Adding more rings requires zero extra wiring beyond power and the short DOUT→DIN hop.

Components Required

Available from Amazon, Robu.in, or AliExpress. Estimated total: ₹500–700 / $7–10 USD for a full 6-ring setup.

🎮
Arduino UNO R3
ATmega328P microcontroller board
× 1
💡
NeoPixel Ring (WS2812B)
12-LED RGB addressable ring per unit
× 6
🔌
5V External Power Supply
2A minimum; 5A recommended at full brightness
× 1
🔧
330Ω Resistor
Series protection on data line
× 1
1000µF Capacitor
Power stabilization — critical for LED longevity
× 1
🧵
Jumper / Hook-up Wire
Male-to-female and solid-core assorted
Assorted
⚠️
Power Warning: 72 WS2812B LEDs at full white draw ~4.3A. Never power the rings from Arduino's 5V pin for a full 6-ring build — it maxes out at 500mA from USB. Use a dedicated 5V/5A supply, sharing only GND with the Arduino.

Circuit Diagram

Arduino Pin 6 connects through a 330Ω resistor to the DIN of Ring #1. Each ring's DOUT connects to the next ring's DIN. All rings share 5V and GND from the external supply. Capacitor stabilises the power bus.

🔌 Arduino UNO ↔ 6× NeoPixel Ring — Wiring Schematic

Single-pin daisy-chain configuration · External 5V power rail · Common GND between Arduino and supply

ATmega 328P Arduino UNO 16MHz RST D13 D12 D11 D10 D9 D7 D6 5V GND Arduino UNO R3 330Ω Data Line + 1000µF NeoPixel Ring #1 WS2812B ×12 DOUT 5V GND DIN Ring #2–6 D6 DATA 5V Data signal 5V Power GND DOUT → DIN (ring-to-ring)

🔗 Daisy-Chain Connection Flow

DOUT of each ring connects directly to DIN of the next. Power rails run in parallel to all rings.

Arduino UNO
Pin 6 (D6)
330Ω + DIN
Ring #1
LEDs 0–11
DOUT→DIN
Ring #2
LEDs 12–23
DOUT→DIN
Ring #3–6
LEDs 24–71

📌 Pin Connection Reference

FromToWireNotes
Arduino Pin 6 330Ω → Ring #1 DIN 🟣 Purple One data line controls all 72 LEDs
Ext. 5V (+) All ring 5V pads + Cap (+) 🔴 Red External supply only — not Arduino 5V pin!
PSU GND + Arduino GND All ring GND pads + Cap (−) ⚫ Black Common GND between Arduino and supply
Ring N DOUT Ring N+1 DIN 🟢 Green Repeat for each ring in the chain
1000µF CapacitorAcross 5V & GND as close to Ring #1 as possible

Step-by-Step Instructions

Follow these steps in order. Read each tip before proceeding — especially the power warnings.

1
Install the Adafruit NeoPixel Library
Open Arduino IDE → Sketch → Include Library → Manage Libraries. Search for Adafruit NeoPixel by Adafruit and click Install. This library handles the timing-critical 800kHz WS2812B data protocol automatically.
💡 Tip: Use Adafruit NeoPixel v1.12.0 or later. Older versions have timing bugs on some Arduino clock speeds. Check the Library Manager for updates.
2
Set Up the External Power Supply
Connect your 5V external supply. Establish a shared power bus (5V and GND rails). Connect the 1000µF capacitor with its positive leg to 5V and negative leg to GND, as close as possible to where Ring #1 will connect. Share the GND with Arduino's GND pin.
⚠️ Critical: The 1000µF capacitor must be installed before power-up. Power-on surges without it can instantly destroy the first LED in Ring #1. Also ensure the external supply GND and Arduino GND are connected together.
3
Wire Ring #1 to Arduino
① Connect Ring #1's 5V pad to the 5V power bus.
② Connect Ring #1's GND pad to the common GND bus.
③ Connect Arduino Pin 6330Ω resistor → Ring #1 DIN pad.
💡 Resistor placement: Put the 330Ω as close to the Arduino pin as possible (at the source end of the wire), not at the ring end. This prevents signal ringing that can cause flickering or data errors.
4
Daisy-Chain All Remaining Rings
For Ring #2 through #6:
① Connect DOUT of the previous ring to DIN of this ring.
② Connect 5V and GND pads to the shared power bus.
Repeat until all 6 rings are connected in a chain.
💡 Cable management: Keep the DOUT→DIN jumper wires under 15cm. For longer runs between rings, add another 330Ω resistor inline on the data hop. Label each ring with its starting LED index (0, 12, 24, 36, 48, 60) for easier debugging.
5
Configure and Upload the Sketch
Open the Arduino sketch below. Confirm PIN is set to 6 and NUMPIXELS to 72. Select Tools → Board → Arduino UNO and your correct COM port. Click Upload and wait for "Done uploading".
💡 Scaling: Using 16-LED rings? Set NUMPIXELS 96 (6 × 16). Using only 3 rings? Set NUMPIXELS 36. The library handles the rest automatically.
6
Power On and Verify All Rings
Connect Arduino via USB and power the rings from the external supply. All 72 LEDs should start a breathing yellow animation. Walk through each ring visually — every ring should animate. If one is dark, check its DIN connection and DOUT from the previous ring.
⚠️ If only Ring #1 lights up, the most likely cause is a broken DOUT→DIN connection between rings. Check with a multimeter — DOUT and DIN pads are usually on the same face of the ring PCB near the power pads.
7
Customise Effects and Expand
The sketch cycles through breathing, rainbow, color wipe, and theatre chase automatically. Comment out or reorder the effect calls in loop() to customise your show. For a sound-reactive version, connect a MAX4466 mic module to A0 and map analogRead(A0) to brightness.
💡 Expansion: Chain up to 500+ LEDs using the same single-pin approach. For very long chains, power injection (adding a fresh 5V/GND connection midway down the chain) prevents voltage drop causing colour shifts in later rings.

Arduino Sketch

Full multi-effect sketch — breathing yellow, rainbow cycle, color wipe, and theatre chase. Copy the base code from the project, or use this expanded version for a complete light show.

neopixel_lightshow.ino
// ═══════════════════════════════════════════════════════════
//  Arduino UNO NeoPixel Ring Light Show | MakeMindz.com
//  Hardware: 6× NeoPixel Ring (12 LEDs each) = 72 LEDs
//  Library:  Adafruit NeoPixel
//  Data Pin: D6 → 330Ω → Ring #1 DIN
//            Ring chain: DOUT → DIN → DOUT → DIN ...
// ═══════════════════════════════════════════════════════════

#include <Adafruit_NeoPixel.h>

// ── Hardware Configuration ───────────────────────────────
#define PIN        6     // Arduino digital pin D6
#define NUMPIXELS  72    // 6 rings × 12 LEDs — adjust as needed
#define BRIGHTNESS 100   // Global max brightness (0-255)
#define STEP_DELAY 10    // Breathing animation step delay (ms)

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

// ═══════════════════════════════════════════════════════════
//  SETUP
// ═══════════════════════════════════════════════════════════
void setup() {
  pixels.begin();
  pixels.setBrightness(BRIGHTNESS);
  pixels.clear();
  pixels.show();
  Serial.begin(9600);
  Serial.println("NeoPixel Light Show — Ready!");
}

// ═══════════════════════════════════════════════════════════
//  LOOP — cycles through all 4 effects
// ═══════════════════════════════════════════════════════════
void loop() {
  // ── Effect 1: Breathing Yellow (from original sketch) ────
  for (int brightness = 0; brightness < 256; brightness++) {
    setAllPixels(255, 255, 0, brightness);
    delay(STEP_DELAY);
  }
  for (int brightness = 255; brightness >= 0; brightness--) {
    setAllPixels(255, 255, 0, brightness);
    delay(STEP_DELAY);
  }

  // ── Effect 2: Rainbow Cycle ──────────────────────────────
  rainbowCycle(5);

  // ── Effect 3: Color Wipe (R → G → B → clear) ────────────
  colorWipe(pixels.Color(255, 0, 0), 30);   // Red
  colorWipe(pixels.Color(0, 255, 0), 30);   // Green
  colorWipe(pixels.Color(0, 0, 255), 30);   // Blue
  colorWipe(pixels.Color(0, 0, 0), 15);     // Clear

  // ── Effect 4: Theatre Chase ──────────────────────────────
  theatreChase(pixels.Color(127, 0, 127), 50);  // Purple
  theatreChase(pixels.Color(0, 127, 127), 50);  // Teal
}

// ═══════════════════════════════════════════════════════════
//  EFFECT FUNCTIONS
// ═══════════════════════════════════════════════════════════

// Set all pixels to an RGB colour scaled by a brightness value
void setAllPixels(uint8_t r, uint8_t g, uint8_t b, uint8_t bri) {
  uint32_t c = pixels.Color(
    (r * bri) / 255,
    (g * bri) / 255,
    (b * bri) / 255
  );
  for (int i = 0; i < NUMPIXELS; i++)
    pixels.setPixelColor(i, c);
  pixels.show();
}

// Fill pixels one-by-one with a solid colour
void colorWipe(uint32_t color, uint8_t wait) {
  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, color);
    pixels.show();
    delay(wait);
  }
}

// Distribute rainbow hues evenly across the entire strip
void rainbowCycle(uint8_t wait) {
  for (int j = 0; j < 256 * 3; j++) {
    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.setPixelColor(i, Wheel(((i * 256 / NUMPIXELS) + j) & 255));
    }
    pixels.show();
    delay(wait);
  }
}

// Theatre-style running lights effect
void theatreChase(uint32_t color, uint8_t wait) {
  for (int j = 0; j < 10; j++) {
    for (int q = 0; q < 3; q++) {
      for (int i = 0; i < NUMPIXELS; i += 3)
        pixels.setPixelColor(i + q, color);
      pixels.show(); delay(wait);
      for (int i = 0; i < NUMPIXELS; i += 3)
        pixels.setPixelColor(i + q, 0);
    }
  }
}

// Map 0-255 input to an RGB colour wheel value
uint32_t Wheel(byte pos) {
  pos = 255 - pos;
  if (pos < 85)
    return pixels.Color(255 - pos * 3, 0, pos * 3);
  if (pos < 170) {
    pos -= 85;
    return pixels.Color(0, pos * 3, 255 - pos * 3);
  }
  pos -= 170;
  return pixels.Color(pos * 3, 255 - pos * 3, 0);
}

How It Works

WS2812B Serial Protocol
Each WS2812B LED chip receives a serial bitstream at 800kHz. It reads exactly 24 bits (8 each for Green, Red, Blue — in that order), uses them to set its own colour, then regenerates and forwards the remaining bits to the next LED. This is why the daisy-chain works with no extra wiring — each LED is both a receiver and a transparent forwarder.
Breathing Effect — Scaled Brightness
The setAllPixels(r, g, b, brightness) function multiplies each colour channel by the brightness value and divides by 255. This scales colours proportionally — so yellow (255, 255, 0) at brightness 128 becomes (128, 128, 0), preserving the hue perfectly. This technique produces smoother dimming than changing setBrightness() globally, which applies gamma correction and can cause colour shifts.
Rainbow Wheel Algorithm
The Wheel() function maps a 0–255 input to a smooth RGB rainbow by dividing the input into three 85-unit zones — red→blue, blue→green, green→red — creating seamless hue transitions. The rainbowCycle() function offsets each LED's wheel input by its index, spreading the full rainbow across all 72 pixels simultaneously while rotating the pattern over 256 × 3 frames.

Online Simulations

Simulate the full 72-LED light show in your browser — no components, no soldering needed.

🔮
Wokwi Quick Start: Visit wokwi.com → New Project → Arduino UNO. Add a NeoPixel strip component, set count to 72, wire DIN to Pin 6. Paste the sketch above, click Play and watch the full light show — breathing yellow, then rainbow, then color wipes, all in real time.

Applications

🎭
Events
Stage Lighting
🎪
Festivals
Decorative Displays
🎨
Art
Interactive Installs
🤖
Robotics
Status Indicators
🏫
Education
STEM / Mini Projects
🔬
Science
Exhibition Models

Electronics, IoT & Robotics Tutorials for Makers

Home  ·  Original Post

© 2026 MakeMindz · All Rights Reserved

Comments

try for free