How to Build a Hot Plate Reflow Oven

I’ve been building surface mount circuit boards by hand with a hot air gun. It is slow, tedious, and error-prone. I looked into buying a reflow oven but after reading reviews of inexpensive ovens — poor temperature regulation, bad interfaces, dangerous construction — and looking at alternatives (hot plates, toaster ovens, …) I finally just decided that nothing had the necessary attributes. So, I’m building my own reflow hot plate from scratch.

A reflow oven is a device for melting solder paste on a circuit board such that the paste smoothly melts and surface mount components self-align.


A good reflow oven is distinguished by only two characteristics.

  1. The oven must accurately follow the right temperature curve for reflow.
  2. The temperature across the circuit board should be uniform during the phases.

This is pretty hard. Below is a generic reflow temperature curve (courtesy STMicroElectronics):

Reflow curves showing safe ranges and results of bad curves

From the STM datasheet:

A typical profile consists of a preheat, dryout and reflow sections.
The most critical point in the preheat section is to minimize the temperature rise rate to less than 2 °C/second, in order to minimize thermal shock on the semiconductor components.
The dryout section is used primarily to ensure that the solder paste is fully dried before hitting reflow temperatures.
Solder reflow is accomplished in the reflow zone, where the solder paste is elevated to a temperature greater than the melting solder point. Melting temperature must be exceeded by approximately 20 °C to ensure quality reflow.


Before getting into the hot plate, a short discussion of alternatives.

Hot Plates or Griddles

This is the quicky ‘oven’ of choice for folks like Sparkfun. Note that they own and use a real oven. I bought the cheapest hot plate on Amazon and my opinion was that it didn’t heat fast enough, it wasn’t at all uniform temperature, it didn’t cool fast enough, and finally it was really poorly built and dangerous (like it had a grounding strap inside that wasn’t connected to ground). Pass.

Toaster Oven

This seems to be the ‘hacker’ choice with lots of home-built computerized control systems. Again, this had problems with uniformity and heating and cooling rates. It also suffers from inability to easily watch the process. It does work with double-sided boards, which this hot plate does not. My boards are single-sided.

The Hot Plate

On to the actual hot plate.

Temperature Units

I used Fahrenheit for all my testing for two reasons. (1) I’m used to Fahrenheit. When I see 400F I know it’s really f**king hot. When I see 200C I go — hmmm, bet it’s hot and (2) It gives me more resolution since, like most folks, I think in integers and so I get 9/5 the resolution of C.

Hardware Summary

The hot plate is made from a block of aluminum and a heat sink. It is heated by two cartridge heaters and there’s a thermocouple to measure the temperature.

Controller Summary

The controller consists of a Raspberry Pi (soon ZeroW), a thermocouple amplifier based on a MAX31855, and a small I2C OLED display. In addition there’s a 25Amp Solid State Relay that says it is zero-crossing.

Hardware Details

I had some 1/4" thick 2.5" wide aluminum stock around so I cut 5 pieces. Four were 2.5x5 and one (for the base) was 2.5x10. I screwed the four pieces together to produce a 1"x2.5"x5" ‘block’ of aluminum. Then I drilled two 3/8"x4" deep holes from the top of the block (which was unbelievably a pain in the a**). Use a drill press and some cutting fluid. I started with two 1/8" pilot holes and then jumped straight to 3/8".

The plate: pre-drill, drilled, and with two heat cartridges on top

I tested this block with the two heat cartridges installed and it didn’t heat fast enough and cooled down much too slowly. Just not enough control.

So, I reduced the amount of aluminum by removing the two outside plates and using a heat sink as a third plate instead. I smeared an extremely fine amount of copper paste between the aluminum layers to help with heat transfer. That produced this (with sample circuit board):

The hot plate. Note the heat sink isn’t touching the base.

In the picture above, the thermocouple is shown with the alligator clip. I haven’t decided where to attach it yet. The two cartridge heaters each provide 200W of heating power so this is a 400W very small hot plate (2.5"x5"). There are many other cartridges available with more power and longer lengths so that it’s easy to use enough cartridges for lots of power — which enables fast heating rates and a uniform temperature plate.

Controller Detail

There’s not much to the controller.

I started with a Feather Huzzah32 as processor with Micropython installed for simplicity of debugging (all of the software fits onto a single sheet of paper) and it has Wi-Fi telnet (which helps keep ‘real computers’ from any AC power).

