DIY Digital Soldering Station (Hakko 907)

129K837375

Intro: 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):

https://drive.google.com/drive/folders/1Mc8ELiDs4Q...

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:

  1. Set your power supply to 24V
  2. Connect the power supply to your buck converter's input
  3. Monitor the output voltage of your buck converter using your multimeter
  4. Adjust the trimmer resistor until you get an output voltage of 6.5V
  5. 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):

https://drive.google.com/drive/folders/1XxkaTaWJ18...

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:

  1. Connect your Arduino to your computer
  2. Download my program sketch
  3. Tweak it if you must
  4. I made the values standardized for Hakko 907 handles
  5. I'll be updating this step soon for the fine tune calibration process.
  6. Be sure that the Wire.h and LiquidCrystal_I2C.h libraries are installed
  7. Tools > Boards > Select Arduino Nano
  8. Tools > Port > Select port where Arduino is connected
  9. 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):

https://drive.google.com/drive/folders/1Fzx1aGWWVw...

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!

223 Comments

Seems like I'm getting a short in the sensor circuit but all my wiring appears correct... Anyone run into this?

I ordered the PCB's from PCBWay with most of the components pre-soldered to evaluate the service. I figure, if someone is doing this project, they may not have access to a good soldering iron, so why not try.

I was able to get everything wired up and also remixed the 3d printed case so I had a bit more room to work with. I am using a 907 A1321 handle and it has the same wiring as mentioned in this article, and the thermistor seems to have the proper resistance for temperature.

Unfortunately, I ran into a number of issues.

The silk screening on the board is not updated, so if you are going to install components based off that, please make sure you pay attention to the instructable vs. the board. I had to desolder the MOSFET and replace with the proper one that is mentioned here.

The OpAmp doesn't seem to be wired in correctly based on the schematic and other comments here. I turned mine on and the detected temperature was going all over the place. Then it just maxed out at 525C, and seems to be burnt out after first use. I tried another OpAmp and it did the same thing. I haven't double checked the circuit, but it seems like the PCB is incorrect.

The Hakko 907 soldering iron handle uses a GX16 type connector. The connector pictured here (and briefly mentioned in the video) is a DIN 5 pin. I'd recommend using the GX16 connector instead of a DIN 5 pin. You may have to make modifications to the case to secure the cable.

Because of the OpAmp issue, this project cannot be completed as sold on PCBWay. I am curious if anyone has managed to get it working with the PCBWay board. There may be some workarounds and I saw one of the comments, as someone went directly to the Arduino pin and bypassed the OpAmp and tradeoff fine grained control.

I would recommend avoiding this project if you are looking for a simple and straightforward project. It seems like the person who created this project no longer maintains it, so maybe it's best to find another design.

Hey are you able to help me out finishing my solder station, I got most of it wired and programmed , but I went wrong somewhere and don’t know where to start, it powers up but doesn’t get warm and stsys on cool , and the led is not lighting up

Can I use esp32? because i want to use TFT lcd!

as the project works, many thanks to ASCAS you are a star, i will now build the finished product using tiroidal transformer with a bridge rectifier and a step down converter to get 24v DC. Will post the finished product once done

for those who struggle to get the code to work because of the knock off from china, all you need is a 131a heating element from ebay or aliexpress. 2 red wires and 2 blue wires. the resistance between the red wires and the blue wires matches the genuine hakko values

help, actual temp is stuck at max temp without the soldering iron even plugged on.
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
Check your heating element. It needs to meet the specs of an original a1321 hakko element. Some clones do, but in my experience, most do not and will not work with this controller.
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 :(
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


Hakko(alliexpres) thermocouple version.
Nice code and circuit. Thank you.
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
// 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
//----------------------------------------------------------------------
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!
Now click "I made it!"
Good job!
More Comments