Yo, I get exactly what you’re trying to do, and honestly, you stumbled right into a massive hardware timing bottleneck. Don't sweat failing at the first hurdle—this shit is way harder than it looks on paper.
Here is the brutal truth about why you're hitting a wall, and how you can actually make this work.
The Problem: WS2812 Timing is Tight as Hell
The 3-pin LED strips (WS2811/WS2812B) use a single-wire protocol running at 800kHz. The time windows for a high or low pulse to signify a 0 or a 1 are insanely fast, measured in nanoseconds.
A standard 16MHz Arduino Uno or Nano just does not have the horsepower to sit there, accurately sample that incoming raw data stream, parse the bytes, strip out what it doesn't want, and then re-transmit it to other pins in real-time. It'll choke instantly because it spends all its clock cycles just trying to read the incoming pulses.
How the Data Actually Works
The way these strips work normally is pretty clever: the very first LED grabs the first 24 bits of data (8 bits each for Red, Green, and Blue) to color itself, and then it literally chops that data off and passes the remaining data stream down the line to the next LED.
To do what you want—capturing the stream and routing specific chunks to different strips without daisy-chaining them—your intermediate Arduino has to act like a giant, super-fast digital siphon.
How to Actually Fix This
If you want to pull this off, you've got a couple of realistic paths depending on your setup:
- Option 1: Upgrade your microcontroller (Use an ESP32 or RP2040) If you absolutely must sniff the raw WS2812 data wire from an external controller, throw the standard Arduino in the parts bin and grab something like a Raspberry Pi Pico (RP2040) or an ESP32. The RP2040 has a feature called PIO (Programmable I/O). This is a separate, dedicated hardware state machine that can handle the high-speed timing of decoding the WS2812 data stream in the background without burning up your main CPU cycles. Once the PIO dumps the data into an array, your main code can easily slice up that array and spit it out to different pins using standard libraries like FastLED.
- Option 2: Change how the data is sent from the source If you have any control over the original controller, stop sending WS2812 data out of it. Instead, have that master controller send the pixel data via standard Serial (UART), SPI, or over Wi-Fi/Ethernet using a protocol like Art-Net / E1.31. Reading a raw serial packet or an SPI stream is a million times easier for an Arduino to handle. It can grab the whole packet, say "Okay, bytes 1-300 go to Pin 2, and bytes 301-600 go to Pin 3," and blast them out.
- Option 3: Parallel output (If you are just mirroring) If you just want the exact same animation to play on multiple strips at the exact same time without running data wires from the end of one to the start of the next, you don't need code at all. Just split the single data output wire from your master controller and run it to the data-in of all your strips in parallel. Just make sure to use a level shifter (like a 74HCT125) if the wire runs are long, so your signal doesn't degrade.
Bottom line: Trying to sniff a raw 1-wire addressable LED signal with a basic Arduino is a massive pain in the ass. Swap to a faster board with hardware peripherals that can handle the timing, or change the data protocol coming out of the master box.
Good luck with the build, man. It's a tricky puzzle, but once you get the right hardware piece in place, it's totally doable. Maybe Even Uno Q . Mmmhhhmmm