For now, I’ve connected it all up on a prototyping board.

The controller on a proto board

Testing and Calibration

I took the finished unit and put everything into a ‘chassis’ I had lying around. It looks like this. On the lower right is the solid state relay with heat sink. At about 400W this barely gets warm.

On the lower left is the control system and then at the top middle is the hot plate and the thermoucouple (under the tweezers).

For this next phase I need to find out how quickly the plate heats and cools, whether I can convince it to maintain a fixed temperature, and how to fundamentally generate the desired reflow heating profile.

For my first test, I just turned on the two cartridges, waited until they hit about 400F and then turned them off. I plotted temperature vs time with the thermocouple resting on the top.

Simple on/off cycle to show heating and cooling rates

Before continuing, I coated the two heat cartridges with copper paste and then reinserted them into the plates. This should improve heat transfer and increase the heating rate.


Well, as usual, things didn’t work all that well. There were two major issues:

  1. The Esp32 Python is a nice implementation but it runs out of memory constantly and doesn’t support threads. I had to stop using it and switch to a Raspberry Pi. Once it’s working well I’ll move to a Pi ZeroW but getting real Python3 with threading is necessary to get good SSR timing.
  2. The solid state relay does not switch with 3V input despite claims to the contrary. With the Raspberry Pi (not the Esp32) the output does just barely switch the relay but at that voltage the LED doesn’t light which is useless for testing and dangerous. It works best with 5v so I added a 2-component switching circuit made from a transistor.

Overall Re-Design

Here’s a block diagram showing the current system:

System Block Diagram

Next, there’s a control program written in python that follows a temperature profile script containing target temperatures and times. It can switch the SSR on and off to simulate a PWM (pulse-width-modulated) voltage method.

I have a class that takes two arguments: percent on and cycle time. It turns the SSR on then off then on then off … following the cycle time and percentage on. It’s in a thread to get reasonable consistency.

The time constant of a heater element is very long so the cycle time is probably about a second. Since the SSR is zero-crossing this implies an error of ±1/60 second per cycle (two AC voltage half-cycles). To test the PWM I plugged the heater into a KillAWatt and looked if the wattage requirement was close to the percent on value — and it was.

Testing and Calibration

Now that the Pi and hardware seem to be working well, back to testing and calibration.


Breathing: I wore a face mask for vapors for the first few full temperature runs as random awful stuff burns off.

Power: you can’t see in the photos but the Earth Ground from power (the third pin) is connected straight to the metal surfaces so electrocution should be remote.

Heat: obviously the hot plate when heated up is incredibly dangerous!


Do not touch the Hot Plate. Do not touch the Hot Plate.

If you build the hot plate like I did (make absolutely sure the heat sink does not touch the lower plate) the lower plate ends (and screw mount) will be almost at room temperature even when the hot plate itself is at 450°F.

Two things need to be tested for temperature information.

Heating Rate and Cooling Rate

These are measured at 100% and 0% power settings. Any power levels lower than 100% will heat more slowly so we’re most interested in maximums — since the usual temperature profile actually allows substantially faster heating than I can do with <500W.

First, I burned in the system by running at about 450F for a while. This seemed to burn off the copper paste pretty noticeably (i.e. lots of smoke).

To get the heating rate I did a least squares slope approximation on the measured heating curve. This gave me a heating rate of 0.92°F/Second — well below the maximum of 3°C/Second. So, 460W is a fraction (1/4?) of the allowed maximum power.

Steady State Temperature per Power

This can be calculated from one or two measurements. While I first ran mathematical models to ensure I wasn’t completely dumb, due to air pockets and irregularities it makes most sense to empirically (test) values.

I did this by heating up the plate to a desired temperature then setting the duty cycle. Otherwise lower duty cycles will take forever to get to a steady state.

  • duty cycle -> temperature
  • 20 -> 293°F ( 145°C)
  • 25 -> 340°F ( 171°C)
  • 30 -> 375°F ( 190°C)
  • 45 -> 425°F ( 218°C)

Not only are these roughly steady state, but using these duty cycles the rate of changes gets very slow in a large range around the steady state.

First temperature profile

This is the second iteration of a script. It’s very simple but reasonably close — other than cooling is too slow because there’s no fan.

Thermocouple Measurements with a Sample Profile

This is: Full heat to 240°F, 85% to 300°F, Full heat to 360°F, Run 15 seconds at 30%, Turn off

