Paul van der Wielen
/
Reflow_Oven_Controller
based on existing code, added support for max31855 and i2c display
main.cpp@2:67c271b56755, 2014-01-19 (annotated)
- Committer:
- pwheels
- Date:
- Sun Jan 19 14:09:22 2014 +0000
- Revision:
- 2:67c271b56755
- Parent:
- 1:e7ce82863fe9
update on display coding
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pwheels | 0:1f9875adab5d | 1 | //----------------------------------------------------------------------- |
pwheels | 0:1f9875adab5d | 2 | // reflow oven controller, adapted to i2c display |
pwheels | 0:1f9875adab5d | 3 | // |
pwheels | 0:1f9875adab5d | 4 | // Version 1.0 - December 2003 |
pwheels | 0:1f9875adab5d | 5 | // |
pwheels | 0:1f9875adab5d | 6 | // ATOM-Pro basic for Renesas '3687 |
pwheels | 0:1f9875adab5d | 7 | // |
pwheels | 0:1f9875adab5d | 8 | // Copyright (name deleted) and it's rights are not referenced in the orignal on mbed |
pwheels | 0:1f9875adab5d | 9 | // |
pwheels | 0:1f9875adab5d | 10 | // This project is a port from the original basic code for the Basic Micro EVB87 |
pwheels | 0:1f9875adab5d | 11 | // Renesas evaluation board to the mbed in C. |
pwheels | 0:1f9875adab5d | 12 | // |
pwheels | 0:1f9875adab5d | 13 | // We use the same setup as the original project: |
pwheels | 0:1f9875adab5d | 14 | // For the thermocouple, a Maxim 31855K, the GHI thermocouple board was used |
pwheels | 0:1f9875adab5d | 15 | // For the buttons, 3 push buttons connected to ground and pullups. |
pwheels | 0:1f9875adab5d | 16 | // For the heater, any driver configuration. |
pwheels | 0:1f9875adab5d | 17 | // |
pwheels | 0:1f9875adab5d | 18 | // fixed major bug in UpdateStateMachine() switch / case tests on wrong value |
pwheels | 0:1f9875adab5d | 19 | // |
pwheels | 0:1f9875adab5d | 20 | // http://www.circuitcellar.com/renesas/winners/Abstracts/H3323%20abstract.pdf |
pwheels | 0:1f9875adab5d | 21 | // no info could be found on above link but use next link instead. |
pwheels | 0:1f9875adab5d | 22 | // http://hobbybotics.com/projects/hobbybotics-reflow-controller-v8-03/ |
pwheels | 0:1f9875adab5d | 23 | //----------------------------------------------------------------------- |
pwheels | 0:1f9875adab5d | 24 | |
pwheels | 0:1f9875adab5d | 25 | #include "mbed.h" |
pwheels | 0:1f9875adab5d | 26 | #include "lc_display.h" |
pwheels | 0:1f9875adab5d | 27 | #include "max31855.h" |
pwheels | 0:1f9875adab5d | 28 | |
pwheels | 0:1f9875adab5d | 29 | // 0 button pressed, 1 button released |
pwheels | 0:1f9875adab5d | 30 | DigitalIn Btn_0(p18); |
pwheels | 0:1f9875adab5d | 31 | DigitalIn Btn_1(p19); |
pwheels | 0:1f9875adab5d | 32 | DigitalIn Btn_2(p20); |
pwheels | 0:1f9875adab5d | 33 | |
pwheels | 0:1f9875adab5d | 34 | // 0 off, 1 on |
pwheels | 0:1f9875adab5d | 35 | DigitalOut HeaterOutput(p21); |
pwheels | 0:1f9875adab5d | 36 | |
pwheels | 0:1f9875adab5d | 37 | // Use the USB link as serial port |
pwheels | 0:1f9875adab5d | 38 | Serial pc(USBTX, USBRX); // tx, rx |
pwheels | 0:1f9875adab5d | 39 | |
pwheels | 0:1f9875adab5d | 40 | //SPI Interfaces |
pwheels | 0:1f9875adab5d | 41 | SPI testSPI(p11,p12,p13); |
pwheels | 0:1f9875adab5d | 42 | //Thermocouples |
pwheels | 0:1f9875adab5d | 43 | max31855 max1(testSPI,p26); |
pwheels | 0:1f9875adab5d | 44 | |
pwheels | 0:1f9875adab5d | 45 | //======================================================================= |
pwheels | 0:1f9875adab5d | 46 | // variables |
pwheels | 0:1f9875adab5d | 47 | //======================================================================= |
pwheels | 0:1f9875adab5d | 48 | |
pwheels | 0:1f9875adab5d | 49 | int PreheatSlope; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 50 | int DryingTemp; // 20 to 250, °C |
pwheels | 0:1f9875adab5d | 51 | int Hysteresis; // 1 to 20, °C |
pwheels | 0:1f9875adab5d | 52 | int DryingTime; // 1 to 255, seconds |
pwheels | 0:1f9875adab5d | 53 | int HeatingSlope; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 54 | int ReflowTemp; // 150 to 255, °C |
pwheels | 0:1f9875adab5d | 55 | int ReflowTime; // 1 to 255, seconds |
pwheels | 0:1f9875adab5d | 56 | int CoolingSlope; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 57 | int Kd; // kd muliplier for pid, in 1/10 |
pwheels | 0:1f9875adab5d | 58 | |
pwheels | 0:1f9875adab5d | 59 | char status; // state machine status |
pwheels | 0:1f9875adab5d | 60 | int t; // current temperature |
pwheels | 0:1f9875adab5d | 61 | int tini; // initial temperature |
pwheels | 0:1f9875adab5d | 62 | int tset10; // set temperature times 10 |
pwheels | 0:1f9875adab5d | 63 | int tset; // set temperature |
pwheels | 0:1f9875adab5d | 64 | int remaining_time; // remaining time in s |
pwheels | 0:1f9875adab5d | 65 | char heater; // heater on/off |
pwheels | 0:1f9875adab5d | 66 | int tprec; // previous temperature |
pwheels | 0:1f9875adab5d | 67 | int testim; // estimated future temperature |
pwheels | 0:1f9875adab5d | 68 | |
pwheels | 0:1f9875adab5d | 69 | // Used to toggle between 2 display screens |
pwheels | 0:1f9875adab5d | 70 | char dispcycle; // display cycle (0/1/0/1...) |
pwheels | 0:1f9875adab5d | 71 | |
pwheels | 0:1f9875adab5d | 72 | int alow; |
pwheels | 0:1f9875adab5d | 73 | int ahigh; |
pwheels | 0:1f9875adab5d | 74 | float atemp; |
pwheels | 0:1f9875adab5d | 75 | |
pwheels | 0:1f9875adab5d | 76 | char *lcd_status[] = { |
pwheels | 0:1f9875adab5d | 77 | "UpDry ","WtDry ","Drying ","UpFlow ","WtFlow ","Reflow ","Coolng " |
pwheels | 0:1f9875adab5d | 78 | }; |
pwheels | 0:1f9875adab5d | 79 | |
pwheels | 0:1f9875adab5d | 80 | #define PREHEAT 1 |
pwheels | 0:1f9875adab5d | 81 | #define WAIT_DRYING 2 |
pwheels | 0:1f9875adab5d | 82 | #define DRYING 3 |
pwheels | 0:1f9875adab5d | 83 | #define HEAT 4 |
pwheels | 0:1f9875adab5d | 84 | #define WAIT_REFLOW 5 |
pwheels | 0:1f9875adab5d | 85 | #define REFLOW 6 |
pwheels | 0:1f9875adab5d | 86 | #define COOLING 7 |
pwheels | 0:1f9875adab5d | 87 | |
pwheels | 0:1f9875adab5d | 88 | void heater_off(void) { |
pwheels | 1:e7ce82863fe9 | 89 | HeaterOutput.write(0); |
pwheels | 0:1f9875adab5d | 90 | } |
pwheels | 0:1f9875adab5d | 91 | |
pwheels | 0:1f9875adab5d | 92 | void heater_on(void) { |
pwheels | 1:e7ce82863fe9 | 93 | HeaterOutput.write(1); |
pwheels | 0:1f9875adab5d | 94 | } |
pwheels | 0:1f9875adab5d | 95 | |
pwheels | 0:1f9875adab5d | 96 | //======================================================================= |
pwheels | 0:1f9875adab5d | 97 | // Subroutines |
pwheels | 0:1f9875adab5d | 98 | //======================================================================= |
pwheels | 0:1f9875adab5d | 99 | |
pwheels | 0:1f9875adab5d | 100 | // Initialisation |
pwheels | 0:1f9875adab5d | 101 | void Init(void) { |
pwheels | 0:1f9875adab5d | 102 | // Welcome screen |
pwheels | 0:1f9875adab5d | 103 | _WriteLCD(ClrDisplay); |
pwheels | 0:1f9875adab5d | 104 | _WriteLCD(DisplayON_OFF, 1, 1, 0); |
pwheels | 0:1f9875adab5d | 105 | _WriteLCD(WriteString, " REFLOW CONTROL ", 0); |
pwheels | 0:1f9875adab5d | 106 | _WriteLCD(SetCursor, 0x14); |
pwheels | 0:1f9875adab5d | 107 | _WriteLCD(WriteString, " V2.0a ", 0); |
pwheels | 0:1f9875adab5d | 108 | wait_ms(1000); |
pwheels | 0:1f9875adab5d | 109 | |
pwheels | 0:1f9875adab5d | 110 | // Initialize variables to default values |
pwheels | 0:1f9875adab5d | 111 | PreheatSlope = 10; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 112 | DryingTemp = 100; // 20 to 250, °C |
pwheels | 0:1f9875adab5d | 113 | Hysteresis = 5; // 1 to 20, °C |
pwheels | 0:1f9875adab5d | 114 | DryingTime = 120; // 1 to 255, seconds |
pwheels | 0:1f9875adab5d | 115 | HeatingSlope = 40; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 116 | ReflowTemp = 250; // 150 to 255, °C |
pwheels | 0:1f9875adab5d | 117 | ReflowTime = 45; // 1 to 255, seconds |
pwheels | 0:1f9875adab5d | 118 | CoolingSlope = 20; // 1 to 255, 1/10° per sec |
pwheels | 0:1f9875adab5d | 119 | Kd = 10; // 0 to 100, kd multiplier in 1/10 |
pwheels | 0:1f9875adab5d | 120 | |
pwheels | 0:1f9875adab5d | 121 | //Initialise chip (starts internal timer) |
pwheels | 0:1f9875adab5d | 122 | max1.initialise(); |
pwheels | 0:1f9875adab5d | 123 | } |
pwheels | 0:1f9875adab5d | 124 | |
pwheels | 0:1f9875adab5d | 125 | void editnum(int *value,int minval,int maxval) { |
pwheels | 0:1f9875adab5d | 126 | int v; |
pwheels | 0:1f9875adab5d | 127 | char tmp[32] = {0}; |
pwheels | 0:1f9875adab5d | 128 | v = *value; |
pwheels | 0:1f9875adab5d | 129 | |
pwheels | 0:1f9875adab5d | 130 | do { |
pwheels | 0:1f9875adab5d | 131 | wait_ms(200); |
pwheels | 0:1f9875adab5d | 132 | _WriteLCD(SetCursor, 0x0a); |
pwheels | 0:1f9875adab5d | 133 | sprintf(tmp, "%3d", v); |
pwheels | 0:1f9875adab5d | 134 | _WriteLCD(WriteString, tmp, 4); |
pwheels | 0:1f9875adab5d | 135 | _WriteLCD(SetCursor, 0x14); |
pwheels | 0:1f9875adab5d | 136 | _WriteLCD(WriteString, "[2+][1-] [0:end] ", 0); |
pwheels | 0:1f9875adab5d | 137 | |
pwheels | 0:1f9875adab5d | 138 | if (Btn_1.read() == 0) { |
pwheels | 0:1f9875adab5d | 139 | v--; |
pwheels | 0:1f9875adab5d | 140 | if (v < minval) v = minval; |
pwheels | 0:1f9875adab5d | 141 | } |
pwheels | 0:1f9875adab5d | 142 | |
pwheels | 0:1f9875adab5d | 143 | if (Btn_2.read() == 0) { |
pwheels | 0:1f9875adab5d | 144 | v++; |
pwheels | 0:1f9875adab5d | 145 | if (v > maxval) v = maxval; |
pwheels | 0:1f9875adab5d | 146 | } |
pwheels | 0:1f9875adab5d | 147 | |
pwheels | 0:1f9875adab5d | 148 | } while (Btn_0.read() != 0); |
pwheels | 0:1f9875adab5d | 149 | |
pwheels | 0:1f9875adab5d | 150 | *value = v; |
pwheels | 0:1f9875adab5d | 151 | } |
pwheels | 0:1f9875adab5d | 152 | |
pwheels | 0:1f9875adab5d | 153 | void UpdateStateMachine(void) { |
pwheels | 0:1f9875adab5d | 154 | if (status == 0) return; |
pwheels | 0:1f9875adab5d | 155 | // original had (status - 1) but this fail to work |
pwheels | 0:1f9875adab5d | 156 | switch (status) { |
pwheels | 0:1f9875adab5d | 157 | case PREHEAT: |
pwheels | 0:1f9875adab5d | 158 | tset10 = tset10 + PreheatSlope; |
pwheels | 0:1f9875adab5d | 159 | tset = tset10/10; |
pwheels | 0:1f9875adab5d | 160 | if (tset > DryingTemp) { |
pwheels | 0:1f9875adab5d | 161 | tset10 = DryingTemp * 10; |
pwheels | 0:1f9875adab5d | 162 | status = WAIT_DRYING; |
pwheels | 0:1f9875adab5d | 163 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 164 | } |
pwheels | 0:1f9875adab5d | 165 | break; |
pwheels | 0:1f9875adab5d | 166 | case WAIT_DRYING: |
pwheels | 0:1f9875adab5d | 167 | if ((t + Hysteresis) > DryingTemp) { |
pwheels | 0:1f9875adab5d | 168 | remaining_time = DryingTime; |
pwheels | 0:1f9875adab5d | 169 | status = DRYING; |
pwheels | 0:1f9875adab5d | 170 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 171 | } |
pwheels | 0:1f9875adab5d | 172 | break; |
pwheels | 0:1f9875adab5d | 173 | case DRYING: |
pwheels | 0:1f9875adab5d | 174 | if (remaining_time == 0) { |
pwheels | 0:1f9875adab5d | 175 | remaining_time = (10 * (ReflowTemp - DryingTemp))/HeatingSlope; |
pwheels | 0:1f9875adab5d | 176 | status = HEAT; |
pwheels | 0:1f9875adab5d | 177 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 178 | } |
pwheels | 0:1f9875adab5d | 179 | break; |
pwheels | 0:1f9875adab5d | 180 | case HEAT: |
pwheels | 0:1f9875adab5d | 181 | tset10 = tset10 + HeatingSlope; |
pwheels | 0:1f9875adab5d | 182 | tset = tset10/10; |
pwheels | 0:1f9875adab5d | 183 | if (tset > ReflowTemp) { |
pwheels | 0:1f9875adab5d | 184 | tset10 = 10 * ReflowTemp; |
pwheels | 0:1f9875adab5d | 185 | status = WAIT_REFLOW; |
pwheels | 0:1f9875adab5d | 186 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 187 | } |
pwheels | 0:1f9875adab5d | 188 | break; |
pwheels | 0:1f9875adab5d | 189 | case WAIT_REFLOW: |
pwheels | 0:1f9875adab5d | 190 | if ((t + Hysteresis) > ReflowTemp) { |
pwheels | 0:1f9875adab5d | 191 | remaining_time = ReflowTime; |
pwheels | 0:1f9875adab5d | 192 | status = REFLOW; |
pwheels | 0:1f9875adab5d | 193 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 194 | } |
pwheels | 0:1f9875adab5d | 195 | break; |
pwheels | 0:1f9875adab5d | 196 | |
pwheels | 0:1f9875adab5d | 197 | case REFLOW: |
pwheels | 0:1f9875adab5d | 198 | if (remaining_time == 0) { |
pwheels | 0:1f9875adab5d | 199 | remaining_time = (10 * (ReflowTemp - tini))/CoolingSlope; |
pwheels | 0:1f9875adab5d | 200 | status = COOLING; |
pwheels | 0:1f9875adab5d | 201 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 202 | } |
pwheels | 0:1f9875adab5d | 203 | break; |
pwheels | 0:1f9875adab5d | 204 | case COOLING: |
pwheels | 0:1f9875adab5d | 205 | tset10 = tset10 - CoolingSlope; |
pwheels | 0:1f9875adab5d | 206 | tset = tset10/10; |
pwheels | 0:1f9875adab5d | 207 | if (tset < tini) { |
pwheels | 0:1f9875adab5d | 208 | tset10 = 10 * tini; |
pwheels | 0:1f9875adab5d | 209 | status = 0; |
pwheels | 0:1f9875adab5d | 210 | dispcycle = 1; |
pwheels | 0:1f9875adab5d | 211 | } |
pwheels | 0:1f9875adab5d | 212 | break; |
pwheels | 0:1f9875adab5d | 213 | default: |
pwheels | 0:1f9875adab5d | 214 | status = 0; |
pwheels | 0:1f9875adab5d | 215 | break; |
pwheels | 0:1f9875adab5d | 216 | } |
pwheels | 0:1f9875adab5d | 217 | } |
pwheels | 0:1f9875adab5d | 218 | |
pwheels | 0:1f9875adab5d | 219 | // Read current temperature from thermo couple |
pwheels | 0:1f9875adab5d | 220 | // return temperature in ahigh (degrees) and alow (tens of a degree) |
pwheels | 0:1f9875adab5d | 221 | void readthermo(void) { |
pwheels | 0:1f9875adab5d | 222 | |
pwheels | 0:1f9875adab5d | 223 | if (max1.ready()==1){ |
pwheels | 0:1f9875adab5d | 224 | //Get the reading (average value may be needed 100 ?) |
pwheels | 0:1f9875adab5d | 225 | atemp = max1.read_temp(); |
pwheels | 0:1f9875adab5d | 226 | |
pwheels | 0:1f9875adab5d | 227 | if (atemp > 2000){ |
pwheels | 0:1f9875adab5d | 228 | if(atemp == 2001){ |
pwheels | 0:1f9875adab5d | 229 | printf("No TC"); |
pwheels | 0:1f9875adab5d | 230 | }else if(atemp == 2002){ |
pwheels | 0:1f9875adab5d | 231 | printf("Short to Ground"); |
pwheels | 0:1f9875adab5d | 232 | }else if(atemp == 2004){ |
pwheels | 0:1f9875adab5d | 233 | printf("Short to VCC"); |
pwheels | 0:1f9875adab5d | 234 | } |
pwheels | 0:1f9875adab5d | 235 | }else{ |
pwheels | 0:1f9875adab5d | 236 | ahigh = (int) atemp; |
pwheels | 0:1f9875adab5d | 237 | alow = (int) ((atemp - ahigh) * 100); |
pwheels | 0:1f9875adab5d | 238 | } |
pwheels | 0:1f9875adab5d | 239 | } |
pwheels | 0:1f9875adab5d | 240 | } |
pwheels | 0:1f9875adab5d | 241 | |
pwheels | 0:1f9875adab5d | 242 | void RunMode() { |
pwheels | 0:1f9875adab5d | 243 | // initialise run mode |
pwheels | 0:1f9875adab5d | 244 | status = 1; |
pwheels | 0:1f9875adab5d | 245 | dispcycle = 0; |
pwheels | 0:1f9875adab5d | 246 | t = 0; |
pwheels | 0:1f9875adab5d | 247 | readthermo(); |
pwheels | 0:1f9875adab5d | 248 | |
pwheels | 0:1f9875adab5d | 249 | t = ahigh; |
pwheels | 0:1f9875adab5d | 250 | tini = t; |
pwheels | 0:1f9875adab5d | 251 | tset10 = 10*t; |
pwheels | 0:1f9875adab5d | 252 | remaining_time = (10*(DryingTemp - t))/PreheatSlope; |
pwheels | 0:1f9875adab5d | 253 | heater = 0; |
pwheels | 0:1f9875adab5d | 254 | |
pwheels | 0:1f9875adab5d | 255 | // wait for run button released |
pwheels | 0:1f9875adab5d | 256 | while (Btn_0.read() == 0); |
pwheels | 0:1f9875adab5d | 257 | |
pwheels | 0:1f9875adab5d | 258 | wait_ms(10); |
pwheels | 0:1f9875adab5d | 259 | |
pwheels | 0:1f9875adab5d | 260 | char tmp[32] = {0}; |
pwheels | 0:1f9875adab5d | 261 | do { |
pwheels | 0:1f9875adab5d | 262 | |
pwheels | 0:1f9875adab5d | 263 | tprec = t; |
pwheels | 0:1f9875adab5d | 264 | |
pwheels | 0:1f9875adab5d | 265 | // read new temperature |
pwheels | 0:1f9875adab5d | 266 | readthermo(); |
pwheels | 0:1f9875adab5d | 267 | t = ahigh; |
pwheels | 0:1f9875adab5d | 268 | |
pwheels | 0:1f9875adab5d | 269 | // estimate future temperature using kd |
pwheels | 0:1f9875adab5d | 270 | testim = ((10*t) + (t-tprec) * Kd)/10; |
pwheels | 0:1f9875adab5d | 271 | |
pwheels | 0:1f9875adab5d | 272 | tset = tset10/10; |
pwheels | 0:1f9875adab5d | 273 | |
pwheels | 0:1f9875adab5d | 274 | _WriteLCD(ClrDisplay); |
pwheels | 0:1f9875adab5d | 275 | sprintf(tmp, "Temp: %3d C ", ahigh); |
pwheels | 0:1f9875adab5d | 276 | _WriteLCD(WriteString, tmp, 0); |
pwheels | 0:1f9875adab5d | 277 | |
pwheels | 0:1f9875adab5d | 278 | _WriteLCD(SetCursor, 0x0c); |
pwheels | 0:1f9875adab5d | 279 | |
pwheels | 0:1f9875adab5d | 280 | if (dispcycle == 1) { |
pwheels | 0:1f9875adab5d | 281 | sprintf(tmp, "%d/7",status); |
pwheels | 0:1f9875adab5d | 282 | _WriteLCD(WriteString, tmp, 0); |
pwheels | 0:1f9875adab5d | 283 | } else { |
pwheels | 0:1f9875adab5d | 284 | sprintf(tmp, lcd_status[status-1]); |
pwheels | 0:1f9875adab5d | 285 | _WriteLCD(WriteString, tmp, 0); |
pwheels | 0:1f9875adab5d | 286 | } |
pwheels | 0:1f9875adab5d | 287 | _WriteLCD(SetCursor, 0x14); |
pwheels | 0:1f9875adab5d | 288 | sprintf(tmp, "Tset: %3d C ", tset); |
pwheels | 0:1f9875adab5d | 289 | _WriteLCD(WriteString, tmp, 0); |
pwheels | 0:1f9875adab5d | 290 | _WriteLCD(SetCursor, 0x20); |
pwheels | 0:1f9875adab5d | 291 | sprintf(tmp, "Sec: %3d ", remaining_time); |
pwheels | 0:1f9875adab5d | 292 | _WriteLCD(WriteString, tmp, 0); |
pwheels | 0:1f9875adab5d | 293 | |
pwheels | 0:1f9875adab5d | 294 | |
pwheels | 0:1f9875adab5d | 295 | // decrement time (in seconds, due to the 1 second pause) |
pwheels | 0:1f9875adab5d | 296 | if (remaining_time != 0) remaining_time--; |
pwheels | 0:1f9875adab5d | 297 | |
pwheels | 0:1f9875adab5d | 298 | // check if abort requested |
pwheels | 0:1f9875adab5d | 299 | if (Btn_0.read() == 0) { |
pwheels | 0:1f9875adab5d | 300 | |
pwheels | 0:1f9875adab5d | 301 | status = 0; |
pwheels | 0:1f9875adab5d | 302 | heater_off(); |
pwheels | 0:1f9875adab5d | 303 | |
pwheels | 0:1f9875adab5d | 304 | // wait for run button released |
pwheels | 0:1f9875adab5d | 305 | while (Btn_0.read() == 0); |
pwheels | 0:1f9875adab5d | 306 | wait_ms(10); |
pwheels | 0:1f9875adab5d | 307 | } |
pwheels | 0:1f9875adab5d | 308 | |
pwheels | 0:1f9875adab5d | 309 | UpdateStateMachine(); |
pwheels | 0:1f9875adab5d | 310 | |
pwheels | 0:1f9875adab5d | 311 | tset = tset10/10; |
pwheels | 0:1f9875adab5d | 312 | |
pwheels | 0:1f9875adab5d | 313 | // control heater |
pwheels | 0:1f9875adab5d | 314 | if (heater == 0) { |
pwheels | 0:1f9875adab5d | 315 | if (testim < (tset - Hysteresis)) heater = 1; |
pwheels | 0:1f9875adab5d | 316 | } |
pwheels | 0:1f9875adab5d | 317 | |
pwheels | 0:1f9875adab5d | 318 | if (heater == 1) { |
pwheels | 0:1f9875adab5d | 319 | if (testim > (tset + Hysteresis)) heater = 0; |
pwheels | 0:1f9875adab5d | 320 | } |
pwheels | 0:1f9875adab5d | 321 | |
pwheels | 0:1f9875adab5d | 322 | if (heater == 0) |
pwheels | 0:1f9875adab5d | 323 | heater_off(); |
pwheels | 0:1f9875adab5d | 324 | else |
pwheels | 0:1f9875adab5d | 325 | heater_on(); |
pwheels | 0:1f9875adab5d | 326 | |
pwheels | 0:1f9875adab5d | 327 | // send current values to uart |
pwheels | 0:1f9875adab5d | 328 | pc.printf("S %d,%d,%d,%d\n", tset, t, status, heater); |
pwheels | 0:1f9875adab5d | 329 | |
pwheels | 0:1f9875adab5d | 330 | // wait for 1 second |
pwheels | 0:1f9875adab5d | 331 | wait(1); |
pwheels | 0:1f9875adab5d | 332 | |
pwheels | 0:1f9875adab5d | 333 | // next dispcycle |
pwheels | 0:1f9875adab5d | 334 | dispcycle = 1 - dispcycle; |
pwheels | 0:1f9875adab5d | 335 | } while (status != 0); |
pwheels | 0:1f9875adab5d | 336 | } |
pwheels | 0:1f9875adab5d | 337 | |
pwheels | 0:1f9875adab5d | 338 | void ConfigurationMode(void) { |
pwheels | 0:1f9875adab5d | 339 | int i; |
pwheels | 0:1f9875adab5d | 340 | |
pwheels | 0:1f9875adab5d | 341 | for (i = 1; i <= 9; i++) { |
pwheels | 0:1f9875adab5d | 342 | _WriteLCD(ClrDisplay); |
pwheels | 0:1f9875adab5d | 343 | _WriteLCD(SetCursor, 0x00); |
pwheels | 0:1f9875adab5d | 344 | |
pwheels | 0:1f9875adab5d | 345 | switch (i) { |
pwheels | 0:1f9875adab5d | 346 | case 1: |
pwheels | 0:1f9875adab5d | 347 | _WriteLCD(WriteString, "DrySlope", 0); |
pwheels | 0:1f9875adab5d | 348 | editnum(&PreheatSlope,1,255); |
pwheels | 0:1f9875adab5d | 349 | break; |
pwheels | 0:1f9875adab5d | 350 | case 2: |
pwheels | 0:1f9875adab5d | 351 | _WriteLCD(WriteString, "DryTemp ", 0); |
pwheels | 0:1f9875adab5d | 352 | editnum(&DryingTemp,40,150); |
pwheels | 0:1f9875adab5d | 353 | break; |
pwheels | 0:1f9875adab5d | 354 | case 3: |
pwheels | 0:1f9875adab5d | 355 | _WriteLCD(WriteString, "Hysteres", 0); |
pwheels | 0:1f9875adab5d | 356 | editnum(&Hysteresis,1,40); |
pwheels | 0:1f9875adab5d | 357 | break; |
pwheels | 0:1f9875adab5d | 358 | case 4: |
pwheels | 0:1f9875adab5d | 359 | _WriteLCD(WriteString, "DryTime ", 0); |
pwheels | 0:1f9875adab5d | 360 | editnum(&DryingTime,1,255); |
pwheels | 0:1f9875adab5d | 361 | break; |
pwheels | 0:1f9875adab5d | 362 | case 5: |
pwheels | 0:1f9875adab5d | 363 | _WriteLCD(WriteString, "HeatSlpe", 0); |
pwheels | 0:1f9875adab5d | 364 | editnum(&HeatingSlope,1,255); |
pwheels | 0:1f9875adab5d | 365 | break; |
pwheels | 0:1f9875adab5d | 366 | case 6: |
pwheels | 0:1f9875adab5d | 367 | _WriteLCD(WriteString, "FlowTemp", 0); |
pwheels | 0:1f9875adab5d | 368 | editnum(&ReflowTemp,120,255); |
pwheels | 0:1f9875adab5d | 369 | break; |
pwheels | 0:1f9875adab5d | 370 | case 7: |
pwheels | 0:1f9875adab5d | 371 | _WriteLCD(WriteString, "Flowtime", 0); |
pwheels | 0:1f9875adab5d | 372 | editnum(&ReflowTime,1,255); |
pwheels | 0:1f9875adab5d | 373 | break; |
pwheels | 0:1f9875adab5d | 374 | case 8: |
pwheels | 0:1f9875adab5d | 375 | _WriteLCD(WriteString, "CoolSlpe", 0); |
pwheels | 0:1f9875adab5d | 376 | editnum(&CoolingSlope,1,255); |
pwheels | 0:1f9875adab5d | 377 | break; |
pwheels | 0:1f9875adab5d | 378 | case 9: |
pwheels | 0:1f9875adab5d | 379 | _WriteLCD(WriteString, "Kd ", 0); |
pwheels | 0:1f9875adab5d | 380 | editnum(&Kd,0,200); |
pwheels | 0:1f9875adab5d | 381 | break; |
pwheels | 0:1f9875adab5d | 382 | } |
pwheels | 0:1f9875adab5d | 383 | } |
pwheels | 0:1f9875adab5d | 384 | } |
pwheels | 0:1f9875adab5d | 385 | |
pwheels | 0:1f9875adab5d | 386 | //======================================================================= |
pwheels | 0:1f9875adab5d | 387 | // Main program |
pwheels | 0:1f9875adab5d | 388 | //======================================================================= |
pwheels | 0:1f9875adab5d | 389 | |
pwheels | 0:1f9875adab5d | 390 | int main(void) { |
pwheels | 0:1f9875adab5d | 391 | // Initialisations |
pwheels | 0:1f9875adab5d | 392 | |
pwheels | 0:1f9875adab5d | 393 | pc.baud(9600); |
pwheels | 0:1f9875adab5d | 394 | pc.printf("\r\nReflow Oven Controller for mbed v1.0\r\n"); |
pwheels | 0:1f9875adab5d | 395 | |
pwheels | 0:1f9875adab5d | 396 | // define some user characters for LCD display |
pwheels | 0:1f9875adab5d | 397 | char MySymbol[2][9]= {{0x01,0x04,0x0e,0x1f,0x04,0x04,0x04,0x00,0x00}, |
pwheels | 0:1f9875adab5d | 398 | {0x02,0x00,0x00,0x04,0x04,0x04,0x1f,0x0e,0x04}}; |
pwheels | 0:1f9875adab5d | 399 | // use the internal pull-ups |
pwheels | 0:1f9875adab5d | 400 | Btn_0.mode(PullUp); |
pwheels | 0:1f9875adab5d | 401 | Btn_1.mode(PullUp); |
pwheels | 0:1f9875adab5d | 402 | Btn_2.mode(PullUp); |
pwheels | 0:1f9875adab5d | 403 | |
pwheels | 0:1f9875adab5d | 404 | _InitLCD(); |
pwheels | 0:1f9875adab5d | 405 | _WriteLCD(LCDType,0x01); |
pwheels | 0:1f9875adab5d | 406 | _WriteLCD(WriteUserDefChar,MySymbol[0],9); |
pwheels | 0:1f9875adab5d | 407 | _WriteLCD(WriteUserDefChar,MySymbol[1],9); |
pwheels | 0:1f9875adab5d | 408 | |
pwheels | 0:1f9875adab5d | 409 | Init(); |
pwheels | 0:1f9875adab5d | 410 | |
pwheels | 0:1f9875adab5d | 411 | // Main loop |
pwheels | 0:1f9875adab5d | 412 | while (1) { |
pwheels | 0:1f9875adab5d | 413 | // heater off |
pwheels | 0:1f9875adab5d | 414 | heater_off(); |
pwheels | 0:1f9875adab5d | 415 | |
pwheels | 0:1f9875adab5d | 416 | // position cursor |
pwheels | 0:1f9875adab5d | 417 | _WriteLCD(SetCursor, 0x00); |
pwheels | 0:1f9875adab5d | 418 | |
pwheels | 0:1f9875adab5d | 419 | // read thermo couple |
pwheels | 0:1f9875adab5d | 420 | readthermo(); |
pwheels | 0:1f9875adab5d | 421 | char msg[32] = {0}; |
pwheels | 0:1f9875adab5d | 422 | sprintf(msg, "Temp: %3.2f C ", atemp); |
pwheels | 0:1f9875adab5d | 423 | |
pwheels | 0:1f9875adab5d | 424 | // Display current temperature |
pwheels | 0:1f9875adab5d | 425 | _WriteLCD(WriteString, msg, 0); |
pwheels | 0:1f9875adab5d | 426 | |
pwheels | 0:1f9875adab5d | 427 | // Display menu |
pwheels | 0:1f9875adab5d | 428 | _WriteLCD(SetCursor, 0x14); |
pwheels | 0:1f9875adab5d | 429 | _WriteLCD(WriteString, "[1:CONF] [0:RUN] ", 0); |
pwheels | 0:1f9875adab5d | 430 | |
pwheels | 0:1f9875adab5d | 431 | wait_ms(10); |
pwheels | 0:1f9875adab5d | 432 | |
pwheels | 0:1f9875adab5d | 433 | // Run button ? |
pwheels | 0:1f9875adab5d | 434 | if (Btn_0.read() == 0) |
pwheels | 0:1f9875adab5d | 435 | RunMode(); |
pwheels | 0:1f9875adab5d | 436 | else if (Btn_1.read() == 0) |
pwheels | 0:1f9875adab5d | 437 | ConfigurationMode(); |
pwheels | 0:1f9875adab5d | 438 | } |
pwheels | 0:1f9875adab5d | 439 | } |