DIY SMD Soldering Station with AVR (MEGA2560 VERSION)

Free counters!

At the from Matthias Wagner, I saw a DIY project of a soldering station with nice user interface and clever control of the RT series soldering tips of Weller. It was so interesting that I decided to make some changes on the hardware and of course re-writing of the firmware.

It is based on a ATMega644 controller, it has a 2.4″ TFT and a rotary encoder for the user interface and is designed to support two kinds of soldering irons: the classic RT tips or other devices with in-built heat sensor and the simple devices with only the heating element.


The small 2.4″ TFT is on an Arduino MEGA1280 for developing of the initial code and making fine adjustments of the -on screen- details.


The splash screen can be any 320×240 pixels .bmp file and can be processed in any image conversion program like Ms Paint.

My original thought was to use a simple, low power, cheap soldering iron for soldering up to 1206 dimension SMT parts, such as chip resistors and capacitors and small package IC’s. The problem with this is that since the soldering iron has no temperature sensing (RTD sensor, thermocouple sensor), it is very difficult to calculate the tip temperature of the device. I know though from Physics the relationship between the resistance and temperature of a resistor (i.e. the heating element itself), so with some effort I can take some feedback for an automated temperature controller.

Since the electrical resistance of a conductor such as a copper wire is dependent upon collisional processes within the wire, the resistance could be expected to increase with temperature since there will be more collisions. An intuitive approach to temperature dependence leads one to expect a fractional change in resistance which is proportional to the temperature change:

ΔR is the difference between initial and final (R resistance, T temperature) and α is the temperature co-efficient of a resistor or the material of the resistor (for my case, the heating element material is a Nickel-Chrome alloy, very common for soldering iron resistors).

So, the above formula can be more simple, solving for the unknown temperature. It is supposed that the every single moment heating element’s resistor value can be found from the moment current that leaks the element:

In the very useful page  can someone calculate the resistor’s temperature by inserting all other values in different fields. Very useful, indeed!

The main problem now is to make something that can measure very slight changes of iron’s resistor, such as from about 26 to 30 Ohms. These 4 Ohms have to be divided in about 375 parts, since the temperature of the tip is expected to reach the 400 degrees of Celsius centigrade. This means that if the nominal operating voltage of the iron is 12 volts, the current we have to measure varies from 12/26=0,4015 to  12/30=0,4000 Amperes. The accuracy range of the ADC must be then not less of a 0,00015075 Α  per one degree for a temperature range of ambient 25 to maximum 400 degrees.

To be honest, I would like to express my reservations on this approach but the magic of the unknown would not make no sense…

UPDATE (22 FEB 2016):

After some research, I realized that the above approach to this kind of design had very little chances to succeed. So I revised my design in order to fit it in market’s soldering iron types. The updated design has 3 options of tip temperature measurement, depending on the thermal sensor type of the soldering iron. PTC, NTC and K-TC sensors have been implemented and can be easily chosen through a quadruple DIP switch. The signal amplifiers are separate, each for every type, so defining the soldering tip’s sensor in the code, the program executes accordingly.

The core of the design depends now on a very interesting ΑΤMEGA2560 core I found:


DS-Mega2560-CORE-V01-EN datasheet

This one has plenty of flash memory, so I can do many things with graphics on the TFT.


This part of the design shows the individual signal amplifying stages before the 10bit ADC measurement.



UPDATE (01 MAR 2016):

After some time, at last arrived two PCB I had ordered at MakePCB… The design consists of a 152 x 90 mm multiple PCB: main board, auxiliary board and a small I2C LCD adapter board (not for  this project).

The assembly is not complete yet, but the most important things have been tested. UI was my concern, so after the population of the materials, I powered it up:


The two small step down converters were adjusted to 3.3 and 5V (TFT and MCU voltages) and also the TFT ribbon cable to its position:


And… voila! Everything (up to now) works just fine!

UPDATE (04 MAR 2016):

At last, I started to assemble all parts (PCB’s, cabling and rest of the hardware) in an appropriate ABS enclosure I found on TME which can handle all the hardware in a very cute matter.


This is just after the front opening for the small 2.8″ TFT. At the end, I preferred to make it a bit larger than the TFT’s dimensions, planning to fit in the future a membrane frame around the opening to hide any misalignment . The final result is like this:


The hole on the upper left corner is for the rotary encoder; it is missing for now, it was sent without a locking nut…

There is also missing and the soldering iron, I am preparing some pictures with this and the overall operation.


The internal space of the enclosure. The LEDs in closed enclosure do not illuminate since they are transferred to the front panel LEDs (POWER ON and HEATER ON).


The latest stable version of firmware and all relative files for the construction can be found here:

UPDATE (23 MAY 2016):

Any updates will be informed with newer versions.

My YouTube channel:


