based on existing code, added support for max31855 and i2c display

Dependencies:   MAX31855 mbed

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?

UserRevisionLine numberNew 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 }