Introduction: DIY Digital Soldering Station (Hakko 907)
Build an affordable Homebrew Hakko 907 Digital Soldering Station! Enjoy the variable and constant temperatures that can reach up to 525°C. The project only requires few components and roughly costs around $7 (excluding the repurposed power supply). Barely could I find detailed tutorials on one so I decided to make a video and Instructable about it.
Project Specifications:
- Designed for Hakko 907 handles
- Compatible with similar handles
- Temperature Range: 27°C-525°C
- Warmup Time: 25s - 37s (325°C)
- Recommended Supply: 24V, 3A
- Power: 50W (Average)
Full Video Tutorial:
Schematic, PCB Layout, Code & STL Files: Download Link
UPDATES:
- The MOSFET used is an IRLZ44N not an IRFZ44N (IRLB4132 works best, barely without heat-up issue)
- Codes for connecting to a non I2C 16X2 LCD was uploaded
- Printable PCB trace errors were corrected (gerber unaffected)
Step 1: Regular Vs. Digital Soldering Irons
Regular Soldering Irons:
Just like any other hobbyist, I started with a regular soldering iron. They're great but they do come with several cons. Any hobbyist who have tried one knows the struggle that these irons take around 7-15 minutes to warm up before being able to solder. Once warmed up, these irons will remain operating at their maximum temperature range. In some cases, these irons can potentially damage electronic components when contact is prolonged. From experience, the intense heat sometimes knocks off the dotted copper pads when dealing with perfboards. There are ways and techniques to overcome this but once you have tried a digital soldering station, you'll never have the urge to go back.
Regular Soldering Irons With Variable Dimmers:
There's a simple and common way to control the heat from regular irons, this is by connecting a dimmer circuit to limit the power going to the heating element. These are also present in some products, I once owned a Weller soldering station that had these. They're really good! The only disadvantage is that there is no closed loop temperature feedback. In some instances, you won't be getting the temps marked on the dimmer knob, as the temps would drop when you are soldering components that absorb heat. You can turn up the knob to compensate for the thermal temp drops but once you stop soldering the temps would increase again. You can ramp up the warm-up times by turning the dimmer knob all the way up then turning it down once it's hot.
Digital Soldering Station:
This is my favorite among the three. It's very similar to the variable dimmer irons but everything is automated with a PID system. In simple terms, the automated electronic control system of your soldering station, constantly adjusts that "dimmer knob" for you. When the system detects that your iron's tip temperatures are lower than your set temperature, the system will ramp up the power required to generate heat on your iron's tip. When the iron temperature is higher than your set temperature, power is cut from the iron causing a drop in temperature. The system does this process really fast, constantly turning the heating element of your iron On and Off to maintain a constant temperature at your tip. This is why warm-up times are significantly faster with digital soldering stations.
Step 2: Parts & Materials
Prices would vary depending on where you get your components (Alixpress is the cheapest). I will be updating this step with links once I source out the cheapest online components. I bought my components locally at E-Gizmo Mechatronics Manila's shop.
Materials Needed:
- Hakko 907 Handle ($3 Clone)
- Arduino Nano
- Buck Converter (MP2303 by D-SUN)
- 5 Pin DIN Female Connector
- DC Jack (2.1mm)
- 24V 3A Power Supply
- 16X2 I2C LCD
- LM358 Op-Amp IC
- IRLZ44N MOSFET (I used an IRLB4132, it's better)
- 1N4007 Diode
- 470uF 25V Electrolytic Capacitor
- 470Ω 1/4W Resistor
- 2.7kΩ 1/4W Resistor
- 3.3kΩ 1/4W Resistor
- 10kΩ 1/4W Resistor
- 10k Potentiometer
NOTE: The IRFZ44N label on the schematic and PCB of the video was a typo. Use the IRLZ44N, it is the logic level version of the IRFZ44N. I used an IRLB4132 on mine since it was more available in my area. Other MOSFETS would work as long as it has the specs below. My older version of this Iron uses an IRLZ44N.
Recommended MOSFET Specs:
- Logic Level N-Channel MOSFET- Logic level MOSFETs can be directly connected to a logic pin (digital pin of and Arduino). Since the saturating gate voltage is below the usual Vgs of regular MOSFETs, a logic level MOSFET has a gate to source saturation voltages of 5V or 3.3V (Vgs). When viewing datasheets, some manufacturers omit specifying this in text. You can refer to the Vgs vs. Id curve of the datasheet.
- Vds of atleast 30V (or Higher)- This is the voltage limit of the MOSFET, we are operating at 24V, a Vgs of 24V should do, but it is a common practice to add some margin for stability. The typical Vgs for most MOSFETs is 30V. There is no harm in using MOSFETs with higher Vgs voltages, as long as the other specs are within the range.
- Rds(on) of 0.022Ω (22mΩ), the lower the better- Rds(on) is the resistance formed across the Drain and Source pins of the MOSFET when it is saturated. To simplify everything, the lower your Rds(on), the cooler your MOSFET would be. If you have a high Rds(on), your MOSFET would run warmer since power is dissipated through the minute resistive nature of a MOSFET even when it is conducting.
Id of at least 3A or higher (I suggest above 20A) - This is the maximum current your MOSFET can handle.
Step 3: Design Process
Inside the Hakko 907 handle is a heating element with a temperature sensor close to it. Both are enclosed on a ceramic material. The heating element is simply a coil that produces heat when power is applied. The temperature sensor on the other hand is a thermistor. A thermistor is like a resistor, when the temperature changes, the resistance of the thermistor changes as well.
The Mystery Hakko Thermistor:
Sadly Hakko, does not provide enough data on the thermistor inside of their heating element units. It remained a mystery to me for years. So back in 2017, I conducted a tiny bench test to gather thermal characteristics of the mysterious thermistor inside. I added a temperature sensor to my iron's tip, connected an ohmmeter to my iron's thermistor pins and connected the heating element to my variable bench power supply. I then increased iron's temps and recorded the corresponding resistances of the thermistor. I eventually arrived with data plot that was useful for designing the circuit. I then found out it probably has a PTC thermistor, having a positive thermal coefficient. This means, as the temperature around the thermistor increases, the resistance of the thermistor increases as well.
(For the following steps, kindly refer to the third picture for the computation)
Voltage Divider For The Sensor:
In order to acquire a usable output from the thermistor temp sensor. I had to wire it up with a voltage divider. Then again, there is no datasheet for the mystery sensor, so I had set the top resistor on the voltage divider to limit the maximum power that is dissipated at the sensor (setting it to 50mW max). Now that I have acquired the top resistor of the voltage divider, I then computed for the maximum output voltage at the maximum operating temperature condition. The output of the voltage divider yielded around 1.6V. I then solved for the ADC compatibility for the Arduino Nano's 10 bit ADC and eventually found out that I cannot connect the voltage divider sensor setup directly as the values are too small for it to pick up accurately. In simple words, if I were to connect the voltage divider sensor directly to the analog pin there will be gaps between the temperature readings (Ex: 325°C, 326°C, 328°C..... 327°C is missing)
The Op-Amp:
In order to prevent the potential problem of having gaps between the temperature readout, an op-amp was used to upscale or amplify the low 1.6V peak output voltage of the voltage divider. The following computations from the third picture shows the minimum required gain and the gain I have selected on the implementation. I did not maximize the gain to scale the 1.6V output of the voltage divider to the Arduino's 5V ADC reference voltage since I wanted to add some margin in case other hakko handles connected to the voltage divider could yield voltages above 1.6V (which could lead to clipping). A gain of 2.22 should give a margin large enough for the project design to work with other iron handle models as well.
Step 4: The Schematic Diagram
The project uses a simple logic level N-channel MOSFET as a switching device for PWM control. This serves as a digital switch for providing power to the heating element. The non inverting op-amp (LM358) is used to amplify or upscale the tiny voltages that the voltage divider thermistor combo. The 10k potentiometer is used as the variable temperature control knob and LED is simply an indicator that I have wired and programmed in the project to display whether the heating element is active. For this specific project I'm using a 16X2 LCD with an I2C backpack driver since it is more user-friendly to the newbies in electronics.
Step 5: The PCB
I have designed the PCB layout in Proteus. I made it into a single sided PCB design so that it would be easy for everyone to fabricate this on a homebrew PCB. Take note one jumper is required if this were to be fabricated on a single sided PCB. The printable PDF file can be downloaded from the google drive link below.
If you wish to avail online PCB fabrication, the Gerber files can be downloaded from the google drive link below. You can also order my design directly on PCBway.com without having to input the Gerber files manually (Buy My PCB Link)
PCB Files (Proteus, Gerber & Printables):
Step 6: Calibrating the Buck Converter
Since most Arduino Nano clones can only take in 15V max without blowing the AMS1117 5V regulator while the heating element requires 24V to operate optimally, I buck converter bused be used for both to work together. The AMS1117 5V regulator found in most Arduino Nano clones has a dropout voltage of 1.5V, this mean the input voltage from the VIN pin of the Arduino Nano must be 6.5V (5V+1.5V).
Steps:
- Set your power supply to 24V
- Connect the power supply to your buck converter's input
- Monitor the output voltage of your buck converter using your multimeter
- Adjust the trimmer resistor until you get an output voltage of 6.5V
- You can go with 7V for better stability.
Step 7: Circuit Assembly
Use the schematic diagram or parts placement diagram from the previous steps for assembling the circuit.
Step 8: 3D Printed Enclosure
You may chose to build your project on a cheap plastic enclosure or use my 3D Printed design. I'm including the Solidworks file for editing purposes. If you want to print ahead, the STL files are available from the google drive link below.
My 3D Printer Settings:
- Printed on a Creality CR-10
- 0.3mm Layer Height
- 0.5mm Nozzle
- 30% Infill
- No Supports Needed
3D Printing Files (Solidworks & STLs):
Step 9: Enclosure Refinements (Paintjob & Sanding)
When your done printing, you can sand the 3D printed enclosure for a smoother finish. I painted mine mat black to make it look sleek and elegant.
Step 10: Mount the External Components
Screw the LCD, 10k Potentiometer, DC Jack and Driver Board in place. Then superglue the DIN connector and LED to the enclosure.
Step 11: Hakko 907 Connector
You might have trouble finding the proprietary 5 pin din connector of the Hakko handle like I did. You can snip of the male connector from the iron and replace it with a 4 pin male connector that you have. Ironically I have a 5 pin DIN connector pair but not one used on the Hakko. The 3rd pin is simply the ground, you can omit it if you are not particular to grounding standards and ESD protection.
Step 12: Wire the External Components
You can base your connection from the schematic diagram from the previous steps. I suggest adding a fuse across the DC jack and the assembled driver board for extra protection. I omitted the fuse as my power supply already has a fuse on the DC side.
Step 13: Programming
STEPS:
- Connect your Arduino to your computer
- Download my program sketch
- Tweak it if you must
- I made the values standardized for Hakko 907 handles
- I'll be updating this step soon for the fine tune calibration process.
- Be sure that the Wire.h and LiquidCrystal_I2C.h libraries are installed
- Tools > Boards > Select Arduino Nano
- Tools > Port > Select port where Arduino is connected
- Upload the sketch/ program
How The Code Works:
When the system detects that your iron's tip temperatures are lower than your set temperature, the system will ramp up the power required to generate heat on your iron's tip. When the iron temperature is higher than your set temperature, power is cut from the iron causing a drop in temperature. The system does this process really fast, constantly turning the heating element of your iron On and Off to maintain a constant temperature at your tip. This is why warm-up times are significantly faster with digital soldering stations.
PID Control:
No the code does not use a PID technique. My version one uses my old PID code but they perform almost the same with the comparator version of the code (the on this tutorial). I chose the simple version since it's easier to modify. You can email me for the PID version but it makes very little difference.
Arduino Code (V1.0):
Step 14: Adjust LCD Contrast & Potentiometer Add Knob
If you're new to Arduinos and 16x2 LCDs, you must tune the contrast trimmer resistor of your LCD for it to display properly. Once you are all set, you can finally add a plastic knob for your potentiometer for temperature control.
Step 15: Close the Enclosure & Power It Up!
Once you are confident that your soldering station is well calibrated, you can now close and screw the rear panel. You can use batteries or any AC to DC power supply from my power supply recommendation chart. If you want to get the best performance out of your station use a 24V 3A power supply. It can those metal case SMPS power supplies or perhaps repurpose a laptop charger for your soldering station. Junk shops and surplus shops have tons of them if you want to save money from buying a power supply. Laptop chargers typically rated at 18V 2.5A works well too but your iron's warm-up time could reach around 37s.
Step 16: Bonus: Better Heat Conduction
Quick tip. Here's a little trick off my sleeve that I usually do. You can add thermal paste in your Hakko 907 soldering tip for better thermal conductivity. It works and significantly improves the heat transfer! Just be sure to vent it out for the first 30 minutes of operation as the grease would start to boil and emit fumes. After the 30 minute period, it turns to this chalk like material. Just a warning, when times comes and you have to replace the tip, the dried out paste would adhere to the tip and heating element. Use a mallet on the tip to loosen the chalky material.
Step 17: Enjoy!
Enjoy your soldering station! I've been using this station for nearly 5 years now, the one on this tutorial is a make over of my refined version of my original station. I took my time to perfect the design as an open source kits for everyone to modify and enjoy. Let me know how your DIY Hakko Station goes!

First Prize in the
Microcontroller Contest
215 Comments
2 years ago
DONE !! (A1322 version)
Reply 9 days ago
Please make me a hot gun schematic
Reply 2 years ago
Awesome, congratulations! Could you share what ADC values you got for the A1322 heating element? I've tried to measure mine, but my multimeter probe only goes up to 230ºC :(
Reply 2 years ago
A1322 Heating element (Thermocouple + -)
DC 24V - 2A
Variable resistor aprox. 110k
LM358 pin 1 :
100º - 1.56v
150º - 1.94v
200º - 2.32v
250º - 2.69v
300º - 3.29v
325º - 3.49v
350º - 3.69v
Reply 1 year ago
My pcb with arduino.
Reply 1 year ago
Hakko(alliexpres) thermocouple version.
Nice code and circuit. Thank you.
Reply 2 years ago
Can you share the code you use for a1322 and why you used a pot on lm358? I currently only have a thermocouple element that comes with clones and I can't get a thermistor one for now so I had to do the job with the clone one
Reply 2 years ago
// Berreizeta Soldering station for A1322
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define tempSensor A1 // A1
#define knob A3 // A3
#define iron 10 // D10
#define LED 5 // D5
//-------------------------------------------------------
int
Temp,
minTemp = 25, //Minimum aquired iron tip temp during testing (°C)
maxTemp = 500, //Maximum aquired iron tip temp during testing (°C)
minADC = 25, //Minimum aquired ADC value during minTemp testing
maxADC = 740, //Maximum aquired ADC value during minTemp testing
maxPWM = 255, //Maximum PWM Power
avgCounts = 20, //Number of avg samples
lcdInterval = 80, //LCD refresh rate (miliseconds)
pwm = 0, //System Variable
tempRAW = 0, //System Variable
knobRAW = 0, //System Variable
counter = 0, //System Variable
setTemp = 0, //System Variable
setTempAVG = 0, //System Variable
currentTempAVG = 0, //System Variable
previousMillis = 0; //System Variable
//------------------------
float
currentTemp = 0.0, //System Variable
store = 0.0, //System Variable
knobStore = 0.0; //System Variable
unsigned long currentMillis;
float X = 5.0 / 1023; // analog reading in volts based on 5 volt max
int i = 0;
int u = 0;
int value = 0;
int err = 0;
float temp = 0;
int samples = 1;
int units = 0;
int command = 0; // This is the command char, in ascii form, sent from the serial port
//--------------------------------------------------------------------------
void setup(){
Serial.begin(115200);
lcd.backlight();
lcd.begin(16,2);
lcd.clear();
digitalWrite(LED,HIGH);
pinMode(tempSensor,INPUT); //Set Temp Sensor pin as INPUT
pinMode(knob,INPUT); //Set Potentiometer Knob as INPUT
pinMode(iron,OUTPUT); //Set MOSFET PWM pin as OUTPUT
pinMode(LED,OUTPUT); //Set LED Status pin as OUTPUT
lcd.setCursor(0,1);
lcd.print("PRESET T: ");
lcd.setCursor(0,0);
lcd.print("ACTUAL T:");
lcd.setCursor(14,0);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(14,1);
lcd.print((char)223);
lcd.print("C");
} // end setup
//---------------------------------------------------------------------
double Temp_Out(double Vin){ // calculates deg C from voltage for K thermocouple)
double Sum;
double a0 = 0;
double a1 = 2.5132785E-2;
double a2 = 6.0883423E-8;
double a3 = 5.5358209E-13;
double a4 = 9.3720918E-18;
Sum = a1 * Vin + a2* pow(Vin,2)+ a3* pow(Vin,3)+ a4* pow(Vin,4);
return Sum * 10000; //
}
//------------------------------------------------------------------------
void Average10() { // average 10 readings
float Ave;
int AveCt ;
AveCt = 0;
Ave = 0;
do {
Ave = Ave + analogRead(A1) ;
AveCt = AveCt + 1;
delay(1);
} while (AveCt < 10 ) ;
temp = (Ave / AveCt) / 408 ; // Convert to 5 volt reading to degrees F /204
temp = Temp_Out(temp);
}
//-----------------------------------------------------------------------
void loop(){
value = 0;
Average10(); // take averaged sample
knobRAW = analogRead(knob); //Get analog value of Potentiometer
setTemp = map(analogRead(knob), 0, 1023, minTemp, maxTemp); //Scale pot analog value into temp unit
//--------Get Average of Temp Sensor and Knob--------//
if (counter < avgCounts){ //Sum up temp and knob data samples
store = store + temp;
// store = store + currentTemp;
knobStore = knobStore + setTemp;
counter++;
}
else
{
currentTempAVG = (store / avgCounts) - 1; //Get temp mean (average)
setTempAVG = (knobStore / avgCounts); //Get knob - set temp mean (average)
knobStore = 0; //Reset storage variable
store = 0; //Reset storage variable
counter = 0; //Reset storage variable
}
//--------PWM Soldering Iron Power Control--------//
if (analogRead(knob) <= 10){ //Turn off iron when knob as at its lowest (iron shutdown)
digitalWrite(LED,LOW);
pwm = 0;
}
else if (temp <= setTemp - 2){ //Turn on iron when iron temp is lower than preset temp avec hystérésis
digitalWrite(LED,HIGH);
pwm = maxPWM;
}
else if (temp >= setTemp + 2){ //Turn off iron when iron temp is higher than preset temp avec hystérésis
digitalWrite(LED,LOW);
pwm = 0;
}
analogWrite(iron,pwm); //Apply the aquired PWM value from the three cases above
//--------Display Data------------------------------------------------
currentMillis = millis(); //Use and aquire millis function instead of using delay
if (currentMillis - previousMillis >= lcdInterval){ //LCD will only display new data ever n milisec intervals
previousMillis = currentMillis;
if (analogRead(knob)== 0){
lcd.setCursor(10,1);
lcd.print("OFF ");
Serial.println("PRESET: OFF");
}
else {
if (setTempAVG < 100 ){
lcd.setCursor(12,1);
lcd.print(" ");
}
lcd.setCursor(10,1);
lcd.print(setTempAVG);
Serial.print("PRESET: ");
Serial.println(setTempAVG);
}
if (temp < minTemp){
lcd.setCursor(10,0);
lcd.print("COOL");
Serial.println("TEMP : COOL");
}
else
{
if (temp < 100 ){
lcd.setCursor(12,0);
lcd.print(" ");
}
lcd.setCursor(10,0);
lcd.print(int(temp));
Serial.print("TEMP : ");
Serial.println(int(temp));
Serial.println();
}
}
} // end loop
//----------------------------------------------------------------------
Reply 2 years ago
Thanks! I'll give it a go! :)
Reply 1 year ago
Do you have the resistor values of the OP Amp for the A1322?
Edit: I just saw the schematic and the values are 1.2k and 110k.
Thanks!
As soon as I finish the case, I'll upload some pics of my build!
Reply 2 years ago
Now click "I made it!"
Good job!
Question 6 weeks ago
I have 2 issues my display just shows the dark squares only on the top of the display. The bottom is blank. Then sometimes when I turn it on the letters and the temperature shows up. Also for some reason when it does work the soldering tip will get hot to the touch but not hot enough to melt the solder
Answer 4 weeks ago
I found out I had the sensor and heater wires switched when I plugged in the iron. That is why the tip didn't get hot. But I still have issues with the display not showing correctly.
7 weeks ago
The project is good, and after all the problems (replacing the body, heater, etc.) almost everything works - I just can't set the temperature, from min. jumps to max. or when it is possible to set the continuous temperature value of the soldering iron, it jumps to min. or max. I tried both 2K and 250K potentiometers, changing avgCounts = 20 from the original 5. The problem with setting a specific temperature persists. So the box is still open, can you advise? well thank you
7 weeks ago
Just for clarification. I am just learning electronics. I have made it completely and decided I wanted to make it portable. I want to run it with a Ryobi 18v Li battery. What changes do I need to make to make sure that it works throughout the voltage range from 14v - 21v? Is it possible?
1 year ago
Hello again,
Regarding the Hakko handle's DIN connector, the handle uses the 6-pin DIN format, but without the centre pin. You could fit a 6-pin female socket without having to change the connector on the handle.
Reply 2 months ago
Excellent, but I used a different type
Reply 11 months ago
wow do you have the code and schematic?
Question 3 months ago
Hi, when I turn the potentiometer to heat up, the writing on the display disappears. Any idea why?
Answer 2 months ago
beacause may be you use clone note original element so when you change temp it fire on full temp and need more power