41 thoughts on “DIY SMD Soldering Station with AVR (MEGA2560 VERSION)”

    1. Hi Adrian,
      As you can see, the article is not complete yet, nor the prototype. The code is very early and covers only the TFT screen part. As soon as I test the prototype and the code, I will release it free.

  1. Hi Manos,

    Looks nice!
    Thank you for your work!

    My question is:
    Is your soldering station able to utilize the full potential of 24V 50-70W iron?

    What if I use 24 DCV 4-6A switch mode power supply?
    Will it change anything about the controller behavior or the stability?

    1. Hi Sasha,

      Concerning the quality of the tension there is no problem using a SMPS or a linear power supply. The device is consciousness of the small ripple produced by a SMPS and can handle a full 24VDC supply.

      Manos M.

      1. Hi Manos,

        Many thanks for providing this additional information.

        I suppose that I have to take at 24VDC one other DC-DC converters (with bigger Vin).
        Example: D-SUN step-down module with chip MP1584EN: Vin: 4.5-28V, Vout: 0.8-20V, 3A.


  2. Hi Sasha,

    The supplying voltage has direct relationship with the active power on the iron’s heating element. It can operate with 20VDC for example, but the efficiency will not be the same as it would operate with the nominal voltage of 24 volts. So with your example, you have to expect less maximum temperatures on the tip.

    1. upsss…

      I think this is a misunderstanding arose regarding my example.
      This DC-DC converter module (MDL1, MDL2) is be competent only for 3.3V and 5.0V. For Iron I take a SMPS 24VDC 4-6A.

    1. Marcos,

      There is no need for converting the code to SPI protocol. Everything is arranged automatically by the relative library (SPI.h).
      I do not know what is your experience with Arduino and AVR microcontrollers, but if you have, you should not face any problem at all.

  3. manos i am your big fan everyday i read here and its was my first time write here and i am new in Arduino
    my dear sir i use mega 2560 r3 and Chinese 2.8 inch touch screen so my question is possible can i control this iron by touch and really very sorry for my poor eng

    1. Yes, this is possible with this small touch screen. But you need to re-write the code so you implement the controls as icon buttons. The present graphics design has no provision for doing this.

  4. No, there was no need for doing this. You only have to increase or decrease the tip’s temperature and store it to memory. The encoder itself was quite enough for my needs.

  5. thanks for reply this project very nice i use its with hakko t12 tip and i change something in standby i use vibration switch sensor in handle

  6. hey manos i am larisa from belarus i need your some help i am very new in Arduino i hope you can help me thx

  7. manos i have mega2560 and smd iron project for 2560 core and many chip pinout different so how can i change pins please help me about that

  8. thanks my dear but 1 thing have chinese lcd with and this is spi tft and there have not pinout like a lcd-cd lcd-wr lcd-rd

    my tft have cs dc sclk mosi miso please tell me what to do

  9. I I did as you told me but the problem persists.
    Arduino: 1.8.2 (Windows 7), Board: “Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)”

    In file included from C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino:19:0:

    sketch\DEFINES.h:58:0: warning: “PINK” redefined

    #define PINK 0xF81F


    In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\iom2560.h:38:0,

    from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:174,

    from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:90,

    from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,

    from sketch\IRON_18.ino.cpp:1:

    c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\iomxx0_1.h:1149:0: note: this is the location of the previous definition

    # define PINK _SFR_MEM8(0x106)


    In file included from C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino:14:0:

    C:\Users\TEMP\Documents\Arduino\libraries\EEPROMEx/EEPROMEx.h:159:22: error: conflicting declaration ‘EEPROMClassEx EEPROM’

    extern EEPROMClassEx EEPROM;


    In file included from C:\Users\TEMP\Documents\Arduino\libraries\EEPROMEx/EEPROMEx.h:23:0,

    from C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino:14:

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:145:20: note: previous declaration as ‘EEPROMClass EEPROM’

    static EEPROMClass EEPROM;


    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino: In function ‘void setup()’:

    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino:96:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

    bmpDraw(“FILE0.bmp”, 0, 0);


    IRON_18:101: error: ‘struct EEPROMClass’ has no member named ‘readInt’

    will_temp = EEPROM.readInt(WILL_TEMP_EEPROM_ADDRESS);


    IRON_18:108: error: ‘struct EEPROMClass’ has no member named ‘readInt’

    encoderPos = EEPROM.readInt(ENCODER_EEPROM_ADDRESS);


    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino: In function ‘void loop()’:

    IRON_18:157: error: ‘struct EEPROMClass’ has no member named ‘readInt’

    int tempWill = EEPROM.readInt(WILL_TEMP_EEPROM_ADDRESS);


    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\INTERRUPTS.ino: In function ‘void updateEncoder_ISR()’:

    INTERRUPTS:14: error: no matching function for call to ‘Encoder1::lowLevelTick()’



    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\INTERRUPTS.ino:14:26: note: candidate is:

    In file included from C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\IRON_18.ino:15:0:

    C:\Users\TEMP\Documents\Arduino\libraries\Encoder1/Encoder1.h:30:7: note: void Encoder1::lowLevelTick(float, float)

    void lowLevelTick(float fastRate, float slowRate);


    C:\Users\TEMP\Documents\Arduino\libraries\Encoder1/Encoder1.h:30:7: note: candidate expects 2 arguments, 0 provided

    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\INTERRUPTS.ino: In function ‘void EncoderClick_ISR()’:

    INTERRUPTS:35: error: ‘struct EEPROMClass’ has no member named ‘writeInt’

    EEPROM.writeInt(WILL_TEMP_EEPROM_ADDRESS, will_temp);


    INTERRUPTS:36: error: ‘struct EEPROMClass’ has no member named ‘writeInt’

    EEPROM.writeInt(ENCODER_EEPROM_ADDRESS, encoderPos);


    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\TFT.ino: In function ‘void bmpDraw(char*, int, int)’:

    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\TFT.ino:33:40: warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]

    if ((bmpFile = == NULL)


    C:\Users\TEMP\Desktop\DIY-SMD-Soldering-Station-master\Versions\IRON_18\TFT.ino: In function ‘void mainScreen()’:

    TFT:161: error: ‘struct EEPROMClass’ has no member named ‘readInt’

    int tempWill = EEPROM.readInt(WILL_TEMP_EEPROM_ADDRESS);


    Multiple libraries were found for “SPI.h”
    Used: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI
    Not used: C:\Users\TEMP\Documents\Arduino\libraries\SPI
    exit status 1
    ‘struct EEPROMClass’ has no member named ‘readInt’

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s