Neopixel with RaspberryPI Pico

Updated on 2 November 2022
dev board RaspberryPI Pico
firmware C
firmware C++
chip RP2040
chip WS2812
features neopixel
This tutorial is more than 1 year old. If the steps below do not work, then please check the latest versions and the documentations of the individual tools used.

Before starting


Ensure the following dependancies are downloaded and available:


Try these simpler or similar examples:

Buy the components


Download code pico-neopixel.c
#include <stdio.h>
#include <stdlib.h>

#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/clocks.h"
#include "ws2812.pio.h"

const int PIN_TX = 0;

static inline void put_pixel(uint32_t pixel_grb) {
  pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);

static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) {
  return ((uint32_t)(r) << 8) |
         ((uint32_t)(g) << 16) |

int main() {

  PIO pio = pio0;
  int sm = 0;
  uint offset = pio_add_program(pio, &ws2812_program);
  char str[12];

  ws2812_program_init(pio, sm, offset, PIN_TX, 800000, true);

  while (true) {
    puts("Hello RGB and other colors!");

    // OPTION A: uncomment sleep_ms(500) and view the individual colors
    // OPTION B: comment sleep_ms(500) and view the pixels cascading colors
    put_pixel(urgb_u32(0xff, 0, 0));  // Red
    put_pixel(urgb_u32(0, 0xff, 0));  // Green
    put_pixel(urgb_u32(0, 0, 0xff));  // Blue
    put_pixel(urgb_u32(0xff, 0xff, 0));  // Purple
    put_pixel(urgb_u32(0, 0xff, 0xff));  // Cyan
    put_pixel(urgb_u32(0xff, 0xff, 0xff));  // White
    put_pixel(urgb_u32(0, 0, 0));  // Black or off

    // Clear all pixels
    for (int i = 0; i <= 60; i++) {
      put_pixel(urgb_u32(0, 0, 0));  // Black or off


A photo of the actual setup.

Neopixel with RaspberryPI Pico prototype


Wire up the hardware accordingly

Neopixel with RaspberryPI Pico schematic


This code example creates a simple colored blinky with RaspberryPI Pico board with RP2040 microcontroller using the native C/C++ SDK. It shows how the first pixel is lighted with different colors with option A where a delay of 500ms is placed in between lighting each color. With Option B, where 500ms delay is removed, the cascading of pixel is shown.

Opion A: Displaying individual colors

Download Saleae Analyser File

The logic analyzer traces show the 7 colors.

The logic analyser traces show the Red LED signal zoomed in.

Option B: Cascading pixels

Download Saleae Analyser File

The logic analyzer shows one signal that is cascading with multiple colors.

The logic analyzer shows a zoomed-in signal of the cascading colors.