Software for custom SMD-Soldering Station for Weller RT tips. This was made for a school project.

Dependencies:   TextLCD mbed

Committer:
Andi104
Date:
Fri Jun 12 17:35:05 2015 +0000
Revision:
0:c9c80e03823a
Software for Soldering Station REV2.0; (School-Project)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Andi104 0:c9c80e03823a 1 /* Libraries */
Andi104 0:c9c80e03823a 2 #include "mbed.h"
Andi104 0:c9c80e03823a 3 #include "TextLCD.h"
Andi104 0:c9c80e03823a 4
Andi104 0:c9c80e03823a 5 /* */
Andi104 0:c9c80e03823a 6 #define DELAY_M 50 //Delay before Measuring Voltage at ADC-Pin (TempNow)
Andi104 0:c9c80e03823a 7 #define TEMP_BASEGAIN 0.137931 //Temp which should equal 1mV - changed by TEMP_FACTOR
Andi104 0:c9c80e03823a 8 #define TEMP_OFFSET 0 //Offset of Temperature
Andi104 0:c9c80e03823a 9 #define CTRL_GAIN 10 //TempDifference to PWM-Value Gain
Andi104 0:c9c80e03823a 10 #define TEMP_FACTOR 1.5 //TEMP_BASEGAIN * TEMP_FACTOR = TEMP_GAIN
Andi104 0:c9c80e03823a 11
Andi104 0:c9c80e03823a 12 /* */
Andi104 0:c9c80e03823a 13 Ticker dispRefresh;
Andi104 0:c9c80e03823a 14 TextLCD lcd (p18, p16, p11, p10, p9, p8); // rs, e, d4-d7
Andi104 0:c9c80e03823a 15 DigitalOut db5(p10); //Data Pin 5 on LCD, used for Initialization
Andi104 0:c9c80e03823a 16 DigitalOut rw(p17); //Read-Write Pin on LCD: LOW-->WRITE
Andi104 0:c9c80e03823a 17 PwmOut pHeat(p26); //Heater-Pin
Andi104 0:c9c80e03823a 18 AnalogIn adc(p20); //ADC-Pin 10Bit
Andi104 0:c9c80e03823a 19 PwmOut pSpeaker(p25); //Piezo-Speaker Pin
Andi104 0:c9c80e03823a 20 InterruptIn rotSw1(p35); //Pin 1 of Rotary Encoder
Andi104 0:c9c80e03823a 21 DigitalIn rotSw2(p33); //Pin 2 of Rotary Encoder
Andi104 0:c9c80e03823a 22 InterruptIn rotSwB(p30); //Button of Rotary Encoder
Andi104 0:c9c80e03823a 23 DigitalOut tempCtrlLED(LED1);
Andi104 0:c9c80e03823a 24
Andi104 0:c9c80e03823a 25 /* */
Andi104 0:c9c80e03823a 26 float TempNow = 0; //Current Temperature Reading
Andi104 0:c9c80e03823a 27 float TempSet = 200; //Set Temperature
Andi104 0:c9c80e03823a 28 float pwmVal = 0; //PWM-Value for Heater-Pin
Andi104 0:c9c80e03823a 29 float adcVal = 0; //Value of ADC-Reading
Andi104 0:c9c80e03823a 30
Andi104 0:c9c80e03823a 31 /* */
Andi104 0:c9c80e03823a 32 void writeLCD();
Andi104 0:c9c80e03823a 33 void init4BitLCD();
Andi104 0:c9c80e03823a 34 void readTemp();
Andi104 0:c9c80e03823a 35 void calcPWM();
Andi104 0:c9c80e03823a 36 void RotEnc();
Andi104 0:c9c80e03823a 37 void RotBut();
Andi104 0:c9c80e03823a 38
Andi104 0:c9c80e03823a 39 int ticker = 500;
Andi104 0:c9c80e03823a 40 Ticker t;
Andi104 0:c9c80e03823a 41 void tick_1(){
Andi104 0:c9c80e03823a 42 if(ticker > 0) ticker--;
Andi104 0:c9c80e03823a 43 }
Andi104 0:c9c80e03823a 44
Andi104 0:c9c80e03823a 45 int main() {
Andi104 0:c9c80e03823a 46 //Initialize
Andi104 0:c9c80e03823a 47 init4BitLCD(); //Set Display to 4 Bit-Mode
Andi104 0:c9c80e03823a 48 rw = 0; // Set Read/Write Pin to Write
Andi104 0:c9c80e03823a 49 rotSw1.rise(&RotEnc);
Andi104 0:c9c80e03823a 50 rotSwB.rise(&RotBut);
Andi104 0:c9c80e03823a 51 pSpeaker.period_ms(2); //Set Speaker Frequency to 500Hz
Andi104 0:c9c80e03823a 52 //pHeat = 0.1;
Andi104 0:c9c80e03823a 53
Andi104 0:c9c80e03823a 54 t.attach(&tick_1, 0.001);
Andi104 0:c9c80e03823a 55 while(1) {
Andi104 0:c9c80e03823a 56 readTemp(); //Read Temperature - Done
Andi104 0:c9c80e03823a 57 calcPWM(); //Calculate PWM-Value - Done
Andi104 0:c9c80e03823a 58 pHeat = pwmVal; //Write PWM-Value to Heater - Done
Andi104 0:c9c80e03823a 59 if(ticker == 0){
Andi104 0:c9c80e03823a 60 writeLCD(); //Write To LCD - Done
Andi104 0:c9c80e03823a 61 ticker = 500;
Andi104 0:c9c80e03823a 62 }
Andi104 0:c9c80e03823a 63 //Repeat
Andi104 0:c9c80e03823a 64 }
Andi104 0:c9c80e03823a 65 }
Andi104 0:c9c80e03823a 66
Andi104 0:c9c80e03823a 67 void RotBut()
Andi104 0:c9c80e03823a 68 {tempCtrlLED = !tempCtrlLED;
Andi104 0:c9c80e03823a 69 if (pSpeaker == 0){pSpeaker = 0.5;}
Andi104 0:c9c80e03823a 70 else {pSpeaker = 0;}}
Andi104 0:c9c80e03823a 71
Andi104 0:c9c80e03823a 72 void RotEnc()
Andi104 0:c9c80e03823a 73 {
Andi104 0:c9c80e03823a 74 if (rotSw2 == 0){TempSet++;}
Andi104 0:c9c80e03823a 75 else if (rotSw2 == 1){TempSet--;}
Andi104 0:c9c80e03823a 76 wait_ms(1);
Andi104 0:c9c80e03823a 77 }
Andi104 0:c9c80e03823a 78
Andi104 0:c9c80e03823a 79 void calcPWM()
Andi104 0:c9c80e03823a 80 {
Andi104 0:c9c80e03823a 81 pwmVal = ((TempSet - TempNow) * CTRL_GAIN) / 255; //Calculate PWM-Val.
Andi104 0:c9c80e03823a 82 if (pwmVal > 1) pwmVal = 1;
Andi104 0:c9c80e03823a 83 else if (pwmVal < 0) pwmVal = 0;
Andi104 0:c9c80e03823a 84 }
Andi104 0:c9c80e03823a 85
Andi104 0:c9c80e03823a 86 void readTemp()
Andi104 0:c9c80e03823a 87 { pHeat = 0; //Switching Off Heater || Thermoelement --> No VoltageSupply
Andi104 0:c9c80e03823a 88 wait_ms(DELAY_M); //Waiting for a bit|| Low-Pass Filter --> Ready State
Andi104 0:c9c80e03823a 89 adcVal = adc.read(); //Read ADC
Andi104 0:c9c80e03823a 90 TempNow = adcVal*3300*(TEMP_BASEGAIN * TEMP_FACTOR) + TEMP_OFFSET; //Calculate current Temperature
Andi104 0:c9c80e03823a 91 pHeat = pwmVal; //Re-Activate Heater Pin
Andi104 0:c9c80e03823a 92 }
Andi104 0:c9c80e03823a 93
Andi104 0:c9c80e03823a 94 void writeLCD()
Andi104 0:c9c80e03823a 95 { char cHeat;
Andi104 0:c9c80e03823a 96 if(pwmVal > 0.5){cHeat = 'H';}
Andi104 0:c9c80e03823a 97 else{cHeat = ' ';}
Andi104 0:c9c80e03823a 98 lcd.cls();
Andi104 0:c9c80e03823a 99 lcd.printf("Set: %.0f C %c\nNow: %.0f C", TempSet, cHeat, TempNow);}
Andi104 0:c9c80e03823a 100
Andi104 0:c9c80e03823a 101 void init4BitLCD()
Andi104 0:c9c80e03823a 102 { db5 = 1; wait_ms(1); lcd.cls();}