UDS Team / Mbed 2 deprecated Nucleo_UDS_controller_Alberto_version

Dependencies:   Menu PID_v2 PinDetect QEI TextLCD Thermistor mbed

Committer:
walter76
Date:
Wed Sep 30 14:42:56 2015 +0000
Revision:
0:b6fd8ca8bfbf
Child:
1:219e882c32eb
Committed to improve UDS operation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walter76 0:b6fd8ca8bfbf 1 #include "mbed.h"
walter76 0:b6fd8ca8bfbf 2 #include "TextLCD.h"
walter76 0:b6fd8ca8bfbf 3 #include "PID.h"
walter76 0:b6fd8ca8bfbf 4 #include "QEI.h"
walter76 0:b6fd8ca8bfbf 5
walter76 0:b6fd8ca8bfbf 6 #define TPIT_MIN 70
walter76 0:b6fd8ca8bfbf 7 #define TPIT_MAX 250
walter76 0:b6fd8ca8bfbf 8 #define TMEAT_MIN 50
walter76 0:b6fd8ca8bfbf 9 #define TMEAT_MAX 120
walter76 0:b6fd8ca8bfbf 10 #define TPIT_FAIL 300
walter76 0:b6fd8ca8bfbf 11 #define TMEAT_FAIL 250
walter76 0:b6fd8ca8bfbf 12 #define MAX_HOURS 24
walter76 0:b6fd8ca8bfbf 13
walter76 0:b6fd8ca8bfbf 14 /*
walter76 0:b6fd8ca8bfbf 15
walter76 0:b6fd8ca8bfbf 16 This FW implements a PID temperature controller specifically designed for Ugly Drum Smokers (UDS)
walter76 0:b6fd8ca8bfbf 17 and uses a K-type termocouple as pit temperature sensors and a PWM-controlled fan to regulate the
walter76 0:b6fd8ca8bfbf 18 airflow at the intake.
walter76 0:b6fd8ca8bfbf 19 A second K-type termocouple is used to monitor the meat temperature, while a countdown timer takes care
walter76 0:b6fd8ca8bfbf 20 of the cooking time.
walter76 0:b6fd8ca8bfbf 21 The required HW consists of:
walter76 0:b6fd8ca8bfbf 22 - 1x STM32 F411RE Nucleo board
walter76 0:b6fd8ca8bfbf 23 - 1x 20x4 Text LCD
walter76 0:b6fd8ca8bfbf 24 - 1x Quadrature rotary encoder
walter76 0:b6fd8ca8bfbf 25 - 1x Pushbutton (if not embedded in the encoder)
walter76 0:b6fd8ca8bfbf 26 - 2x MAX6675 modules
walter76 0:b6fd8ca8bfbf 27 - 2x K-type termocouples (pit & meat)
walter76 0:b6fd8ca8bfbf 28 - 1x Buzzer
walter76 0:b6fd8ca8bfbf 29 - 1x 12V fan
walter76 0:b6fd8ca8bfbf 30 - 1x N-MOS capable of driving the fan
walter76 0:b6fd8ca8bfbf 31 - 1x fly-wheeling diode
walter76 0:b6fd8ca8bfbf 32
walter76 0:b6fd8ca8bfbf 33 */
walter76 0:b6fd8ca8bfbf 34
walter76 0:b6fd8ca8bfbf 35 uint8_t Hrs=0, Min=0, Sec=0, warning=0, set_mode=1, timeout=0;
walter76 0:b6fd8ca8bfbf 36 float FanSpeed, Tpit, Tmeat, Tset, Talm;
walter76 0:b6fd8ca8bfbf 37 float Vpot;
walter76 0:b6fd8ca8bfbf 38
walter76 0:b6fd8ca8bfbf 39 DigitalOut RLED (PC_5); // Pin 2 of CN10 (MORPHO connector, debug only)
walter76 0:b6fd8ca8bfbf 40 DigitalOut YLED (PC_6); // Pin 4 of CN10 (MORPHO connector, debug only)
walter76 0:b6fd8ca8bfbf 41 DigitalOut GLED (PC_8); // Pin 6 of CN10 (MORPHO connector, debug only)
walter76 0:b6fd8ca8bfbf 42
walter76 0:b6fd8ca8bfbf 43 PwmOut FAN (D3); // D3=PB3 --> PMW output (FAN control)
walter76 0:b6fd8ca8bfbf 44 AnalogIn POT1 (A0); // A0=PA0 <-- Pit setpoint potentiometer (debug only)
walter76 0:b6fd8ca8bfbf 45 AnalogIn POT2 (A1); // A1=PA1 <-- Meat alarm potentiometer (debug only)
walter76 0:b6fd8ca8bfbf 46
walter76 0:b6fd8ca8bfbf 47 DigitalOut TC_CLK (D8); // D4=PB5 --> MAX6675 CLK (to both chips)
walter76 0:b6fd8ca8bfbf 48 //DigitalOut TC_CS1 (D9); // D5=PB4 --> MAX6675 CS (chip 1)
walter76 0:b6fd8ca8bfbf 49 DigitalOut TC_CS1 (A5); // A0=PC0 --> MAX6675 CS (chip 1)
walter76 0:b6fd8ca8bfbf 50 DigitalOut TC_CS2 (D2); // D2=PA10 --> MAX6675 CS (chip 2)
walter76 0:b6fd8ca8bfbf 51 DigitalIn TC_SDO (D4); // D8=PA9 <-- MAX6675 SDO (from both chips)
walter76 0:b6fd8ca8bfbf 52
walter76 0:b6fd8ca8bfbf 53 DigitalOut BUZZER (A2); // A2=PA4 --> self-oscillating buzzer
walter76 0:b6fd8ca8bfbf 54 PwmOut ALM (D9);
walter76 0:b6fd8ca8bfbf 55 InterruptIn Button (D7); // D7=PA8 <-- Hold/Set pushbutton
walter76 0:b6fd8ca8bfbf 56
walter76 0:b6fd8ca8bfbf 57 PID myPID(0.003, 60.0, 0.0, 0.5); // Specify Kc, Ti, Td & refresh rate
walter76 0:b6fd8ca8bfbf 58 QEI Wheel(D5, D6, NC, 16); // quadrature encoder
walter76 0:b6fd8ca8bfbf 59 TextLCD MyLCD(D15, D14, D13, D12, D11, D10, TextLCD::LCD20x4); //20x4 LCD connection
walter76 0:b6fd8ca8bfbf 60
walter76 0:b6fd8ca8bfbf 61 Ticker Sec_Beat; // timer ticker
walter76 0:b6fd8ca8bfbf 62 Ticker LCD_Refresh; // LCD refresh ticker
walter76 0:b6fd8ca8bfbf 63
walter76 0:b6fd8ca8bfbf 64
walter76 0:b6fd8ca8bfbf 65 // ------------------- Prototypes -----------------------
walter76 0:b6fd8ca8bfbf 66
walter76 0:b6fd8ca8bfbf 67 void Button_Pressed(void);
walter76 0:b6fd8ca8bfbf 68 void Timer_tick(void);
walter76 0:b6fd8ca8bfbf 69 void Update_LCD(void);
walter76 0:b6fd8ca8bfbf 70 int MAX6675_GetTemp(int);
walter76 0:b6fd8ca8bfbf 71
walter76 0:b6fd8ca8bfbf 72
walter76 0:b6fd8ca8bfbf 73 // -------------------- Routines ------------------------
walter76 0:b6fd8ca8bfbf 74
walter76 0:b6fd8ca8bfbf 75 void Button_Pressed() {
walter76 0:b6fd8ca8bfbf 76
walter76 0:b6fd8ca8bfbf 77 set_mode++;
walter76 0:b6fd8ca8bfbf 78 if(set_mode>3) set_mode = 0;
walter76 0:b6fd8ca8bfbf 79 Button.fall(NULL);
walter76 0:b6fd8ca8bfbf 80 Wheel.reset();
walter76 0:b6fd8ca8bfbf 81 }
walter76 0:b6fd8ca8bfbf 82
walter76 0:b6fd8ca8bfbf 83
walter76 0:b6fd8ca8bfbf 84 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 85
walter76 0:b6fd8ca8bfbf 86 void Timer_tick()
walter76 0:b6fd8ca8bfbf 87 {
walter76 0:b6fd8ca8bfbf 88
walter76 0:b6fd8ca8bfbf 89 if((Hrs==0)&&(Min==0)&&(Sec==0))
walter76 0:b6fd8ca8bfbf 90 timeout = 1;
walter76 0:b6fd8ca8bfbf 91 else
walter76 0:b6fd8ca8bfbf 92 {
walter76 0:b6fd8ca8bfbf 93 timeout = 0;
walter76 0:b6fd8ca8bfbf 94 BUZZER = 0;
walter76 0:b6fd8ca8bfbf 95
walter76 0:b6fd8ca8bfbf 96 if ((!set_mode)&&(!timeout))
walter76 0:b6fd8ca8bfbf 97 {
walter76 0:b6fd8ca8bfbf 98 Sec--;
walter76 0:b6fd8ca8bfbf 99 if((Hrs==0)&&(Min==0)&&(Sec==0))
walter76 0:b6fd8ca8bfbf 100 timeout = 1;
walter76 0:b6fd8ca8bfbf 101 else if((Sec==0)||(Sec>60))
walter76 0:b6fd8ca8bfbf 102 {
walter76 0:b6fd8ca8bfbf 103 Sec=59;
walter76 0:b6fd8ca8bfbf 104 if(Min>0)
walter76 0:b6fd8ca8bfbf 105 Min--;
walter76 0:b6fd8ca8bfbf 106 else if (Hrs>0)
walter76 0:b6fd8ca8bfbf 107 {
walter76 0:b6fd8ca8bfbf 108 Min=59;
walter76 0:b6fd8ca8bfbf 109 Hrs--;
walter76 0:b6fd8ca8bfbf 110 }
walter76 0:b6fd8ca8bfbf 111 }
walter76 0:b6fd8ca8bfbf 112 }
walter76 0:b6fd8ca8bfbf 113 }
walter76 0:b6fd8ca8bfbf 114
walter76 0:b6fd8ca8bfbf 115 Tmeat = (float)(MAX6675_GetTemp(0)/4); // read meat & pit temperature
walter76 0:b6fd8ca8bfbf 116 Tpit = (float)(MAX6675_GetTemp(1)/4);
walter76 0:b6fd8ca8bfbf 117
walter76 0:b6fd8ca8bfbf 118 if(timeout||warning) // toggle the buzzer
walter76 0:b6fd8ca8bfbf 119 BUZZER=!BUZZER;
walter76 0:b6fd8ca8bfbf 120
walter76 0:b6fd8ca8bfbf 121 return;
walter76 0:b6fd8ca8bfbf 122 }
walter76 0:b6fd8ca8bfbf 123
walter76 0:b6fd8ca8bfbf 124 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 125
walter76 0:b6fd8ca8bfbf 126 void Update_LCD(void) {
walter76 0:b6fd8ca8bfbf 127
walter76 0:b6fd8ca8bfbf 128
walter76 0:b6fd8ca8bfbf 129 switch(set_mode)
walter76 0:b6fd8ca8bfbf 130 {
walter76 0:b6fd8ca8bfbf 131
walter76 0:b6fd8ca8bfbf 132 case 0:
walter76 0:b6fd8ca8bfbf 133
walter76 0:b6fd8ca8bfbf 134 MyLCD.locate(19,0);
walter76 0:b6fd8ca8bfbf 135 MyLCD.printf(" ");
walter76 0:b6fd8ca8bfbf 136 MyLCD.locate(19,1);
walter76 0:b6fd8ca8bfbf 137 MyLCD.printf(" ");
walter76 0:b6fd8ca8bfbf 138 MyLCD.locate(19,2);
walter76 0:b6fd8ca8bfbf 139 MyLCD.printf(" ");
walter76 0:b6fd8ca8bfbf 140
walter76 0:b6fd8ca8bfbf 141 break;
walter76 0:b6fd8ca8bfbf 142
walter76 0:b6fd8ca8bfbf 143 case 1: // set cooking time
walter76 0:b6fd8ca8bfbf 144
walter76 0:b6fd8ca8bfbf 145 MyLCD.locate(19,0);
walter76 0:b6fd8ca8bfbf 146 MyLCD.printf("*");
walter76 0:b6fd8ca8bfbf 147 Min = Sec = 0;
walter76 0:b6fd8ca8bfbf 148 Hrs = int(Wheel.getPulses());
walter76 0:b6fd8ca8bfbf 149 if((Hrs>MAX_HOURS))
walter76 0:b6fd8ca8bfbf 150 {
walter76 0:b6fd8ca8bfbf 151 Wheel.reset();
walter76 0:b6fd8ca8bfbf 152 Hrs = MAX_HOURS;
walter76 0:b6fd8ca8bfbf 153 }
walter76 0:b6fd8ca8bfbf 154
walter76 0:b6fd8ca8bfbf 155 break;
walter76 0:b6fd8ca8bfbf 156
walter76 0:b6fd8ca8bfbf 157 case 2: // set meat temperature alarm
walter76 0:b6fd8ca8bfbf 158
walter76 0:b6fd8ca8bfbf 159 MyLCD.locate(19,1);
walter76 0:b6fd8ca8bfbf 160 MyLCD.printf("*");
walter76 0:b6fd8ca8bfbf 161 Talm = TMEAT_MIN + int(Wheel.getPulses());
walter76 0:b6fd8ca8bfbf 162 if((Talm<TMEAT_MIN)||(Talm>TMEAT_MAX))
walter76 0:b6fd8ca8bfbf 163 {
walter76 0:b6fd8ca8bfbf 164 Wheel.reset();
walter76 0:b6fd8ca8bfbf 165 Talm=TMEAT_MIN;
walter76 0:b6fd8ca8bfbf 166 }
walter76 0:b6fd8ca8bfbf 167
walter76 0:b6fd8ca8bfbf 168 break;
walter76 0:b6fd8ca8bfbf 169
walter76 0:b6fd8ca8bfbf 170 case 3: // set pit target temperature
walter76 0:b6fd8ca8bfbf 171
walter76 0:b6fd8ca8bfbf 172 MyLCD.locate(19,2);
walter76 0:b6fd8ca8bfbf 173 MyLCD.printf("*");
walter76 0:b6fd8ca8bfbf 174 Tset = TPIT_MIN + int(Wheel.getPulses());
walter76 0:b6fd8ca8bfbf 175 if((Tset<TPIT_MIN)||(Tset>TPIT_MAX))
walter76 0:b6fd8ca8bfbf 176 {
walter76 0:b6fd8ca8bfbf 177 Wheel.reset();
walter76 0:b6fd8ca8bfbf 178 Tset=TPIT_MIN;
walter76 0:b6fd8ca8bfbf 179 }
walter76 0:b6fd8ca8bfbf 180
walter76 0:b6fd8ca8bfbf 181 break;
walter76 0:b6fd8ca8bfbf 182
walter76 0:b6fd8ca8bfbf 183 default:
walter76 0:b6fd8ca8bfbf 184 set_mode = 0;
walter76 0:b6fd8ca8bfbf 185
walter76 0:b6fd8ca8bfbf 186 };
walter76 0:b6fd8ca8bfbf 187
walter76 0:b6fd8ca8bfbf 188 //Tmeat = (float)(MAX6675_GetTemp(0)/4);
walter76 0:b6fd8ca8bfbf 189 //Tpit = (float)(MAX6675_GetTemp(1)/4);
walter76 0:b6fd8ca8bfbf 190 //Tmeat = TMEAT_MIN + POT1*(TMEAT_MAX-TMEAT_MIN)-5; // debug only
walter76 0:b6fd8ca8bfbf 191 //Tpit = 2+TPIT_MIN + POT2*(TPIT_MAX-TPIT_MIN); // debug only
walter76 0:b6fd8ca8bfbf 192
walter76 0:b6fd8ca8bfbf 193 //-------------------------------------------------
walter76 0:b6fd8ca8bfbf 194
walter76 0:b6fd8ca8bfbf 195 if(Tmeat>Talm) // Meat is ready!
walter76 0:b6fd8ca8bfbf 196 warning = 1;
walter76 0:b6fd8ca8bfbf 197 else
walter76 0:b6fd8ca8bfbf 198 warning = 0;
walter76 0:b6fd8ca8bfbf 199
walter76 0:b6fd8ca8bfbf 200 //-------------------------------------------------
walter76 0:b6fd8ca8bfbf 201
walter76 0:b6fd8ca8bfbf 202 if(warning||timeout) // in case of a warning or timeout
walter76 0:b6fd8ca8bfbf 203 {
walter76 0:b6fd8ca8bfbf 204 MyLCD.locate(0,3);
walter76 0:b6fd8ca8bfbf 205 MyLCD.printf(" ---- WARNING! ---- ");
walter76 0:b6fd8ca8bfbf 206
walter76 0:b6fd8ca8bfbf 207 //FAN.write(0); // stop the fan (optional)
walter76 0:b6fd8ca8bfbf 208 }
walter76 0:b6fd8ca8bfbf 209 else // otherwise
walter76 0:b6fd8ca8bfbf 210 {
walter76 0:b6fd8ca8bfbf 211 BUZZER = 0; // buzzer off
walter76 0:b6fd8ca8bfbf 212 FAN.write(FanSpeed); // update fan speed
walter76 0:b6fd8ca8bfbf 213 MyLCD.locate(0,3);
walter76 0:b6fd8ca8bfbf 214 MyLCD.printf(" FAN SPEED: ");
walter76 0:b6fd8ca8bfbf 215 MyLCD.locate(12,3);
walter76 0:b6fd8ca8bfbf 216 MyLCD.printf("%2.0f%% ", FanSpeed*100);
walter76 0:b6fd8ca8bfbf 217 }
walter76 0:b6fd8ca8bfbf 218
walter76 0:b6fd8ca8bfbf 219 //-------------------------------------------------
walter76 0:b6fd8ca8bfbf 220
walter76 0:b6fd8ca8bfbf 221 if(Tpit>300) // if Tpit is too high
walter76 0:b6fd8ca8bfbf 222 {
walter76 0:b6fd8ca8bfbf 223 MyLCD.locate(0,2);
walter76 0:b6fd8ca8bfbf 224 MyLCD.printf(" CHECK PIT PROBE! ");
walter76 0:b6fd8ca8bfbf 225 FAN.write(0); // stop the fan
walter76 0:b6fd8ca8bfbf 226 warning=1;
walter76 0:b6fd8ca8bfbf 227 }
walter76 0:b6fd8ca8bfbf 228 else // otherwise show pit temperature and setpoint
walter76 0:b6fd8ca8bfbf 229 {
walter76 0:b6fd8ca8bfbf 230 warning=0;
walter76 0:b6fd8ca8bfbf 231 MyLCD.locate(0,2);
walter76 0:b6fd8ca8bfbf 232 MyLCD.printf(" TPIT= ");
walter76 0:b6fd8ca8bfbf 233 MyLCD.locate(8,2);
walter76 0:b6fd8ca8bfbf 234 MyLCD.printf("%2.0f ", Tpit);
walter76 0:b6fd8ca8bfbf 235 MyLCD.locate(13,2);
walter76 0:b6fd8ca8bfbf 236 MyLCD.printf("(%2.0f) ", Tset);
walter76 0:b6fd8ca8bfbf 237 }
walter76 0:b6fd8ca8bfbf 238
walter76 0:b6fd8ca8bfbf 239
walter76 0:b6fd8ca8bfbf 240 //-------------------------------------------------
walter76 0:b6fd8ca8bfbf 241
walter76 0:b6fd8ca8bfbf 242 if(Tmeat>200) // if Tmeat is too high
walter76 0:b6fd8ca8bfbf 243 {
walter76 0:b6fd8ca8bfbf 244 MyLCD.locate(0,1);
walter76 0:b6fd8ca8bfbf 245 MyLCD.printf(" CHECK MEAT PROBE! ");
walter76 0:b6fd8ca8bfbf 246 FAN.write(0); // stop the fan
walter76 0:b6fd8ca8bfbf 247 warning=1;
walter76 0:b6fd8ca8bfbf 248 }
walter76 0:b6fd8ca8bfbf 249 else // otherwise show meat temperature and alarm threshold
walter76 0:b6fd8ca8bfbf 250 {
walter76 0:b6fd8ca8bfbf 251 warning=0;
walter76 0:b6fd8ca8bfbf 252 MyLCD.locate(0,1);
walter76 0:b6fd8ca8bfbf 253 MyLCD.printf(" TMEAT= ");
walter76 0:b6fd8ca8bfbf 254 MyLCD.locate(8,1);
walter76 0:b6fd8ca8bfbf 255 MyLCD.printf("%2.0f ", Tmeat);
walter76 0:b6fd8ca8bfbf 256 MyLCD.locate(13,1);
walter76 0:b6fd8ca8bfbf 257 MyLCD.printf("(%2.0f) ", Talm);
walter76 0:b6fd8ca8bfbf 258 }
walter76 0:b6fd8ca8bfbf 259
walter76 0:b6fd8ca8bfbf 260
walter76 0:b6fd8ca8bfbf 261 MyLCD.locate(0,0);
walter76 0:b6fd8ca8bfbf 262 MyLCD.printf(" TIMER: %2d:%2d:%2d ", Hrs, Min, Sec);
walter76 0:b6fd8ca8bfbf 263
walter76 0:b6fd8ca8bfbf 264 Button.fall(&Button_Pressed); // enable button interrupt
walter76 0:b6fd8ca8bfbf 265 }
walter76 0:b6fd8ca8bfbf 266
walter76 0:b6fd8ca8bfbf 267
walter76 0:b6fd8ca8bfbf 268 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 269
walter76 0:b6fd8ca8bfbf 270 int MAX6675_GetTemp(int chip)
walter76 0:b6fd8ca8bfbf 271 {
walter76 0:b6fd8ca8bfbf 272 int Temp=0, mask=32768;
walter76 0:b6fd8ca8bfbf 273 int i;
walter76 0:b6fd8ca8bfbf 274
walter76 0:b6fd8ca8bfbf 275 if(chip==0)
walter76 0:b6fd8ca8bfbf 276 TC_CS1 = 0; // select chip #1
walter76 0:b6fd8ca8bfbf 277 else
walter76 0:b6fd8ca8bfbf 278 TC_CS2 = 0; // select chip #2
walter76 0:b6fd8ca8bfbf 279 wait_ms(1);
walter76 0:b6fd8ca8bfbf 280 for(i=0; i<16; i++){
walter76 0:b6fd8ca8bfbf 281
walter76 0:b6fd8ca8bfbf 282 TC_CLK = 1; // CLK high
walter76 0:b6fd8ca8bfbf 283 if(TC_SDO == 1 ) Temp = Temp | mask;
walter76 0:b6fd8ca8bfbf 284 wait_ms(1);
walter76 0:b6fd8ca8bfbf 285 TC_CLK = 0; // CLK low
walter76 0:b6fd8ca8bfbf 286 wait_ms(1);
walter76 0:b6fd8ca8bfbf 287 mask = mask/2;
walter76 0:b6fd8ca8bfbf 288 }
walter76 0:b6fd8ca8bfbf 289 wait_ms(1);
walter76 0:b6fd8ca8bfbf 290 TC_CS1 = 1; // Both CS high
walter76 0:b6fd8ca8bfbf 291 TC_CS2 = 1;
walter76 0:b6fd8ca8bfbf 292
walter76 0:b6fd8ca8bfbf 293 Temp=((Temp>>3)&0x0FFF);
walter76 0:b6fd8ca8bfbf 294
walter76 0:b6fd8ca8bfbf 295 return(Temp);
walter76 0:b6fd8ca8bfbf 296
walter76 0:b6fd8ca8bfbf 297 }
walter76 0:b6fd8ca8bfbf 298
walter76 0:b6fd8ca8bfbf 299
walter76 0:b6fd8ca8bfbf 300 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 301 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 302 // -------------------------------------------------------------
walter76 0:b6fd8ca8bfbf 303
walter76 0:b6fd8ca8bfbf 304 int main() {
walter76 0:b6fd8ca8bfbf 305
walter76 0:b6fd8ca8bfbf 306 FAN.period_us(100); // set initial fan PWM period and duty-cycle
walter76 0:b6fd8ca8bfbf 307 FAN.write(0.1);
walter76 0:b6fd8ca8bfbf 308
walter76 0:b6fd8ca8bfbf 309 ALM.period_us(2000); // set initial ALM period and duty-cycle
walter76 0:b6fd8ca8bfbf 310 ALM.write(0.2);
walter76 0:b6fd8ca8bfbf 311
walter76 0:b6fd8ca8bfbf 312 TC_SDO.mode(PullDown); // enable pull-down on TC_SDO
walter76 0:b6fd8ca8bfbf 313 Button.mode(PullUp); // enable pushbutton pull-up
walter76 0:b6fd8ca8bfbf 314
walter76 0:b6fd8ca8bfbf 315 Wheel.reset(); // reset quadrature encoder
walter76 0:b6fd8ca8bfbf 316
walter76 0:b6fd8ca8bfbf 317 MyLCD.cls(); // clear LCD
walter76 0:b6fd8ca8bfbf 318
walter76 0:b6fd8ca8bfbf 319 Sec_Beat.attach(&Timer_tick, 1); // configure tickers
walter76 0:b6fd8ca8bfbf 320 LCD_Refresh.attach(&Update_LCD, 0.2);
walter76 0:b6fd8ca8bfbf 321
walter76 0:b6fd8ca8bfbf 322 myPID.setInputLimits(0, 300); // set PID in/out ranges
walter76 0:b6fd8ca8bfbf 323 myPID.setOutputLimits(0, 1);
walter76 0:b6fd8ca8bfbf 324
walter76 0:b6fd8ca8bfbf 325 Button.fall(&Button_Pressed); // enable button interrupt
walter76 0:b6fd8ca8bfbf 326
walter76 0:b6fd8ca8bfbf 327 while(1) {
walter76 0:b6fd8ca8bfbf 328
walter76 0:b6fd8ca8bfbf 329 myPID.setSetPoint(Tset); // update pit setpoint (PID reference)
walter76 0:b6fd8ca8bfbf 330 myPID.setProcessValue(Tpit); // update pit temperature (PID input)
walter76 0:b6fd8ca8bfbf 331 FanSpeed = float(myPID.compute()); // calculate fan speed (PID output)
walter76 0:b6fd8ca8bfbf 332
walter76 0:b6fd8ca8bfbf 333 } //while
walter76 0:b6fd8ca8bfbf 334
walter76 0:b6fd8ca8bfbf 335 } //main