Ben Heck Reflow Oven

Many months ago I worked on a reflow oven at Ben Heck’s shop over a couple of weekends.  It worked out pretty well and he included it in an episode

I used a toaster oven, two thermocouples and readers, one of Ben’s homemade Arduino boards, an LCD screen, and a solid state relay.

Many of the parts can be found from the distributor Newark or

Thermocouple reader –
Thermocouples  –
Arduino –

For the toaster oven, look at rummage sales or resale stores. The dumber the interface the easier it is to take over with a solid state relay instead, and you definitely want a top and bottom element for more even circuit board heating. I’ve heard of issues with reflow ovens with only one.

For modifying the profiles-

int profile[4][6] = {
75,140,45,125,205,20 }
75,140,45,125,205,20 }
75,140,45,125,205,20 }
75,140,45,125,205,20 }
String profileNames[4] = {
“Ol’ Fashioned Pb”, “New Fangled RoHS”, “Profile 3 “, “Profile 4 ”

The format of the profiles is:

{Ramp 1 0-255, 1st target temp, hold seconds at 1st target, Ramp 2, 2nd target temp, hold seconds at 2nd target}

Ramp rate is kind of a misnomer, its just the analog write value but because our relay is a zero cross and we aren’t accounting for the cross, it doesn’t exactly work as good as a PWM value would.


The ROHS profile definitely needs changing, probably a 220 target. Your results may vary but you will definitely have to tweak for your own oven and possibly it could change depending on your board as well.


Attached at the end of the post is the code.  For more discussion on the project or for links to Ben’s wooden cut panel, go to the thread on the Element14 forums


Arduino code:

Reflow Oven Code

Great Glue Gun Recap!

I recently helped out behind the scenes of the two part Ben Heck Great Glue episode. I did the electronics design, assembly, and firmware for Ben. He put that with the mechanical part of the extruder, changed out the trigger, and packaged it up real nice for the episode. As he rarely does write ups I thought I’d post the code (pre hall effect) and the parts I remember using for others to follow in the great glue gun foot steps.

Here is a partial working demo early in the process


Here are the two episodes-


Original Parts – Sparkfun

H-Bridge $2.35

Trigger Pot (retired)

SSR $4.95

Proto board $2.95

Wall Wart 9V $5.95

Thermistor 10k $1.95 (I think I ruined one and ended up using a 100k though)

RGB LED $.95


By request I cross referenced what I could for Newark , they should be available at as well

BenDuino (Ben’s custom Arduino Uno, link is similar but larger) –

H-Bridge –

Trigger Pot – Sorry no cross reference for this sweet product 🙁


Proto board with ground plane – No cross reference

Wall Wart 9V –

Thermistor 10k –

Make sure to change the code to use the 10k, I ruined my 10k’s after a few prototypes, jbweld is too strong.  Anyways I used 100k’s, it’s an easy code change and 10k is more often used

RGB LED we used 10mm not a 5mm –


#include <math.h>
#define MotorENPIN  3
#define Motor1APIN  2
#define Motor2APIN  4
#define Light1PIN  5
#define Light2PIN  6
#define minSpeed 50
#define maxSpeedLow   90
#define maxSpeedHigh  160
#define meltTemp 235
#define speedTempOffset 25
//#define SSRPIN    7
#define ThermistorPIN A0                 // Analog Pin 0
#define TriggerPIN  A1
//#define TempSetPIN  A2
boolean extruding = false;
boolean atTemp = false;
int maxSpeed = maxSpeedLow;
int updateCount = 0;
int setTemp = 0;
int reqSpeed = 0;
int setSpeed = 0;
int temp;
int count = 0;
float pad = 100000;                       // balance/pad resistor value, set this to
                                        // the measured resistance of your pad resistor
float thermr = 100000;                   // thermistor nominal resistance
float Thermistor(int RawADC) {          //converts thermistor reading into a resistance and then temperature in C
  long Resistance;
  float logVal;
  float tempTemp;  // Dual-Purpose variable to save space.
  Resistance=((1024 * pad / RawADC) – pad);
  logVal = 3950/log((float)100000/Resistance);
  //T2= T1*B/ln(R1/R2)  /  ( B/ln(R1/R2) – T1 )
  tempTemp = (25+273.15)*logVal;
  tempTemp = tempTemp / (logVal-(25+273.15));
  tempTemp = tempTemp – 273.15;  // Convert Kelvin to Celsius
  tempTemp = (tempTemp * 9.0)/ 5.0 + 32.0;                  // converts to  Fahrenheit
  return tempTemp;              // Return the Temperature
void setup() {
  pinMode(MotorENPIN, OUTPUT);
  analogWrite(MotorENPIN, 0);
  pinMode(Motor1APIN, OUTPUT);
  digitalWrite(Motor1APIN, LOW);
  pinMode(Motor2APIN, OUTPUT);
  digitalWrite(Motor2APIN, LOW);
  pinMode(Light1PIN, OUTPUT);
  digitalWrite(Light1PIN, HIGH);
  pinMode(Light2PIN, OUTPUT);
  digitalWrite(Light2PIN, LOW);
  //pinMode(SSRPIN, OUTPUT);
  //digitalWrite(SSRPIN, LOW);
void loop() {
  int readTemp = Thermistor(analogRead(ThermistorPIN)); // read ADC and  convert it to F
  if ((readTemp > 0) && (readTemp < 500))
    temp = readTemp;
  //setTemp = analogRead(TempSetPIN);
  //setTemp = map(setTemp,0,1023,50,350);            //analog reading 0-1023, temperature range 50 to 350F
  if (temp <= meltTemp){                            //if less than set temp, turn on SSR, set lights
    //digitalWrite(SSRPIN, HIGH);
    digitalWrite(Light1PIN, LOW);
    digitalWrite(Light2PIN, HIGH);
    maxSpeed = maxSpeedLow;
    atTemp = false;
  if ((temp > (meltTemp + 5)) && (temp <= meltTemp + speedTempOffset)){  //if greater than set temp but less than set temp + 10, set lights
    digitalWrite(Light1PIN, HIGH);
    digitalWrite(Light2PIN, HIGH);
    maxSpeed = maxSpeedLow;
    atTemp = true;
  if (temp > (meltTemp + speedTempOffset + 5)){                        //if greater than set temp + 10, turn off SSR, set lights
    //digitalWrite(SSRPIN, LOW);
    digitalWrite(Light2PIN, LOW);
    digitalWrite(Light1PIN, HIGH);
    maxSpeed = maxSpeedHigh;
    atTemp = true;
  reqSpeed = 1023 – analogRead(TriggerPIN);
  if (reqSpeed < 3){                                 //if less than 3 (deadzone) and was extruding, reverse the motor to suck in the gluestick
    if (extruding == true && count >= 450){
      analogWrite(MotorENPIN, 0);
      digitalWrite(Motor1APIN, LOW);
      digitalWrite(Motor2APIN, HIGH);
      analogWrite(MotorENPIN, 125);
      setSpeed = 0;
      analogWrite(MotorENPIN, 0);
      extruding = false;
      count = 0;
    else{                                              //if less than 3 (deadzone) and was not extruding or reverse timed out, turn off motor
      count = 0;
      analogWrite(MotorENPIN, 0);
      setSpeed = 0;
  else if (reqSpeed > 5 && atTemp == true){                              //if greater than 5 (deadzone), turn on motor mapped to stick, 5-1023 reading 50-150 motor, set extruding
    if (count < 450)
    setSpeed = map(reqSpeed,5,1023,minSpeed,maxSpeed);
    digitalWrite(Motor1APIN, HIGH);
    digitalWrite(Motor2APIN, LOW);
    analogWrite(MotorENPIN, setSpeed);
    extruding = true;
  if (updateCount <= 250)
    updateCount = 0;
  //writeUpdates();                                      //for debugging
void writeUpdates(){
  Serial.print(“Temp: “);
  //Serial.print(“Req Speed: “);
  //Serial.print(“Set Speed: “);
As always code and parts list offered without warranty and very little support but you can always shoot me an email and I’ll see what I can do 🙂


Also, if you have questions regarding this project, I did a little write up on Element14, any Ben Heck questions and suggestions should go there, it’s a helpful community with better knowledge base than just me (though I do contribute a lot there).


Oh, and look for a reflow write up in a few weeks.  Ben ended up doing a few episodes on the toaster reflow oven I was working on at his shop.