/* * 60W PD Powered Automatic Reflow Hoteplate * Author: tobychui * * Notes: * Temperature sensing is done using 1k 1% resistor and a 10k Thermistor * You might need to change the code if you are using other values * * Touch Button Mappings * Start Btn: P1.4 * Stop Btn: P1.7 */ #include <TouchKey.h> #define TEMP_PIN 11 //P1.1 #define HEATER_PIN 34 //P3.4 #define LED_PREHEAT 15 //P1.5 #define LED_REFLOW 16 //P1.6 #define HOLDSTART_TIME 100 //in cycles #define COOLDOWN_TEMP_ADC 255 //Room temperature //Preheat power settings #define PREHEAT_TEMP_ADC 155 //160 degree C #define PREHEAT_PWR_PWM 150 //160 degree C //Reflow power settings #define REFLOW_TEMP_ADC 123 //220 degree C #define REFLOW_PWR_PWM 255 #define CUTOFF_TEMP_ADC 100 //240 degree C, overheat cutoff //Func def void updateHeaterPowerState(); void updateKeyStates(); int readTemp(); //Runtimes bool reflowing = false; int startCountdown = HOLDSTART_TIME; //Hold for 1000ms to start int currentHeatplateTemp = 0; //Converted temperature in degree C (rounded) int cycleCounter = 0; //Record cycle time up to 10 seconds bool blinkState = false; //If blinking this will be switching between true and false bool reflowComplete = false; //Indicate if the stopping is done because of reflow complete int targetTempADC = 255; //Target ADC reading to reach, 255 = room temperature int targetPwrPWM = 0; //Target PWM cycle for heater, 255 = full power, 0 = off int offset = 1; //Allow +-offset for the ADC reading before reheating / cooling void setup() { //Enable the touch buttons //Enable all 6 channels:TIN2(P1.4),TIN5(P1.7) TouchKey_begin((1 << 2) | (1 << 5)); //Set LED pins to output pinMode(LED_PREHEAT, OUTPUT); pinMode(LED_REFLOW, OUTPUT); digitalWrite(LED_PREHEAT, LOW); digitalWrite(LED_REFLOW, LOW); //Set temp sense pin to input pinMode(TEMP_PIN, INPUT); //Set mosfet control pins to output and disable it pinMode(HEATER_PIN, OUTPUT); digitalWrite(HEATER_PIN, LOW); } void loop() { //Check key status updateKeyStates(); //Update current temperature value if (reflowing){ //Reflowing. cycle time = 100ms updateHeaterPowerState(); }else{ //Standby, cycle time = 10ms digitalWrite(HEATER_PIN, LOW); if (cycleCounter%200 == 0){ if (reflowComplete){ //Reflow done blink if (blinkState){ digitalWrite(LED_REFLOW, HIGH); }else{ digitalWrite(LED_REFLOW, LOW); } }else{ //Standby blink if (blinkState){ digitalWrite(LED_PREHEAT, HIGH); }else{ digitalWrite(LED_PREHEAT, LOW); } } blinkState = !blinkState; } delay(10); } //Cycle printout //USBSerial_println("cycle"); cycleCounter++; if (cycleCounter > 10000){ cycleCounter = 0; } }