![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Software for custom SMD-Soldering Station for Weller RT tips. This was made for a school project.
main.cpp@0:c9c80e03823a, 2015-06-12 (annotated)
- 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?
User | Revision | Line number | New 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();} |