At the fpv-community.de Forum I read about a DIY Weller station designed by Martin Kumm. Basically an Arduino shield to drive a Weller soldering tip. As there is not much to it, the board simply contains an precision OpAmp, a power MOSFET, 2 buttons for adjusting the temperature and a display to show the current values. This design looks like a good starting point for my own advanced project. As I have lately discovered a 1,8 inch SPI TFT at banggood.com for an amazing price ( ~ 4.60 $ / 3,70 €), I started using them regularly in my projects. So I surely wanted to use it with this soldering station as well.
The hardware design was rather hobbyish and needed to be tuned to provide the security not to kill your soldering tip while starting up or in case of a software/hardware fail. The bigger changes I made to the original design were the nice color Display, a poti instead of the buttons (I think it’s easier to adjust) and a standby mode.
The standby mode will decrease the temperature to a 170°C value when the soldering tip is in the holder. This works simply by having a pullup resistor connected to the metal holder pipe which is connected to a digital input. The soldering tip itself is connected to ground potential and will put the digital input to ground level as well when placed in holding position. For reheating the station only takes about 3 seconds which is fast enough in most cases.
The station in the picture above is the result of a long prototyping period together with Albert – a friend of mine from university – who owns a 3d printer and wanted to have a station as well. As we started with the development of the station some friends asked us if they can by a station from us. So we decided to ask around if anyone is interested in buying this station as a DIY kit. After a short time we had 10 stations to build and a lot of money to spend on the parts.
Long story short, we thought we could make some money with this stations but in the end it turned out to be a lot of work and no money to make. But still a nice feeling developing a product and seeing someone buying and even better actually using it. 🙂
Apart from that we didn’t get much out of it, so we stopped selling this stations and closed this chapter. But still we gained a bit of experience in selling stuff and started to get that kind of startup feeling.
You cand find a video of the station in action at Alberts Blog.
If someone is interested in the actual schematics and code. Link below:
Download: GitHub/SolderingStation
By the way the PCBs are ordered at DirtyPCBs.com for just 14 USD worldwide shipping included.
Hallo, ich habe die Station nachgebaut und alles hat auf Anhieb geklappt. Sketch musste nur an die ST7735 angepasst werden aber mehr nicht. Bei einem Trockentest – Station mit Strom versorgt und das Poti war angeschlossen – lässt sich die Station nur von 0 – ca. 219°C regeln. Woran kann das evtl. liegen oder habe ich doch einen Fehler?
LikeLike
Miss dich mal die Spannung an dem Poti. Diese sollte sich zwischen 0 und 5 Volt einstellen lassen
LikeLike
Mittlerweile funktioniert die Station, das Poti war defekt.
Aber ich habe das Problem das die Station ab und zu einfach mit einem weißen Bildschirm startet und erst nach mehrmaligem Starten der Startscreen erscheint. Woran kann das liegen?
LikeLike
Hi
Ich krieg immer eine Fehlermeldung wenn ich die .brd oder die .sch datei öffnen will :
„Loading C:/Users/kilia_000/Downloads/solderstation_v1_6.brd …
Fehler:
Zeile 6, Spalte 25: Dies ist keine EAGLE-Datei.“
Bei der .sch Datei bis auf die andere Dateiendung der selbe Fehler.
Was mache ich falsch?
mfg Kilian
LikeLike
Hello, I am so interested in this soldering station. Could I order a DIY kit? Thanks, SW
LikeLike
Unfortunately I am not selling it anymore. But you can find the full parts list on github so that you can order parts and build it yourself. Have fun
LikeLike
Matthias, I have the soldering pencil (original) and tips. Does your code allow for using the built-in reed contact?
Also is the Adafruit 1.8″tft compatible. Banggood seems to have discontinued them.
LikeLike
Hi Tinu, my code only supports the Tip when placed in the holder at the station. You will not really need the expensive original cable. I noticed as well, that banggood is no longer selling the display but any other 1.8 Inch tft with spi should work. Just look on ebay and you will find something from China 🙂
LikeLike
Beim Compilieren bekomme ich viele Fehlermeldungen. Woran könnte das liegen?
WARNUNG: Kategorie “ in der Bibliothek UIPEthernet ist ungültig und wird auf ‚Uncategorized‘ festgelegt
error: ‚prog_uint8_t‘ does not name a type
prog_uint8_t iron[] PROGMEM={
error: ‚prog_uint8_t‘ does not name a type
prog_uint8_t stationLOGO1[] PROGMEM={
error: ‚prog_uint8_t‘ does not name a type
prog_uint8_t stationLOGO2[] PROGMEM={
error: ‚prog_uint8_t‘ does not name a type
prog_uint8_t stationLOGO3[] PROGMEM={
In function ‚void setup()‘:
SolderStation:86: error: ’stationLOGO1′ was not declared in this scope
tft.drawBitmap(2,1,stationLOGO1,124,47,QDTech_GREY);
SolderStation:89: error: ’stationLOGO2′ was not declared in this scope
tft.drawBitmap(3,3,stationLOGO2,124,47,Color565(254,147,52));
SolderStation:90: error: ’stationLOGO3′ was not declared in this scope
tft.drawBitmap(3,3,stationLOGO3,124,47,Color565(255,78,0));
SolderStation:101: error: ‚iron‘ was not declared in this scope
tft.drawBitmap(15,50,iron,100,106,QDTech_GREY);
exit status 1
’stationLOGO1′ was not declared in this scope
LikeLike
I’m just getting started with EE. I thought going over your project to understand it and build a version would be a good learning project and also end up with a nice bench too. I had some questions about why you decided to do some things. If you have time to aid a „young player“ (EEVBLOG quote)..
1) I noticed that the design drives the back light of the display through BSN20. BL needed more current than any MCU output alone could provide …but I don’t understand why that would then be feed into arduino PIN 5. Why is that current fed back in (or is it out also?)?
2) The 5V 7805 Output has 1) 10uf+ 3) 100nf Caps in parallel. Why not just use one larger cap? Or just use one 10uf and call it good…or none at all. Is there some part of the circuit that is so sensitive? It’s obviously deliberate so looking for insight here.
3) What is M01PTH (JP4) used for?
4) Why are Arduino Pins 2,4,8 and A2 Tied to VCC? I found some Internet links talking about Noise etc. but if that is the design issue then why aren’t A0, A1, 12 and others tied to 5V. Wouldn’t a mistake in code (ie setting pin 2 to Output low burn out the Atmel chip?
LikeLike
Thanks from great project. But I have one problem there is a place for C8 at pcb but I cant find it on partlist.
LikeLike
Hi, you do not need C8, thats why I did not put it in the partlist 🙂
LikeLike
Ok and thanks. I have one more question why there is a hole near arduino pro mini pin 6 ?
LikeLike
Cool project! This TFT does not sees available anymore with the „SKU“ number you provided. Can you please point to another or maybe which chip required in the TFT to be compatible with the Arduino drivers?
LikeLike
When compiling I also get these failure messages like mentioned above:
iron.h:9: error: ‚prog_uint8_t‘ does not name a type
Therefore I changed in iron.h
prog_uint8_t iron[] PROGMEM={
into
const uint8_t iron[] PROGMEM={
and in stationlogo.h (for LOGO1-3)
prog_uint8_t stationLOGO1[] PROGMEM={
into
const uint8_t stationLOGO1[] PROGMEM={
This gives no warnings anymore, but it does also not work. The display stays white (sometimes colored vertical stripes).
I’m definitely no crack with Arduino, so probably the above should not be done 😉
But what would be the solution to get this station to work. Is it needed to connect the poti and iron to get anything on the display?
Thanks a lot!
LikeLike
Ivo, I have the same issue. did you find a solution already ?
LikeLike
please forget my previous comment. I made a basic mistake by putting in your code wrong. Now it works!
LikeLike
Hi Ivo,
I have the same, what was incorrect? I have a problem with the rst pin. If I tie it to the rst pin of the arduino it works, but on the pinheader the screen stays white.
LikeLike
I’m a little ashamed to say that I pasted the code wrong in the editor.
Regarding the white display, the screen used is not that easy to buy anymore. The more common 1.8″ TFT on ebay has a 16 pin header and is based on the ST7735 chip (the display is called KMR 1.8SPI). There is also a version with a 8-pin and 16-pin header, which looks the same, but is also based on the ST7735 (this display is called 1.8TFT module and also uses different colors ;)). To get the station to work you have to use a different library. See: http://fpv-community.de/showthread.php?41335-DIY-SMD-L%F6tstation-Ersatz-f%FCr-(WELLER)/page33 (I hope I’m allowed to place a link here).
Also if you have a display with only the 16-pin header, you have to connect is as follows:
PCB KMR 1.8SPI
8 (+5V) 6 (RESET) 1 (RST)
7 (CD) 10 (CS) 2 (CE)
6 (DC) 7 (A0) 3 (D/C)
5 (MOSI) 8 (SDA) 4 (DIN)
4 (SCK) 9 (SCL) 5 (CLK)
3 (+5V) 2 (VCC) 6 (VCC)
2 (BL) 15 (LED+) 7 (BL)
1 (DGND) 1 (GND) 8 (GND)
Good luck! It’s a great design, I’m very happy with it.
By the way can someone explain how I could add my own logo to the display?
LikeLike
Small mistake, the three columns with the pinouts are respectively for PCB header, KMR 1.8 SPI and 1.8TFT module (the last display has an 8-pin and 16-pin header, use the 8-pin as in the table)
LikeLike
Hi. Should I use MS tips or non-MS tips? F.x. RT8 or RT-8MS. „MS“ seems to be „separate ground“. But I can’t find any details what that means.
LikeLike
Wo kann man Code V 2.1 finden?
LikeLike
Hello, great project i am interested in speaking with you regarding a similar soldering station project. Willing to work with you as a freelancer, if interested let me know how i can contact you.
LikeLike
Hi Ace, sorry to tell you that I stoped working on that project long time ago. But if you want to continue and improve just go ahead 🙂
LikeLike
Hallo Matthias,
Ich habe alle Signale angeschlossen und auch nochmal mit dem Multimeter kontrolliert.
Dabei habe Ich RST auf 8 korrigiert(war 12)
Jetzt habe Ich
GND, VCC,
RESET 8
MOSI(DIN)
SCK 13
CS 10
D/C 9
Nachdem das BL eingeschalten wird, sehe Ich nur farbige horizontale Linien. Was habe Ich falsch gemacht ?
LikeLike
Hey Group,
I recently buillt this nice Soldering Station from Mathias –
built the PCB, setup der SolderingStation , installed few libraries, changed the code
to use ‚const uint8_t ‚ to make it compile and downloaded to the board.
Then I connected the display to the arduino board [1-8] to [8-1] , so that all signals make sense.
However, after BL is switched on by the arduino, I just see colored stripes in the display.
This is very reproducable. What to make wrong to see this effect ?
I measured all the connections with my multimeter and they are just fine. I even checked the port numbers of
CS , A0 and the SPI interface.
Can someone give me a hint ?
LikeLike
Hi, I just found this project but i got confused why there are two part lists? Do I need to order both of them? And why does the second one doesn’t have any SMD Parts? BTW thanks a lot for you effort 🙂
LikeLike
The horizontal stripes and white display mean that you have either not the correct display driver it you have not made the right connections, see my earlier post that shows the correct writing for different displays and a look to another library for the most common ebay display.
LikeLike
Hi, For the people who used the ST7735 lcd, you can view the right code below, you must download the right library here : https://github.com/adafruit/Adafruit-ST7735-Library. You must remove R18 and connect the RST pin of the lcd to D12 on the arduino over a 100r Resistor. Into the 2 graphic’s code (iron.h and stationLOGO.h) you must replace all „prog_uint8_t“ by „const uint8_t“.
ST7735 version :
********************************************
//*******************************//
// Soldering Station
// Matthias Wagner
// http://www.k-pank.de/so
// Get.A.Soldering.Station@gmail.com
//*******************************//
#include // Core graphics library
#include // Hardware-specific library
#include
#include „iron.h“
#include „stationLOGO.h“
#define VERSION „1.5“ //Version der Steuerung
#define INTRO
#define sclk 13 // Don’t change
#define mosi 11 // Don’t change
#define cs_tft 10 //
//V1.5
#define dc 9 // 8
#define rst 12 // 9
/*
//V1.4
#define dc 8
#define rst 9
*/
#define STANDBYin A4
#define POTI A5
#define TEMPin A7
#define PWMpin 3
#define BLpin 5
#define CNTRL_GAIN 10
#define DELAY_MAIN_LOOP 10
#define DELAY_MEASURE 50
//#define ADC_TO_TEMP_GAIN 0.415
#define ADC_TO_TEMP_GAIN 0.53 //Mit original Weller Station verglichen
#define ADC_TO_TEMP_OFFSET 25.0
#define STANDBY_TEMP 175
#define OVER_SHOT 2
#define MAX_PWM_LOW 180
#define MAX_PWM_HI 210 //254
#define MAX_POTI 400 //400Grad C
#define PWM_DIV 1024 //default: 64 31250/64 = 2ms
Adafruit_QDTech tft = Adafruit_QDTech(cs_tft, dc, rst); // Invoke custom library
int pwm = 0; //pwm Out Val 0.. 255
int soll_temp = 300;
boolean standby_act = false;
void setup(void) {
pinMode(BLpin, OUTPUT);
digitalWrite(BLpin, LOW);
pinMode(STANDBYin, INPUT_PULLUP);
pinMode(PWMpin, OUTPUT);
digitalWrite(PWMpin, LOW);
setPwmFrequency(PWMpin, PWM_DIV);
digitalWrite(PWMpin, LOW);
tft.init();
SPI.setClockDivider(SPI_CLOCK_DIV4); // 4MHz
tft.setRotation(0); // 0 – Portrait, 1 – Lanscape
tft.fillScreen(QDTech_BLACK);
tft.setTextWrap(true);
//Print station Logo
tft.drawBitmap(2,1,stationLOGO1,124,47,QDTech_GREY);
tft.drawBitmap(3,3,stationLOGO1,124,47,QDTech_YELLOW);
tft.drawBitmap(3,3,stationLOGO2,124,47,Color565(254,147,52));
tft.drawBitmap(3,3,stationLOGO3,124,47,Color565(255,78,0));
//BAcklight on
digitalWrite(BLpin, HIGH);
#if defined(INTRO)
delay(500);
//Print Iron
tft.drawBitmap(15,50,iron,100,106,QDTech_GREY);
tft.drawBitmap(17,52,iron,100,106,QDTech_YELLOW);
delay(500);
tft.setTextSize(2);
tft.setTextColor(QDTech_GREY);
tft.setCursor(70,130);
tft.print(VERSION);
tft.setTextSize(2);
tft.setTextColor(QDTech_YELLOW);
tft.setCursor(72,132);
tft.print(VERSION);
tft.setTextSize(1);
tft.setTextColor(QDTech_GREY);
tft.setCursor(103,0);
tft.print(„v“);
tft.print(VERSION);
tft.setTextColor(QDTech_YELLOW);
tft.setCursor(104,1);
tft.print(„v“);
tft.print(VERSION);
delay(2500);
#endif
tft.fillRect(0,47,128,125,QDTech_BLACK);
tft.setTextColor(QDTech_WHITE);
tft.setTextSize(1);
tft.setCursor(1,84);
tft.print(„ist“);
tft.setTextSize(2);
tft.setCursor(117,47);
tft.print(„o“);
tft.setTextSize(1);
tft.setCursor(1,129);
tft.print(„soll“);
tft.setTextSize(2);
tft.setCursor(117,92);
tft.print(„o“);
tft.setCursor(80,144);
tft.print(“ %“);
tft.setTextSize(1);
tft.setCursor(1,151); //60
tft.print(„pwm“);
tft.setTextSize(2);
}
void loop() {
int actual_temperature = getTemperature();
soll_temp = map(analogRead(POTI), 0, 1024, 0, MAX_POTI);
//TODO: Put in Funktion
tft.setCursor(2,55);
if (digitalRead(STANDBYin) == true)
tft.setTextColor(QDTech_BLACK);
else
tft.setTextColor(QDTech_WHITE);
tft.print(„SB“);
//
int soll_temp_tmp = soll_temp;
if (digitalRead(STANDBYin) == false)
standby_act = true;
else
standby_act = false;
if (standby_act && (soll_temp >= STANDBY_TEMP ))
soll_temp_tmp = STANDBY_TEMP;
int diff = (soll_temp_tmp + OVER_SHOT)- actual_temperature;
pwm = diff*CNTRL_GAIN;
int MAX_PWM;
//Set max heating Power
MAX_PWM = actual_temperature MAX_PWM ? pwm = MAX_PWM : pwm 550){
pwm = 0;
actual_temperature = 0;
}
analogWrite(PWMpin, pwm);
//digitalWrite(PWMpin, LOW);
writeHEATING(soll_temp, actual_temperature, pwm);
delay(DELAY_MAIN_LOOP); //wait for some time
}
int getTemperature()
{
analogWrite(PWMpin, 0); //switch off heater
delay(DELAY_MEASURE); //wait for some time (to get low pass filter in steady state)
int adcValue = analogRead(TEMPin); // read the input on analog pin 7:
Serial.print(„ADC Value „);
Serial.print(adcValue);
analogWrite(PWMpin, pwm); //switch heater back to last value
return round(((float) adcValue)*ADC_TO_TEMP_GAIN+ADC_TO_TEMP_OFFSET); //apply linear conversion to actual temperature
}
void writeHEATING(int tempSOLL, int tempVAL, int pwmVAL){
static int d_tempSOLL = 2; //Tiefpass für Anzeige (Poti zittern)
static int tempSOLL_OLD = 10;
static int tempVAL_OLD = 10;
static int pwmVAL_OLD = 10;
//TFT Anzeige
pwmVAL = map(pwmVAL, 0, 254, 0, 100);
tft.setTextSize(5);
if (tempVAL_OLD != tempVAL){
tft.setCursor(30,57);
tft.setTextColor(QDTech_BLACK);
//tft.print(tempSOLL_OLD);
//erste Stelle unterschiedlich
if ((tempVAL_OLD/100) != (tempVAL/100)){
tft.print(tempVAL_OLD/100);
}
else
tft.print(“ „);
if ( ((tempVAL_OLD/10)%10) != ((tempVAL/10)%10) )
tft.print((tempVAL_OLD/10)%10 );
else
tft.print(“ „);
if ( (tempVAL_OLD%10) != (tempVAL%10) )
tft.print(tempVAL_OLD%10 );
tft.setCursor(30,57);
tft.setTextColor(QDTech_WHITE);
if (tempVAL < 100)
tft.print(" ");
if (tempVAL 254 ? tempDIV = 254 : tempDIV < 0 ? tempDIV = 0 : tempDIV;
tft.setTextColor(Color565(tempDIV, 255-tempDIV, 0));
if (standby_act)
tft.setTextColor(QDTech_CYAN);
tft.print(tempVAL);
tempVAL_OLD = tempVAL;
}
//if (tempSOLL_OLD != tempSOLL){
if ((tempSOLL_OLD+d_tempSOLL tempSOLL)){
tft.setCursor(30,102);
tft.setTextColor(QDTech_BLACK);
//tft.print(tempSOLL_OLD);
//erste Stelle unterschiedlich
if ((tempSOLL_OLD/100) != (tempSOLL/100)){
tft.print(tempSOLL_OLD/100);
}
else
tft.print(“ „);
if ( ((tempSOLL_OLD/10)%10) != ((tempSOLL/10)%10) )
tft.print((tempSOLL_OLD/10)%10 );
else
tft.print(“ „);
if ( (tempSOLL_OLD%10) != (tempSOLL%10) )
tft.print(tempSOLL_OLD%10 );
//Neuen Wert in Weiß schreiben
tft.setCursor(30,102);
tft.setTextColor(QDTech_WHITE);
if (tempSOLL < 100)
tft.print(" ");
if (tempSOLL <10)
tft.print(" ");
tft.print(tempSOLL);
tempSOLL_OLD = tempSOLL;
}
tft.setTextSize(2);
if (pwmVAL_OLD != pwmVAL){
tft.setCursor(80,144);
tft.setTextColor(QDTech_BLACK);
//tft.print(tempSOLL_OLD);
//erste stelle Unterscheidlich
if ((pwmVAL_OLD/100) != (pwmVAL/100)){
tft.print(pwmVAL_OLD/100);
}
else
tft.print(" ");
if ( ((pwmVAL_OLD/10)%10) != ((pwmVAL/10)%10) )
tft.print((pwmVAL_OLD/10)%10 );
else
tft.print(" ");
if ( (pwmVAL_OLD%10) != (pwmVAL%10) )
tft.print(pwmVAL_OLD%10 );
tft.setCursor(80,144);
tft.setTextColor(QDTech_WHITE);
if (pwmVAL < 100)
tft.print(" ");
if (pwmVAL <10)
tft.print(" ");
tft.print(pwmVAL);
pwmVAL_OLD = pwmVAL;
}
}
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b) {
return ((r & 0xF8) << 8) | ((g & 0xFC) <> 3);
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
***************************************
LikeGefällt 1 Person
Hi,
do you still know which things you did change? It is different from the latest version on Github. What was the error you encountered first?
I am using a ST7735 from AZDelivery and i have a black screen (but the background led seems to be on).
It seems the Display Led requires 3,3V though and BL output from Arduino is 5V.
Thanks
LikeLike
I don’t have the design fully in mind anymore but from the top of my head I believe I handelnd the voltage difference just by current limiting resistors. So it is ok to connect the 5V arduino with a 3,3V display.
Maybe your screen has a different controller and you need to adapt something when initializing.
You can try some standard example code for driving this display and check if this works.
LikeLike
Hallo!! ich volte fragen wer hat das projekt gemacht es funktioniert?? Danke
Robert
LikeLike
It works perfectly. What is your issue?
LikeLike
Hallo!! ich brauche hilfe,weil es nicht funktioniert!!
LikeLike
Bittschön: Hilfe!
LikeLike
Hello!
I hope someone still reads this 🙂
I am trying to build this station, unfortunately i don’t get the display to work. I am using the following display: https://www.az-delivery.de/en/products/1-8-zoll-spi-tft-display
I wired everything accordingly (pretty sure i did) but the screen just stays black. It seems the backlight is on though.
Now i wonder what might be wrong here – i don’t really know how to debug it. I already tried another display.
The specs of the Display say there are 3,3V required for the background – if i measure the voltage on BL pin and GND i only get 0.25V. Where should i look to fix this?`
This is also already the second board i try to solder with the exact same problem, so i THINK it has nothing to do with the soldering of the parts.
LikeLike
I checked your screen and the pinout does not match with the screen which I used. VCC and GND is mixed and maybe some other signals as well. You will need to make sure you adapt the PCB with your screen via some jumper wires.
LikeLike
Hello Matthias,
thanks for your reply. I did that already – i cross checked with the original SKUxxxxxx i found (unlisted) on Amazon and made sure that my pins fit the ones from the original BOM.
LikeLike
Did you get any other example code running with this display. Maybe by just connecting it to an arduino?
LikeLike
This time, i didn’t try it. But i tried the exact same thing a year ago with different components and the display was fine, just not with this board.
I halted that project and i’m waiting on the poarts of one of your designs reworks.
Thanks though 🙂
LikeLike