Self-Regulating Heat Bed for Ultimakers (and other 3D printers)

by TheKre8Group, published

Self-Regulating Heat Bed for Ultimakers (and other 3D printers) by TheKre8Group Jan 29, 2013


Liked By

View All

Give a Shout Out

If you print this Thing and display it in public proudly give attribution by printing and displaying this tag.

Print Thing Tag

Thing Statistics

27647Views 1350Downloads Found in 3D Printer Parts


A heated build platform (HBP) improves printing quality by helping to prevent warping. As extruded plastic cools, it shrinks slightly. When this shrinking process does not occur throughout a printed part evenly, the result is a warped part. This warping is commonly seen as corners being lifted off of the build platform. Printing on a heated bed allows the printed part to stay warm during the printing process and allow more even shrinking of the plastic
as it cools below melting point. Heated beds usually yield higher quality finished builds with materials such as ABS and PLA. A HBP can also allow users to print without rafts. (Source http://reprap.org/wiki/Heated_Bed)

This self-regulating heat bed provide a temperature controlled build platform ideally suited for printing with PLA (green LED) or ABS (red LED).

The original design of this heat bed was made by Scott Mayson (http://about.me/scottmayson), unfortunately it disappeared from Thingiverse. This Thing provide an updated version compatible with currently available parts, as well as detailed instructions guides suitable for all.

You can learn more about this thing on our blog

2014/02/11 - I added "UM_HB_V2-2014.zip" to the file set, nothing has changed but some users have reported compilation issues, so this is an attempt to see if these files fix the issues.


Bill of Material:

To successfully build a heat bed for your Ultimaker you will need:

1x Arduino Uno
1x Arduino Uno Protoshield
1x MK2 Heat Bed http://tinyurl.com/bjqajpt
1x Beefcake Relay Control Kit https://www.sparkfun.com/products/11042
1x Thermocouple Amplifier MAX31855 breakout board  http://www.adafruit.com/products/269
1x Thermocouple Type-K Glass Braid Insulated - K  http://www.adafruit.com/products/270
1x 200x200x4 mm Tempered glass square or aluminium square
1x MeanWell SE-450-12 (12V 37.5 A)  http://www.meanwell.com/search/se-450/default.htm
3 inch wide Kapton Tape

About the wires, you will need

  • Single core wire for PCB connections
  • Multicore wire for connecting to the BeefCake Relay
  • Large gauge wire (capable of handling 40 A) to power the Arduino and the Heat Bed

Assembly and Configuration Instructions:

  1. Assemble the components according to the schema
  2. Fix the thermocouple to the underside of the heat bed using kapton tape, make sure the tip of the thermocouple is near the center, but not in the hole.
  3. Place the heat bed in the middle of the 10mm acrylic build platform and drill holes accordingly
  4. Use 3mm worth of washers to lift the heat bed from the 10mm acrylic build platform and secure in place using appropriate bolts
  5. Place the kapton tape covered tempered glass square in the middle of the heat bed and secure in place with kapton tape
  6. Calibrate the new build platform by adjusting the 4 level screws and the Z contact switch
    7.1. Power up and preset the heat bed to PLA (green LED) and wait for it to reach its maximum pre-set temperature (when the relay switches off)
    7.2. Using a laser thermometer, measure the temperature in the middle of the build platform.
    7.3. Adjust threshold1 and threshold2 in the Arduino code until the heat bed self regulates to a temperature between 50-60°C
    7.4. Repeat until the desired operating temperature is achieved
  7. Activate the ABS pre-set (red LED) and adjust threshold3 and threshold4 in the Arduino code until the heat bed self regulates to a temperature between 105-115°C

Usage Instructions:

  1. Power up the heat bed and wait until the desired pre-set reach its maximum temperature
  2. Pre-heat the Ultimaker extruder using the Ulticontroller feature
  3. Thoroughly clean the build platform using 99% IPA and a micro-fibre cloth
  4. Lauch the print job
  5. Wait and wait.... until the job finishes
  6. Power down the Ultimaker and the heat bed
  7. Let the build platform cool until the part(s) pop up automatically (may take some time, do not pull on the parts as it will decalibrate the build platform level and deform your parts).

More from 3D Printer Parts

view more

All Apps

Upgrade this Thing with Thingiverse Apps

Tools and Utilities

Repair, slice, or enhance this Thing

Auto-magically prepare your 3D models for 3D printing. A cloud based 3D models Preparing and Healing solution for 3D Printing, MakePrintable provides features for model repairing, wall thickness...

App Info Launch App
Comments deleted.


Yes it's a momentary switch.

You might have bad wiring, the clicking is the relay switching back and forth. In the code it's triggered by the temperature sensor reaching it's target, if it's clicking all the time it might be that you have bad temperature sensor readings... check the wiring.

Good luck !

Alright so my red and yellow wires for the temperature probe were reversed (whoops) so I fixed that.

The reason I initially used a standard on/off switch is because all the push button momentary switches I have can only accept two wires so l used a 3 pole toggle switch. Do I need a momentary switch that can accept 3 wires? If so where do I find one because I can't find it anywhere?

If not how do I wire it? Currently now I can switch between the two settings but the relay never turns on now and the led on the beefcake doesn't light up either. Thanks again

I used a 4 pin momentary button, such as

The four pin are shorted when the button is pressed, wired as per the diagram.

well I have no idea what my problem is now. I double checked the wiring and tried all kinds of things. https://youtu.be/mtkTowpW6Hc

Hi, I think your button might need debouncing. But beyond that I think you need to disassemble everything and start over using a breadboard. Add some printf's at the various logic points in the code to see where it's branching and with what value.

It shouldn't be this complicated.

I am currently facing the issue of when the relay closes and the heating pad is heated to the threshold2 value, when the relay opens to not allow the flow of current the C= readout jumps up by almost 10 units. The same is when it cools down to threshold1, the C= readout drops by almost 10 units. It is only when the relay kicks on and off. Do you know what may be the problem? The code?

I really don't know, is it a real temperature jump (externally validated) ? have you tested your thermistor on known temperatures sources to make sure it works properly? if it works correctly, have you tried moving your thermistor to a different location? perhaps it is directly on the heating elements which react quickly to current.

So are earlier stated by nissin, they were having a problem with the program saying "MAX31855 does not name a type" and the code "MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);" gets highlighted. I have the UM_HB_V2 code to include #include which is the name of both the library and the cpp and header file. What else could be causing this problem?

Hi, you also need to add Adafruit_MAX31855.h in the Arduino IDE library, through the menu. That solves the problem.

Thank you it resolved the problem!

So I have everything wired correctly and I was testing it last night (just the heated pcb), and I got it up to 120 and it ran for almost 45 mintues with no problems. Now that I have it installed with a cork matt underneath it and borosilicate glass on top of it, it will run for a while, then the output temp will start displaying "nan". If I reset the arduino, it will work for a minute or so, then go back to "nan". Does that mean "not a number"?

Thanks for the help

"nan" is not a number. So the Arduino reading is 120C, what is the actual temperature of the board (with thermometer)? Perhaps you are exceeding the expected range of read temperature and it's causing the input to be out of bound.

Also, I read on an Adafruit tutorial for the max31855 that sometimes the output can get very noisy and they suggested soldering in a 0.1uF or 0.01uF capacitor to the terminals of the thermocouple. Neither of these options helped. NAN still comes up within 30 seconds. It will also display that whether there is power going to the bed or not, because I thought maybe the 12V wires are created feedback/noise in the thermocouple but it looks like it will display that regardless.

When I ran it up to 120 C it ran for almost an hour fine. But now that it's installed, I'm printing with it set at 70 C and sometimes it takes a few seconds to show NAN, other times it takes 5 minutes. I've only had problems with it since I've installed the bed in my printer. Could the thermocouple be shorting out somewhere?

For anyone else having this problem, I deleted the 4 " thermocouple.readCelsius();" out of both sections of code and changed
" curtemp = (1-movavg)curtemp + movavg thermocouple.readCelsius();" to
" curtemp = thermocouple.readCelsius();"
in both sections. Made sure both leads for the thermocouple were nice and tight, seems to have worked.

I've ordered the parts and I'm installing the code and verifying it just to see everything's correct. When I open UM_HB_V2.ino and verify it, Adafruit_MAX31855.cpp and Adafruit_MAX31855.h load, but I get an error saying "MAX31855 does not name a type" and the code "MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);" gets highlighted. I've added the .cpp and .h files in a folder named Adafruit_MAX31855 in my library directory. What am I missing?

Thanks for the help with my previous question.

Yes, and if I go to sketch -> import library it says "library already exists".

Hi, I figured it out. You added "Adafruit_MAX31855", however the code includes "MAX31855", as such you can either modify the code to say "#include <adafruitmax31855.h>" or rename the library (drop the "Adafruit"). I've uploaded a new archive of the code to include the MAX31855.h and MAX31855.cpp.</adafruit_max31855.h>

Ohh, I got it now. I wondered if that was calling an invalid name, but I didn't know if it wanted a file, or the folder name where the file was. I have it working on both my mac and windows computers now. Thanks for the help.

Hi, it works for me. Have you added the MAX31855 library to the IDE library path (sketch -> import library) ?

I didn't know the "Library" folder needed to be installed inside the UM_HB_V2 folder with the .ino file. I was installing it into the standard library folder that showed up when I installed the Arduino IDE. Can't wait to try this when my parts come in, thanks.

I don't think it needs to be, I think it can be anywhere. The big thing for you is the naming of the library, it should compile with the renaming. If it's still a problem, perhaps visit your local hackerspace, they will be able to help.

I've been looking for a stand alone bed heating option for a while now and I just had a few questions.
One black wire from the ATX breakout board powers the Uno, what is the second black wire for in the picture?
Do we use the MeanWell SE-450 spec'd in the instructions to power this instead of the ATX breakout you used in the pics? Or Both?
Does this code use a bang bang method or PID?


Hi, the MeanWell SE-450 can power both (that's what we use). The heat-bead requires 12V @ 20A or 240W, and an Uno can consume up to about a 10W at its peak, as such it's just about half of what the power supply delivers. So you're safe. However if a MeanWell isn't available, you can use the ATX breakout, just make sure the 12V channel can deliver enough power.

For anyone having issues powering / warming their heatbed - using the ATX Breakout board pictured here, see this image for a likely cause (Remove the poly-fuse of the 12v rail .. mine was labeled '@200' - replace with a blob of solder)


hi thanks for the response

i just got a inferred thermal sensor and used it on my old prussa mendel found in C it to low but in F it very near

i haven't tried my big baby because of the mendel readings , are we using Fahrenheit or centigrade ?????

heres another one can i program the second hot end to work as a second bed

i found i am getting to old to work out how to do it


If you already have an ulticontroller, wouldn't you eliminate the arduino+thermocouple amplifier and simply connect the thermocouple+relay directly to the ulticontroller?

Yes, but it wouldn't be as fun. :)

how would i do four heat beds as my new machine has four and i am at aloss what to do
i have a controll unit which uses k type censers but when i put it on my old Mendel and it reads 60 c ?????
regards bill

Hi Bill, my first guess would be that your 4 heat beds are under powered. Each heat bed pulls around 20Amps, as such if your PSU is unable to provide the 80Amp needed to fully power the 4 heat bed, then they wont be able to reach their target temperatures settings.

Hi Bill, There are a thousand things that can be off, but my first guess is that there is not enough power. Each heat bed pulls 20Amps, if your PSU can't provide 80Amps then the 4 heat beds will be underpowered and unable to heat up properly.

Alternatively, as each heat bed are slightly different they may need independent controllers to enable them to each reach their target temperature.