Introduction: Custom RGB LED for 52pi ICE Cooling Tower

52pi came up with a pretty insane cooling solution for Raspberry Pi 3B+/4B+ boards. The ICE Cooling Tower! This thing not only looks like a beast but also cools down your Raspberry Pi 4 board extremely well (cooling benchmarks).

If you want to keep your Raspberry Pi cool as ICE - you can grab the board from these shops:

Unfortunately, this amazing heatsink comes with limitations. There are no means of:

  • Fan speed controls
  • LED controls

This instructable is based on my work from this article and will show you how you can upgrade your ICE Cooling Tower - to achieve this pretty awesome cooling solution. This mod comes with the following features:


  • RPM control via PWM
  • 3 WS2818b RGB LEDs (programmable)
  • Custom Fan Profile
  • Temperature to Colour script


To perform this mod you will need:

  • 3 x RGB LEDs WS2812B (addressable)
  • 1 x 2N2222A331 NPN transistor (I got it from this set)
  • 1KΩ Resistor

Some wire, soldering iron and heat-shrink will be also needed.

Step 1: Modifying Hardware

The ICE Cooling Tower connects to 5V and GND pins on a Raspberry Pi board. A small PCB hidden behind the fan powers up the fan and picks random colours for 4 surface mounted RGB LEDs. To start our mod, we have to take the fan apart and desolder the LEDs.

These are seriously small, so all it takes to get it off from the PCB is some heat from the soldering iron. Just heat up one side and wiggle the iron a little – the LED should come off without issues. I used 375ºC to achieve this.

Step 2: Adding Custom RGB LEDs

I salvaged one of the RGB LED strips from a previous project. I only needed 3 individually addressable WS2812b LEDs. To make the diodes fit, I sheered some of the strip off. Then I used a thin wire to connect all of them, creating a 3 LED long strip.

I also added extra wires to the 5V and GND pads on the PCB as this is how I'm going to feed my mini LED strip. You can use some glue to keep the LEDs in place. This is how the finished fan mod should look like.

Step 3: RPM Control

The easiest (but there are more sophisticated ways) of controlling a DC motor is to use a PWM signal to limit the RPMs of the motor. Since the ICE Cooling Tower fan comes with no such controls I can use 2N2222 series transistor to control the fan’s speed.

The base of the transistor needs a 1KΩ Resistor to limit the current from the GPIO. Use heat-shrink to separate each pin and prevent accidental shorts. Then simply cut the power wires and resolder everything based on the diagram.

You should have 3 wires now: signal, 5V and GND. You can glue the transistor to the bottom of the fan. It’s time to add some colour to my project.

Step 4: Driver in NodeRED

At this point, you could write a driver in Python, but since I already have NodeRED running, I took upon the challenge of creating an interactive driver for the coolest heatsink for Raspberry Pi 4. It’s actually easier than I thought it would be.

I’m going to use 3 nodes to monitor Raspberry’s CPU, control GPIO and the WS2812b LEDs:


The neopixel node relies on a Python driver, so I also had to install:

curl -sS | bash

I have 4 wires to connect:

5V - Power Supply
GPIO23 (or any PWM pin) - 2N2222’s base pin

Injecting a payload every 5sec to the CPU node provides me with the core’s temperature. Based on this value I can create the brackets for colours of the RGB and adjust the fan RPMs.
I’m going to use NodeRED 1.0 environmental settings in subflow to create a config node which lets me set the values that flow will use. For RPMs, the value is 0-100 and for RGB I need to pass the number of LEDs (3) and the colour (this list).


Colour names are assigned in the setting subflow. I picked 7 colours representing the temperature levels. The hotter the core gets, the warmer the colour. Neopixel node just needs the number of pixel in the string. Function Node: Fan Colour Profile

var colour1 = flow.get("colour1");
 var colour2 = flow.get("colour2");
var colour3 = flow.get("colour3");
var colour4 = flow.get("colour4");
var colour5 = flow.get("colour5");
var colour6 = flow.get("colour6");
var colour7 = flow.get("colour7");
var temp = msg.payload;
if(temp<= 33){msg.payload = colour1; }
if(temp<= 35 && temp >33){msg.payload = colour2; }
if(temp<= 38 && temp >35){msg.payload = colour3; }
if(temp<= 42 && temp >38){msg.payload = colour4; }
if(temp<= 45 && temp >42){msg.payload = colour5; }
if(temp<= 48 && temp >45){msg.payload = colour6; }
if(temp >48){msg.payload = colour7; }
return msg;


RPMs are set based on the % value 0-100. My fan struggles to spin on PWM set lower than 30%. My setup keeps the fan off until the CPU core reaches 40ºC. It ramps up to 30% then 50% and 100% if the temperature crosses 60ºC. The GPIO node is set in PWM mode at a frequency of 30Hz. For some reason, I can actually hear the motor whine at lower RPMs. It’s not loud but it’s there. The sound goes away when fan spins at 100%.

var speed1 = flow.get("speed1");
var speed2 = flow.get("speed2"); var speed3 = flow.get("speed3");

var temp = msg.payload;

if(temp<= 40){ msg.payload = 0; }

if(temp<= 50 && temp >40){ msg.payload = speed1; }

if(temp<= 60 && temp >50){ msg.payload = speed2; }

if(temp >60){ msg.payload = speed3; }

return msg;

Entire NodeRED flow can be downloaded from

Step 5: Final Effect

This is no doubt the coolest heatsink for Raspberry Pi 4. With this simple mod, you can add life to your project. Nothing stops you from displaying different things using the LEDs. For the majority of the time, ICE Cooling Tower keeps the Raspberry Pi 4 under 40C, so it’s silent. The fan kicks in when it has to. What do you think about this project?

In addition, if you want to get informed about the updates to this or other projects - consider following me on the platform of your choice:

and if you feeling like buying me a coffee or supporting me in a more continuous way:

I hope you have enjoyed the project! Check more projects out on

Make it Glow Contest

Participated in the
Make it Glow Contest