DIY Arduino Ambilight with Prismatik

Dit artikel is overgenomen van mijn oude build blog uit 2018. Een deel van deze info zal mogelijk verouderd zijn, maar wel relevant om een project als deze mee op te zetten.

Veranderingen zijn: nieuwe functies in de software waaronder een betere audio visualiser, stroomlimiet, meekleuren met F.lux en Windows night light.

One of my biggest complaints when using someone else’s computer is a lack of proper lighting. Adding a light source behind your screen greatly reduces eye strains and for that reason I’ve had one of my Philips LivingColors lights behind my screen for years. After searching for some Arduino projects I came across the Adalight project and just how easy it is to add a DIY Ambilight to your screen.

Items required for this project

All the items used for this project were ordered on Ali Express or already in my possession. Shipping to the Netherlands takes about 2 weeks when using Ali Standard Shipping but keep in mind shipping times to where you live may differ.

  • Any Arduino with an USB port such as a Nano or Uno. (€2.50)
  • WS2812 RGB LED strip. (€15 per 5 meters)
    • Don’t forget to measure the length you’ll need. For reference, I used 1 meter to add a strip to the top of 2 23″ monitors.
    • Strips with 30 and 60 LEDs per meter are common. More LEDs will result in smoother colour transitions, but also means a higher power draw (up to 60mA per RGB LED).
  • A suitable 5V DC power supply. The IKEA KOPPLA charger can provide up to 2.5A per USB port, costs €8 and unlike cheap Chinese chargers will not start a house fire.
  • Psieg’s Fork of Prismatik (Win, Mac, Linux).
  • The Adalight WS2812 code.
  • The FastLED library.
  • Basic soldering tools, a spare USB cable, breadboard cables, hot glue, and a cup of coffee to keep those caffeine levels up.

Hooking everything up

Upload the code to your Arduino, cut the strip to length and solder everything together using the schematic below. The shared ground connection is here to prevent things from going craycray. Also if you have a “dirty power” you should add a 220 Ohm resister on between the data line to prevent other minor bugs. If you’re planning on using multiple screens I’d also suggest using male and female headers between each monitor so you can easily connect and disconnect the strips if you ever need to move or replace your monitor.

With everything connected you can now launch Prismatik and configure your newly made Adalight by using the instructions provided by the program. The program supports multiple screens, however you’ll have to add all the LED boxes on one screen and then drag them over to the other screen and resize them accordingly. You can also do this using by editing your profile txt file which can be opened from Prismatik’s profile screen. Once tested you can glue everything to your monitor using hot glue or double sided tape if you haven’t done so already.

Example videos

What better way to demonstrate this project than with some videos? The first video is a combination of demonstration videos and a proper movie example. The second video is the music mode build into Prismatik. Not shown here is the static light setting which just keeps the lights set to one colour.

Edit: Prismatik has been updated with a WAY better visualiser.

Arduino code tweaks

One thing the Adalight code lacks is any form of power management. While power consumption shouldn’t be an issue if you’ve chosen a proper power supply, it can give you just enough headroom to use another charger you may already own. Without it the 64 LED”s I used would draw 2700mA when set to white on full brightness which is 200mA more than my charger is rated for. By adding the set_max_power_in_volts_and_milliamps function I reduced it to a measured 1800mA. Keep in mind this function is far from perfect considering I limited it to 1000mA and still drew 1800mA peaks. I also commented out the red green blue flash when you power on the Arduino as it gets annoying every time you boot your PC.

void setup() {
  // FastLED PWM to limit power consumption
  // Note: always measure the actual consumption! 
  set_max_power_in_volts_and_milliamps(5, 1000);

  // Use NEOPIXEL to keep true colors
  FastLED.addLeds(leds, NUM_LEDS);

  // Initial RGB flash. Enable for debug only
  // LEDS.showColor(CRGB(255, 0, 0));
  // delay(500); 
  // LEDS.showColor(CRGB(0, 255, 0));
  // delay(500); 
  // LEDS.showColor(CRGB(0, 0, 255));
  // delay(500); 
  // LEDS.showColor(CRGB(0, 0, 0)); Serial.begin(serialRate);
  // Send "Magic Word" string to host
  Serial.print("Ada\n"); }Code language: JavaScript (javascript)