Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Menu PID_v2 PinDetect QEI TextLCD Thermistor mbed
main.cpp@0:b6fd8ca8bfbf, 2015-09-30 (annotated)
- 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?
| User | Revision | Line number | New 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 |