DIY SMD - Lötstation Ersatz für (WELLER)

Beber

Erfahrener Benutzer
Hey,
wäre nach wie vor auch noch an einem Teileset interessiert, falls einer eins übrig hätte.
Display liegt hier schon vor mir :-D

Gruß Beber
 

tomm

Erfahrener Benutzer
Kannst du mir bitte mal deinen Sketch schicken und kurz sagen welche libs du in welcher Version von wo benutzt hast?
IDE hast du ja die 1.6.4 verwendet hab ich gelesen.
hallo klaus,

folgende libs
Adafruit-GFX https://github.com/adafruit/Adafruit-GFX-Library
Adafruit-ST7735 https://github.com/adafruit/Adafruit-ST7735-Library
FastLED https://github.com/FastLED/FastLED

sketch https://github.com/CSchlipp/SolderingStation/tree/master/arduino

alles jeweils in der aktuellen version.
arduino ide ist auf jeden fall 1.6. welche unterversion kann ich dir aus dem kopf nicht sagen, sollte aber egal sein.

ich hatte zum testen ob das display geht das ganze mal schnell an einen uno gesteckt und das beispiel
"graphictest" aus der st7735 library geflasht. nur um eben mal zu testen, ob das display auch richtig läuft um nicht später nach dem problem zu suchen (da ich eh keine ahnung hätte, wo ich ansetzen soll)
vielleicht versuchst du das auch mal nur um zu schauen, ob das display funktioniert.

wie das board beschriftet ist, kann ich dir erst heute nacht sagen. pins hatten auf jeden fall gepasst, "mosi" war als "din" beschriftet, da der rest aber offensichtlich war, war das dann aber auch klar.

btw, auf deinem bild sieht das so aus, als ob das display nicht mit der vorderkante des boards bündig ist. falls du das gehäuse von github verwenden möchtest, gehört das display an die vorderkante. dafür braucht es die besagte gewinkelte buchsenleiste, die ich auch nicht hatte.

vg
tom
 
Also meins lebt:



Da ich aktuell an die Lötspitzen vom Kumpel nicht rankomme, weil der Kumpel krank ist und ich mein Display auch recht weit hinten verlötet habe. Geh ich mal in den Keller en Probegehäuse drucken ^^
 

.jan

Neuer Benutzer
Läuft bei mir auf Anhieb :) habe aber die v1.5

Hochgeladen über einen Uno. Die WS2812 Led funktioniert auch :)
Die Libraries habe ich in den Arduino Ordner in den "Dokumenten" gelegt.

Bin sehr zufrieden. Muss nur noch das Poti anschließen.

Code:
//*******************************//
// Soldering Station
// Matthias Wagner
// [url]www.k-pank.de/so[/url]
// [email][email protected][/email]
//*******************************//

#define __PROG_TYPES_COMPAT__ 
#include <FastLED.h>
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

#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		// 

#define LED_PIN 6
#define BRIGHTNESS 200

//Missing color in TFT lib
#define ST7735_GREY 0x632C

//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_ST7735 tft = Adafruit_ST7735(cs_tft, dc, rst);  // Invoke custom library

int pwm = 0; //pwm Out Val 0.. 255
int soll_temp = 300;
boolean standby_act = false;
CRGB led[1];