Second temperature profile

The first profile didn’t get hot enough. The solder paste spec says you must exceed melting point by 20°C for best results so I bumped up the stop temperature.

Also I wanted to add a fan for the decrease to improve the cooling speed. The plan is to add an aluminum ‘cover’ to allow for a pretty serious fan that doesn’t hit the components but goes through the heat sink. This simple test just had a muffin fan about 1 foot from the unit.

Thermocouple Measurements with a Sample Profile

Note that the solid blue lines that drop to zero indicate when things change in the script. At 240°F I lower the rate of heating to 85% to give enough soak time. At 300°F I go back to 100% heating. Finally at 390°F the heaters are turned off so it will produce a fat peak and then start dropping.

Comparing this to the desired temperature profile it’s clear that the unit does not heat up as fast as the spec would prefer. One approach would be to remove the heat sink — reducing the thermal mass but making cooling difficult. Instead, I am buying the 500W heating cartridges (twice my current power) to test with but I’ll bet these work ok.

First Test

Here’s a photo of the first run with a circuit board (partly populated). It looks very good :)

First Board attempt with a few parts

I checked impedances and tried hard to remove chips. Everything seems right. W00t.

Real Boards

I’ve now run two full boards through the ‘oven’ and both produced perfect results. No solder bridges, no cold joints, no parts shifting.

Adding a Fan

I’ve been using a mediocre muffin fan just pointing at the oven. I’m switching to a shroud covering and a faster fan. The better fan is 12V nominal and at 6V it runs at perhaps 50%.

Test fan shroud

I’m also about to increase the power handling of the heating cartridges, so time for better testing of heating and cooling rates. Here I heated up to 400F and then turned off the cartridges and (maybe) ran the fan. These are least squares estimates from the thermocouple data.

Fan Status  |   Cooling Rate
None .35°F/Sec
6V 1.2°F/Sec
12V 1.6°F/Sec
Heating Rate: starts around 1.4°F/Sec and decreases to 1°F/Sec near 400F.

The fan would be more testable with a PWM DC input but I couldn’t find any FETs lying around that would take the 3–6W of a fan.

500W Cartridges

I swapped out to 2 500W cartridges and here’s a comparison of the actual vs desired profile, with the fan on when it hits peak temperature.

Actual vs Desired with 2 500W Cartridges

As you can see, the match is very good — and this is with no real tweaking.

Using this script…

  1. Heat to 220 ºF at full power
  2. Heat to 300 ºF at 25% power to soak
  3. Heat to 385 ºF at full power
  4. Turn off heat and turn on fan full

I get the following temperature profile:

Semi-final actual profile for 63/37 Solder

Looking at one specification, I’m spending about 63 seconds above liquid temperature (360F) and it should be 60–150 so I’m going to lengthen the time simply by not turning the fan on so soon or running it at a slower speed — let it stay liquid for another 20–30 seconds maybe. On the other hand, looking at it while it was cooking, the solder starting melting at around 351F.

This video is real-time (starting at around 200F), not time-lapse; it starts melting at around 2:32.

Finally, I built a shroud out of .025 aluminum from Lowe’s. It’s easy to cut and drill and doesn’t tear.

Final Reflow Hot Plate with Aluminum shroud

Note the fan is still just driven by a lab supply instead of a PWM off the Raspberry PI as it should be.

Last Words

I decided to finish this up rather cleanly and purchased an Adafruit DC Motor Hat for the Raspberry Pi. It’s huge overkill but it includes 4 FET drivers that can handle the relay and the fan motor and it has a small prototype area. The end result is very clean and now the fan is PWM speed controllable.

Here’s a picture of the Pi and Hat:

Raspberry Pi and DC Motor Hat Complete

The leftmost wire pair goes to the fan. The second pair goes to the relay. You can’t see this, but under the hat I’ve wire-wrapped the Oled display and the temperature monitor. They plug into sockets on top. So, this is the entire controller.

I used the following temperature controls:

1. Full power to 220F
2. 25% power to 300F
3. Full power to 385F
4. Power off at 385F
5. 50% fan for 10 seconds
6. 100% fan for 20 seconds
7. 35% fan for 45 seconds
8. Full fan for 3 minutes (cooldown)

Which produced this temperature profile:

Final Temperature Profile

The line graph drops show when things occur. Soak time is about 90 seconds and time at liquid is about 80 seconds — both well within spec.