Published: November 14, 2019, Edited by: Mathias Schønning voss

Interactive Neopixel Installation

This was an interactive art project by Mathias Schønning Voss. The aim was to create a decorative installation for the Annual Party at Roskilde University, which would serve as a photo opportunity for party attendees. Guests would then share pictures on social media, creating exposure for the yearly party.


The original concept looked like this:

The installation consisted of 7 rings cut from plywood, measuring 2,5x 2,5m, put together lengthwise using wooden support rods and strips.A length of 5m of neopixels would then be stripped to the inside of the rings so the light would stream down towards the ground.Each foot of the rings would be supported by a 0,5x0,5x0,5 wooden box, which would, on one side, contain a battery power source, an arduino board and an infrared sensor. The neopixels would be coded so when the infrared sensor was triggered (by a person walking through), the neopixels would change colour.

Ring Construction

The number of rings was later changed to 6, since the relative change in color from one ring to the next would be greater and yield a visually stronger effect. The boxes around the feet were scrapped due to safety concerns for the attendees and because batteries proved to be a less than sufficient source of power.

The model with correct dimensions was drawn up in CorelDraw:

Due to the max dimensions of the FabLab CNC machine, each ring was divided into 4 parts.

These were cut on the cnc and assembled using custom laser cut brackets, one on each side, and put together with bolts and wingnuts for easy construction/deconstruction without the need of tools. This also meant the the rings could flex slightlty in 4 different places so as to adjust for an uneven ground surface.

The feet were then made by clamping and screwing leftover wood on each end piece

Smaller, acrylic boxes containing electronics and an arduino were cut to fit on the feet.

Electronics and Code

The power was supplied by a laptop power supply (output 19V 4.74A 90W). Power was serial connected to each ring, before passing through a step down converter, converting the 19V from the power supply to a neopixel friendly 5V.

The code was made using Sharps #SharpIR Library to get data form IR readers and #FastLED to control neopixels.

Firstly, i needed to define parameters for the IR sensor, Arduino and Pixels:

int sensorPin = A1;    // Input for IR reader  
int sensorValue = 0;  
int threshhold = 100; // Defines a threshold for the IR reader  
int hue = 0; // This value is used in place of RGB values

void hsv2rgb_spectrum( const struct CHSV& hsv, struct CRGB& rgb);  
void hsv2rgb_spectrum( const struct CHSV* phsv, struct CRGB * prgb, int numLeds);  
#define HUE_MAX_SPECTRUM 255 // Defines a color spectrum 

#define DATA_PIN    7
#define LED_TYPE    WS2811
#define NUM_LEDS    300 // LEDs per ring
CRGBArray<NUM_LEDS> leds;

#define BRIGHTNESS          96
#define FRAMES_PER_SECOND  120 

Secondly, i needed to define the brightness, datarate and add a delay for program recovery

void setup() {  
  delay(3000); // 3 second delay 

  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);   // tells FastLED about the LED strip configuration

  FastLED.setBrightness(100);// sets master brightness control

  Serial.begin(9600); //Sets the data rate in bits per second


Next, a pre-loop is set up to:

  1. Read the sensorvalue once
  2. Wait 20 milliseconds
  3. Read sensorvalue again

This is to ensure that no accidental glitches/misreadings trigger the light serial

void loop()  
{ // This preloop is to rule out accidental readings

  sensorValue = analogRead(sensorPin);


  if (sensorValue >= threshhold ) // First Reading

    delay(20); // Delay set to one capture the movement of one person at a time

    sensorValue = analogRead(sensorPin); //Second reading to ensure that someone is actually there

    if (sensorValue >= threshhold )


Lastly, if sensor value reading is above the threshold, the following light serial is triggerede

    Serial.println("Person Detected");
      hue = (hue + 42);

      for (int i = 0; i < NUM_LEDS / 2; i++) {

        // Sets a new GRB value using the hue int
        leds[i] = CHSV(hue, 255, 255);

        // Fills up Neopixels in two halves starting from each end
        leds(NUM_LEDS / 2, NUM_LEDS - 1) = leds(NUM_LEDS / 2 - 1 , 0);
        FastLED.delay(20); // Speed of fill



The rings were a success in that they attracted alot of media attention. This is the results when you searched for "RUC" as location on instagram the following day

As you can see, the rings were featured fairly prevalently in the overall activity around RUC around the time of the party

The rings also received the most attention of all mayor installations in a survey of 77 party attendees and comments were generally positive


The wooden frame construction proved too fragile for a rowdy, intoxicated festival audience. At around 1:00, the rings had to be taken down due to people hanging from and running into the rings. A stronger material/design should be considered.