void setup(void) {

	FastLED.addLeds<WS2812B, LED_PIN, GRB>(led, 1);
	FastLED.setBrightness(BRIGHTNESS);
	led[0] = CRGB::White;
	
	pinMode(BLpin, OUTPUT);
	digitalWrite(BLpin, LOW);
	
	pinMode(STANDBYin, INPUT_PULLUP);
	
	pinMode(PWMpin, OUTPUT);
	digitalWrite(PWMpin, LOW);
	setPwmFrequency(PWMpin, PWM_DIV);
	digitalWrite(PWMpin, LOW);
	
	tft.initR(INITR_BLACKTAB);
	SPI.setClockDivider(SPI_CLOCK_DIV4);  // 4MHz
	
	tft.setRotation(1);	// 0 - Portrait, 1 - Lanscape
	tft.fillScreen(ST7735_BLACK);
	tft.setTextWrap(true);
	
	//Print station Logo
	tft.drawBitmap(2,1,stationLOGO1,124,47,ST7735_GREY);
	tft.drawBitmap(3,3,stationLOGO1,124,47,ST7735_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,ST7735_GREY);
	tft.drawBitmap(17,52,iron,100,106,ST7735_YELLOW);
	delay(500);
	
	tft.setTextSize(2);
	tft.setTextColor(ST7735_GREY);
	tft.setCursor(70,130);
	tft.print(VERSION);
	
	tft.setTextSize(2);
	tft.setTextColor(ST7735_YELLOW);
	tft.setCursor(72,132);
	tft.print(VERSION);
	
	tft.setTextSize(1);
	tft.setTextColor(ST7735_GREY);
	tft.setCursor(103,0);
	tft.print("v");
	tft.print(VERSION);
	
	tft.setTextColor(ST7735_YELLOW);
	tft.setCursor(104,1);
	tft.print("v");
	tft.print(VERSION);
	
	delay(2500);
#endif
	
	tft.fillRect(0,47,128,125,ST7735_BLACK);
	tft.setTextColor(ST7735_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(ST7735_BLACK);
	} else {
		tft.setTextColor(ST7735_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 <= STANDBY_TEMP ? MAX_PWM_LOW : MAX_PWM_HI;
	
	//8 Bit Range
	pwm = pwm > MAX_PWM ? pwm = MAX_PWM : pwm < 0 ? pwm = 0 : pwm;
	
	//NOTfall sicherheit / Spitze nicht eingesteckt
	if (actual_temperature > 550){
		pwm = 0;
		actual_temperature = 0;
	}
	
	analogWrite(PWMpin, pwm);
	//digitalWrite(PWMpin, LOW);
	
	writeHEATING(soll_temp, actual_temperature, pwm);
 
	//update LED
	FastLED.show();
	
	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(ST7735_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(ST7735_WHITE);
		
		if (tempVAL < 100) {
			tft.print(" ");
		}
		if (tempVAL <10) {
			tft.print(" ");
		}
		
		int tempDIV = round(float(tempSOLL - tempVAL)*8.5);
		tempDIV = tempDIV > 254 ? tempDIV = 254 : tempDIV < 0 ? tempDIV = 0 : tempDIV;
		tft.setTextColor(Color565(tempDIV, 255-tempDIV, 0));
		led[0].r = tempDIV;
		led[0].g = 255-tempDIV;
		led[0].b = 0;
		if (standby_act) {
			tft.setTextColor(ST7735_CYAN);
			led[0].r = 0;
			led[0].g = 0;
			led[0].b = 255;
		}
		tft.print(tempVAL);
		
		tempVAL_OLD = tempVAL;
	}
	
	//if (tempSOLL_OLD != tempSOLL){
	if ((tempSOLL_OLD+d_tempSOLL < tempSOLL) || (tempSOLL_OLD-d_tempSOLL > tempSOLL)){
		tft.setCursor(30,102);
		tft.setTextColor(ST7735_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(ST7735_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(ST7735_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(ST7735_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) | (b >> 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 = 0x07; break;
			default: return;
		}
		
		TCCR2B = TCCR2B & 0b11111000 | mode;
	}
}
 

Anhänge

McFly83

Erfahrener Benutzer
Bis eben dachte ich ich hätte ein anderes Display. Jetzt sehe ich deines und es hat auch da orangene label... Du hast also exakt das gleiche wie ich.
 

tomm

Erfahrener Benutzer
hat sich schon einer damit beschäftigt, was für den standby zu ändern ist?

matthias wagner schreibt im blog
There is only one small change in V1.6, which is the resistor R13. I changed it form a pull-down to a pull-up so I can detect when the soldering tip is disconnected. This feature did not work with a pull-down… You can just fix that but with a small wire and a resistor on the board.
wir haben die boardversion 1.5, das war die bei dirtypcbs hinterlegte.

ändert sich bei euch eigentlich der sollwert, wenn ihr am poti dreht? bei mir nämlich nicht und klinkenkabel für die lötspitze hab ich noch nicht gelötet.
 

AndreasL90

Erfahrener Benutzer
Mir ist auch aufgefallen, dass das 10kOhm Poti als Spannungsteiler mit dem 1MOhm Widerstand recht wenig bewirken kann... ;)
Es sei denn, ich hab was falsch verstanden - aber die am ADC des Arduino anliegende Spannung kann so nur zwischen 5V und ca. 4,95C variiert werden.
Wie hast du das Poti angeschlossen?
 

tomm

Erfahrener Benutzer
ich habs an JP3 zwischen pin 1 und 2 gehängt.
so hab ich das zumindest verstanden.

MatthiasW hat gesagt.:
The resistance of the poti does not really matter as it is just a voltage divider. I used 10k.
The poti is connected to JP3 on pin 2 and the standby wire (from the holding pipe) is connected to JP3 pin 3
JP4 is not used in this project. The connector is just there in case you want to connect a fan or something like that.
wenn ich mir den schaltplan anschaue, hast du natürlich recht. so richtig sinn macht das nicht.
 

.jan

Neuer Benutzer
Bis eben dachte ich ich hätte ein anderes Display. Jetzt sehe ich deines und es hat auch da orangene label... Du hast also exakt das gleiche wie ich.
Habe das Display von ebay was hier mal verlinkt wurde. Habe nur noch einen kleinen Wackelkontakt aber der liegt wohl in den Kabeln/Steckern.

Wie hast du das Poti angeschlossen?
Habe mit dem Poti etwas herumgespielt, fand das auch eher komisch. Jetzt habe ich GND-Poti-VCC daran angeschlossen und damit funktioniert es. So kann man mit dem Poti die Spannung am Pin von den Extremzuständen GND nach VCC (mit 1 MOhm Schutzwiderstand) drehen. Potentiometer an Arduino

Was den Standby angeht sehe ich nicht was am Board geändert werden müsste. So wie ich das sehe ist dort auch bei v1.5 ein Widerstand von 1kOhm gegen VCC was doch einem Pull-Up entspricht, oder nicht? Habe leider nicht die eagle-Dateien zu v1.5
Wenn etwas zu ändern währe dann höchstens im Code die Logik diesbezüglich umzukehren.
 
Zuletzt bearbeitet:

taler

Erfahrener Benutzer
Im Schaltplan ist eingezeichnet dass R13 gegen +5V geht.
Auf der Leiterplatte geht R13 bei mir aber auf GND.
(diese habe ich übrigens bisher mit SMD Größe 0803 bestückt - geht auch)

Der Standby-Pin ist doch der links vom Arduino auf Pin 6, richtig?
Wenns Display mal angeschlossen ist, und falls es funktioniert, werde ich einfach mal probieren den Eingang auf GND oder mit z.B. 100KOhm auf +5V zu legen und dann beobachten, ob und wenn, was sich was tut.

In irgendeiner Stellung sollte die Temperatur ja auf den Grundwert sinken. Lt. Programmcode ist die standby_temp 175 festgelegt.

Zur Fertigstellung fehlen mir noch ein paar Bauteile, weshalb ich bei Reichelt noch shoppen werde.

Gruß taler platine2.jpg
 
Zuletzt bearbeitet:

.jan

Neuer Benutzer
Pin 6 links geht direkt auf einen leeren Pin (JP4). Den habe ich schon erfolgreich als WS2812 Led Daten Pin genutzt :)

Ich denke der Standby Pin ist in der 4er Reihe (JP3) mit SB beschriftet.
Ich dachte es ginge um R12 welcher gegen VCC geht. Aber es stimmt bei v1.5 geht R13 auf GND und nicht wie in v1.6 gegen 5V.
Werde da mal die Tage noch etwas nachforschen.
 

AndreasL90

Erfahrener Benutzer
Das Poti müsste also mit Pin 1 (rechts, wenn Dreachse von einem weg zeigt) an JP3 Pin 1 (oder 4) angeschlossen werden.
Pin 2 (neben 1 :D) an JP3 Pin 2 ("Poti") und Pin 3 an JP3 Pin 4 (oder 1, falls JP3 Pin 1 schon auf 4 liegt).
 

tomm

Erfahrener Benutzer
hab mal das boardlayout von dirtypcb ein bischen umgefärbt, damit man es besser erkennen kann.
6b37a6c891915299a4a0c442cef3308c-699_bottom.jpg
jan hat schon recht. lötspitze geht über r13 gegen GND und nicht wie beim 1.6 gegen 5v.
das heißt, R13 wieder auslöten und frei verdrahtet den pin der lötspitze über widerstand gegen 5V legen?

und der SB-pin kommt dann an das alurohr, in das man die lötspitze bei nichtbenutzung steckt?
 

taler

Erfahrener Benutzer
"R13 wieder auslöten und frei verdrahtet den pin der lötspitze über widerstand gegen 5V legen?"
"und der SB-pin kommt dann an das alurohr, in das man die lötspitze bei nichtbenutzung steckt"

SB tät ich auch an der Lötspitzenablage anschließen.
Dann probieren mit welcher Polarität der Kontakt reagiert bzw. funktioniert.
Gegebenfalls halt umlöten.
 

.jan

Neuer Benutzer
Habe gerade einfach mal den Test gemacht.
Wenn im Fall von Platinenversion 1.5 SB-Pin auf GND geht schaltet es um auf Standby. Ich gehe mal davon aus, dass in unserer Konfiguration das Gehäuse der Lötspitze auch auf GND ist. So sollte es ohne Modifikationen funktionieren, wenn es denn funktioniert..
Um auf v1.6 zu kommen müsste man dann wie ihr schon gesagt habt den R13 richtung 5V drehen. So steht es ja auch im Schaltplan von v1.6. Dann müsste man aber auch Anpassungen im Code machen (aber vielleicht habe ich einen etwas älteren).
 

McFly83

Erfahrener Benutzer
Ich muss erstmal Troubleshooting betreiben, bekomme es noch immer nicht ans Laufen, hab das Display jetzt ausgelötet und Steckleiste eingelötet, schliesst jetzt auch schön ab. Werde das Teil erstmal an einem uno testen und ggf. ein neues Display ordern. Steht zwar ST7735 auf dem Tütchen, aber ich glaube da nicht mehr dran. Auf der ebay Seite steht ST7735B, also mit “initB“ und nicht mit “initR“ initialisieren, leider fehlen mir dabei noch weitere Angaben die ich nicht finden kann, einfach ändern reicht leider nicht.

@Tom, falls das eine von BG bereits angekommen sein sollte schreib mir grad, würde was schneller gehen. ;)
 
Zuletzt bearbeitet:

tomm

Erfahrener Benutzer
Was hat es mit der WS2812 auf sich was zeigt die an? Wo wird die Angeschlossen?
Chris Schlipp hat gesagt.:
I’ve forked the repository and performed the required changes,
Furthermore, I’ve added support for a WS2812 RGB led on the remaining aux-pin. When printing the top cover in clear plastic, the whole station shines in the same color as the text on the display, e.g. fading from red to green when reaching the selected temprature or blue during standby.
@mcfly83
sorry. das noch ausstehende display ist immer noch verschollen. dabei war es das erste, das ich bestellt hatte.
 

.jan

Neuer Benutzer
Hatte heute die Station testweise mit der Lötspitze in Betrieb.
Die Station zieht beim Aufheizen einen Strom von knapp über 2 A bei 12 V

Standby funktioniert auch in der Konfiguration wie es jetzt ist. Müsste man vielleicht Langzeittest machen aber für mich sah das jetzt ganz gut aus. Hab den SB-Pin einfach mal an das Metall der Lötspitze gehalten.

Das Poti habe ich an JP3 Pin 1,2 und 4.

Die WS2812 Led kommt an JP4. Das ist der Datenpin, dazu kommt natürlich noch VCC und GND. Leuchtet dann eben in besagter Farbe.
 
Zuletzt bearbeitet:
FPV1

Banggood

Oben Unten