First draft to the functional spec
Dependencies: mbed Grove_LCD_RGB_Backlight DebounceIn
main.cpp@4:d56051982cf5, 2019-10-09 (annotated)
- Committer:
- bmcclure
- Date:
- Wed Oct 09 17:47:50 2019 +0000
- Revision:
- 4:d56051982cf5
- Parent:
- 3:07d400d50a96
Fixed a simulation bug and a bug when buttons are pressed with the door open
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dattranvnfrr | 0:2f5d939d4a4a | 1 | #include "Grove_LCD_RGB_Backlight.h" |
dattranvnfrr | 0:2f5d939d4a4a | 2 | #include "mbed.h" |
dattranvnfrr | 0:2f5d939d4a4a | 3 | #include "DebounceIn.h" |
dattranvnfrr | 1:ca7bf48a2f71 | 4 | |
bmcclure | 2:829038a1352b | 5 | #define FOREVER (1) |
dattranvnfrr | 1:ca7bf48a2f71 | 6 | |
dattranvnfrr | 1:ca7bf48a2f71 | 7 | #define OUT_OFF (0) |
dattranvnfrr | 1:ca7bf48a2f71 | 8 | #define OUT_ON (1) |
dattranvnfrr | 1:ca7bf48a2f71 | 9 | |
dattranvnfrr | 1:ca7bf48a2f71 | 10 | #define IN_OFF (1) |
dattranvnfrr | 1:ca7bf48a2f71 | 11 | #define IN_ON (0) |
dattranvnfrr | 1:ca7bf48a2f71 | 12 | |
dattranvnfrr | 1:ca7bf48a2f71 | 13 | |
dattranvnfrr | 0:2f5d939d4a4a | 14 | //input |
dattranvnfrr | 1:ca7bf48a2f71 | 15 | DebounceIn doorClosed(p5); //Check door status |
dattranvnfrr | 0:2f5d939d4a4a | 16 | DebounceIn cycleStartBtt(p14); //cycle start button |
dattranvnfrr | 1:ca7bf48a2f71 | 17 | DebounceIn stopBtt(p15); //stop button |
dattranvnfrr | 1:ca7bf48a2f71 | 18 | //InterruptIn stopBtt(p15); //stop button |
dattranvnfrr | 0:2f5d939d4a4a | 19 | //DigitalIn pot(p20); |
dattranvnfrr | 1:ca7bf48a2f71 | 20 | |
dattranvnfrr | 0:2f5d939d4a4a | 21 | //output |
dattranvnfrr | 0:2f5d939d4a4a | 22 | DigitalOut doorInterlock(p6); //Door interlock |
dattranvnfrr | 0:2f5d939d4a4a | 23 | DigitalOut fanRelay(p7); //Fan control |
bmcclure | 2:829038a1352b | 24 | DigitalOut redRelay(p8); //Red light - DOOR OPENED |
bmcclure | 2:829038a1352b | 25 | DigitalOut yellowRelay(p11); //Yellow light - WASH IN PROGRESS |
bmcclure | 2:829038a1352b | 26 | DigitalOut greenRelay(p12); //Green light - DOOR UNLOCKED, TANK READY |
dattranvnfrr | 0:2f5d939d4a4a | 27 | DigitalOut damperRelay(p13); //Damper solenoid control |
dattranvnfrr | 0:2f5d939d4a4a | 28 | DigitalOut damperRelayAlt(p16); //Damper solenoid toggle control |
dattranvnfrr | 0:2f5d939d4a4a | 29 | DigitalOut vfd(p17); //VFD Start relay |
dattranvnfrr | 1:ca7bf48a2f71 | 30 | |
dattranvnfrr | 0:2f5d939d4a4a | 31 | Grove_LCD_RGB_Backlight rgbLCD(p9, p10); //Timer display |
dattranvnfrr | 1:ca7bf48a2f71 | 32 | |
dattranvnfrr | 1:ca7bf48a2f71 | 33 | bool cancelPending = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 34 | bool damperIsOpen; |
dattranvnfrr | 1:ca7bf48a2f71 | 35 | bool simulateMode = false; |
bmcclure | 2:829038a1352b | 36 | bool doorHasOpened = false; |
bmcclure | 2:829038a1352b | 37 | bool cycleHasStarted = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 38 | |
dattranvnfrr | 0:2f5d939d4a4a | 39 | I2C i2c(p9, p10); |
dattranvnfrr | 0:2f5d939d4a4a | 40 | //Serial pc(USBTX, USBRX); |
dattranvnfrr | 1:ca7bf48a2f71 | 41 | |
dattranvnfrr | 1:ca7bf48a2f71 | 42 | |
dattranvnfrr | 0:2f5d939d4a4a | 43 | //extern "C" void mbed_reset(); |
dattranvnfrr | 1:ca7bf48a2f71 | 44 | |
dattranvnfrr | 1:ca7bf48a2f71 | 45 | // Function declarations |
dattranvnfrr | 1:ca7bf48a2f71 | 46 | void damperRotate(int damper); |
dattranvnfrr | 1:ca7bf48a2f71 | 47 | void fullLineItoA(int m, char* str); |
dattranvnfrr | 1:ca7bf48a2f71 | 48 | void countDown(int s); //countdown in sec |
dattranvnfrr | 1:ca7bf48a2f71 | 49 | void fullStop(); |
dattranvnfrr | 1:ca7bf48a2f71 | 50 | void debugMode(); |
dattranvnfrr | 1:ca7bf48a2f71 | 51 | |
dattranvnfrr | 1:ca7bf48a2f71 | 52 | |
dattranvnfrr | 1:ca7bf48a2f71 | 53 | |
dattranvnfrr | 1:ca7bf48a2f71 | 54 | int main() |
dattranvnfrr | 1:ca7bf48a2f71 | 55 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 56 | //on power up status |
dattranvnfrr | 1:ca7bf48a2f71 | 57 | cycleStartBtt.mode(PullUp); |
dattranvnfrr | 1:ca7bf48a2f71 | 58 | cycleStartBtt.set_debounce_us(1000); |
dattranvnfrr | 1:ca7bf48a2f71 | 59 | cycleStartBtt.set_samples(100); |
dattranvnfrr | 1:ca7bf48a2f71 | 60 | wait(.1); |
dattranvnfrr | 1:ca7bf48a2f71 | 61 | |
dattranvnfrr | 1:ca7bf48a2f71 | 62 | doorClosed.mode(PullUp); |
dattranvnfrr | 1:ca7bf48a2f71 | 63 | doorClosed.set_debounce_us(1000); |
dattranvnfrr | 1:ca7bf48a2f71 | 64 | doorClosed.set_samples(100); |
dattranvnfrr | 1:ca7bf48a2f71 | 65 | wait(.1); |
dattranvnfrr | 1:ca7bf48a2f71 | 66 | |
dattranvnfrr | 1:ca7bf48a2f71 | 67 | stopBtt.mode(PullUp); |
dattranvnfrr | 1:ca7bf48a2f71 | 68 | stopBtt.set_debounce_us(1000); |
dattranvnfrr | 1:ca7bf48a2f71 | 69 | stopBtt.set_samples(100); |
dattranvnfrr | 1:ca7bf48a2f71 | 70 | wait(.5); |
dattranvnfrr | 1:ca7bf48a2f71 | 71 | |
dattranvnfrr | 1:ca7bf48a2f71 | 72 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 73 | rgbLCD.setRGB(0x00, 0x66, 0xaa); //set the color |
dattranvnfrr | 1:ca7bf48a2f71 | 74 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 75 | |
dattranvnfrr | 1:ca7bf48a2f71 | 76 | if(cycleStartBtt == IN_ON && stopBtt == IN_ON) |
dattranvnfrr | 0:2f5d939d4a4a | 77 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 78 | simulateMode = true; |
dattranvnfrr | 1:ca7bf48a2f71 | 79 | rgbLCD.print("Simulating.... "); |
dattranvnfrr | 0:2f5d939d4a4a | 80 | wait(5); |
dattranvnfrr | 0:2f5d939d4a4a | 81 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 82 | if(stopBtt == IN_ON) |
dattranvnfrr | 0:2f5d939d4a4a | 83 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 84 | debugMode(); |
dattranvnfrr | 1:ca7bf48a2f71 | 85 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 86 | |
dattranvnfrr | 1:ca7bf48a2f71 | 87 | //Display startup countdown |
dattranvnfrr | 1:ca7bf48a2f71 | 88 | //Startin up and prep the tank |
dattranvnfrr | 0:2f5d939d4a4a | 89 | rgbLCD.clear(); |
dattranvnfrr | 0:2f5d939d4a4a | 90 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 91 | rgbLCD.print("Starting up... "); |
dattranvnfrr | 0:2f5d939d4a4a | 92 | |
bmcclure | 2:829038a1352b | 93 | // Setup outputs |
dattranvnfrr | 1:ca7bf48a2f71 | 94 | vfd = OUT_OFF; |
bmcclure | 2:829038a1352b | 95 | doorInterlock = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 96 | greenRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 97 | yellowRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 98 | redRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 99 | |
bmcclure | 2:829038a1352b | 100 | // Door locked, damper open and fan on - we're assuming it's been sitting for a while |
bmcclure | 2:829038a1352b | 101 | // and someone is about to open the door. Make them close the if open |
bmcclure | 2:829038a1352b | 102 | // so we can get venting. |
bmcclure | 2:829038a1352b | 103 | // Run the damper open twice to get to a known-good position of full-open |
bmcclure | 2:829038a1352b | 104 | damperIsOpen = false; //Assert and run the opener once |
bmcclure | 2:829038a1352b | 105 | damperRotate(1); //vent may be opened; |
bmcclure | 2:829038a1352b | 106 | damperIsOpen = false; //Assert and run the opener a second time |
bmcclure | 2:829038a1352b | 107 | damperRotate(1); //vent opened; |
dattranvnfrr | 1:ca7bf48a2f71 | 108 | |
bmcclure | 2:829038a1352b | 109 | // Start the fan whether or not the door is open |
bmcclure | 2:829038a1352b | 110 | if(!simulateMode) |
bmcclure | 2:829038a1352b | 111 | { |
bmcclure | 2:829038a1352b | 112 | fanRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 113 | } |
bmcclure | 2:829038a1352b | 114 | else |
dattranvnfrr | 1:ca7bf48a2f71 | 115 | { |
bmcclure | 2:829038a1352b | 116 | fanRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 117 | } |
bmcclure | 2:829038a1352b | 118 | |
bmcclure | 2:829038a1352b | 119 | // Wait for the door to close |
bmcclure | 2:829038a1352b | 120 | if(doorClosed == IN_OFF) |
bmcclure | 2:829038a1352b | 121 | { |
bmcclure | 2:829038a1352b | 122 | redRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 123 | rgbLCD.locate(0,0); |
bmcclure | 2:829038a1352b | 124 | rgbLCD.print("Close the door "); |
bmcclure | 2:829038a1352b | 125 | |
bmcclure | 2:829038a1352b | 126 | while(doorClosed == IN_OFF) |
bmcclure | 2:829038a1352b | 127 | { |
bmcclure | 2:829038a1352b | 128 | wait(1); |
bmcclure | 2:829038a1352b | 129 | } |
bmcclure | 2:829038a1352b | 130 | } |
bmcclure | 2:829038a1352b | 131 | rgbLCD.locate(0,0); |
bmcclure | 2:829038a1352b | 132 | rgbLCD.print("Venting "); |
bmcclure | 2:829038a1352b | 133 | doorInterlock = OUT_ON; |
bmcclure | 2:829038a1352b | 134 | redRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 135 | yellowRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 136 | |
bmcclure | 2:829038a1352b | 137 | //wait 90sec |
bmcclure | 2:829038a1352b | 138 | countDown(90); |
bmcclure | 2:829038a1352b | 139 | |
bmcclure | 2:829038a1352b | 140 | // We turn off the fan because we don't know how long until someone is ready to open the door |
dattranvnfrr | 1:ca7bf48a2f71 | 141 | //Tank is ready |
dattranvnfrr | 1:ca7bf48a2f71 | 142 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 143 | rgbLCD.print("Tank is ready! "); |
bmcclure | 2:829038a1352b | 144 | yellowRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 145 | greenRelay = OUT_ON; //green light on |
dattranvnfrr | 1:ca7bf48a2f71 | 146 | doorInterlock = OUT_OFF; //interlock unlatched, ready to load material into the tank |
bmcclure | 2:829038a1352b | 147 | fanRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 148 | damperRotate(0); // damper is closed |
dattranvnfrr | 0:2f5d939d4a4a | 149 | |
dattranvnfrr | 1:ca7bf48a2f71 | 150 | cancelPending = false; |
dattranvnfrr | 0:2f5d939d4a4a | 151 | |
bmcclure | 2:829038a1352b | 152 | while(FOREVER) |
dattranvnfrr | 1:ca7bf48a2f71 | 153 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 154 | if(cancelPending) |
dattranvnfrr | 0:2f5d939d4a4a | 155 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 156 | cancelPending = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 157 | |
dattranvnfrr | 1:ca7bf48a2f71 | 158 | //Display status |
bmcclure | 2:829038a1352b | 159 | vfd = OUT_OFF; //pump off |
dattranvnfrr | 1:ca7bf48a2f71 | 160 | greenRelay = OUT_OFF; //green light OFF |
dattranvnfrr | 1:ca7bf48a2f71 | 161 | yellowRelay = OUT_OFF; //yellow light OFF |
dattranvnfrr | 1:ca7bf48a2f71 | 162 | redRelay = OUT_ON; //turn red light ON |
dattranvnfrr | 1:ca7bf48a2f71 | 163 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 164 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 165 | rgbLCD.print("CYCLE STOPPED. "); |
bmcclure | 2:829038a1352b | 166 | |
bmcclure | 2:829038a1352b | 167 | if(doorClosed == IN_ON && !simulateMode) |
dattranvnfrr | 1:ca7bf48a2f71 | 168 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 169 | doorInterlock = OUT_ON; //door latched |
bmcclure | 2:829038a1352b | 170 | fanRelay = OUT_ON; //fan on |
dattranvnfrr | 1:ca7bf48a2f71 | 171 | damperRotate(1); //damper opened |
bmcclure | 2:829038a1352b | 172 | //wait 60s, including the 30s damper rotation |
bmcclure | 2:829038a1352b | 173 | countDown(30); |
bmcclure | 2:829038a1352b | 174 | fanRelay = OUT_OFF; //fan stops |
bmcclure | 2:829038a1352b | 175 | damperRotate(0); //damper closed |
bmcclure | 2:829038a1352b | 176 | } |
bmcclure | 2:829038a1352b | 177 | else if(doorClosed == IN_OFF) |
bmcclure | 2:829038a1352b | 178 | { |
bmcclure | 2:829038a1352b | 179 | for(int i=0; i<3; i++) |
bmcclure | 2:829038a1352b | 180 | { |
bmcclure | 2:829038a1352b | 181 | wait(.5); |
bmcclure | 2:829038a1352b | 182 | redRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 183 | wait(.5); |
bmcclure | 2:829038a1352b | 184 | redRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 185 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 186 | } |
dattranvnfrr | 0:2f5d939d4a4a | 187 | |
bmcclure | 2:829038a1352b | 188 | wait(0.5); |
bmcclure | 2:829038a1352b | 189 | redRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 190 | greenRelay = OUT_ON; |
dattranvnfrr | 1:ca7bf48a2f71 | 191 | doorInterlock=OUT_OFF; //door unlatched |
dattranvnfrr | 1:ca7bf48a2f71 | 192 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 193 | rgbLCD.print("Tank is ready! "); |
bmcclure | 2:829038a1352b | 194 | doorHasOpened = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 195 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 196 | |
dattranvnfrr | 1:ca7bf48a2f71 | 197 | if(doorClosed==IN_ON) //door closed |
dattranvnfrr | 1:ca7bf48a2f71 | 198 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 199 | /* |
dattranvnfrr | 1:ca7bf48a2f71 | 200 | * Get set up for the wash, and wait for the start button |
dattranvnfrr | 1:ca7bf48a2f71 | 201 | */ |
dattranvnfrr | 1:ca7bf48a2f71 | 202 | greenRelay = OUT_ON; //green light stays on |
dattranvnfrr | 1:ca7bf48a2f71 | 203 | yellowRelay = OUT_OFF; //yellow light off |
dattranvnfrr | 1:ca7bf48a2f71 | 204 | redRelay = OUT_OFF; //red light off |
dattranvnfrr | 1:ca7bf48a2f71 | 205 | doorInterlock = OUT_OFF; //door unlocked |
bmcclure | 2:829038a1352b | 206 | fanRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 207 | damperRotate(0); //damper closed |
bmcclure | 2:829038a1352b | 208 | rgbLCD.locate(0,1); |
bmcclure | 2:829038a1352b | 209 | rgbLCD.print("Door closed "); |
bmcclure | 2:829038a1352b | 210 | |
dattranvnfrr | 1:ca7bf48a2f71 | 211 | while(cycleStartBtt != IN_ON && !(doorClosed == IN_OFF || cancelPending)) |
dattranvnfrr | 1:ca7bf48a2f71 | 212 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 213 | if(stopBtt == IN_ON) |
dattranvnfrr | 1:ca7bf48a2f71 | 214 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 215 | cancelPending = true; |
bmcclure | 2:829038a1352b | 216 | break; |
dattranvnfrr | 1:ca7bf48a2f71 | 217 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 218 | wait(.25); |
dattranvnfrr | 1:ca7bf48a2f71 | 219 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 220 | if(doorClosed == IN_OFF || cancelPending) |
dattranvnfrr | 0:2f5d939d4a4a | 221 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 222 | continue; |
dattranvnfrr | 1:ca7bf48a2f71 | 223 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 224 | |
dattranvnfrr | 1:ca7bf48a2f71 | 225 | |
dattranvnfrr | 1:ca7bf48a2f71 | 226 | /* |
dattranvnfrr | 1:ca7bf48a2f71 | 227 | * Cycle start button pressed - wash for 2 minutes |
dattranvnfrr | 1:ca7bf48a2f71 | 228 | */ |
bmcclure | 2:829038a1352b | 229 | cycleHasStarted = true; |
dattranvnfrr | 1:ca7bf48a2f71 | 230 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 231 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 232 | rgbLCD.print("CYCLE STARTED! "); |
dattranvnfrr | 1:ca7bf48a2f71 | 233 | greenRelay = OUT_OFF; //green light off |
bmcclure | 2:829038a1352b | 234 | yellowRelay = OUT_ON; //yellow light on |
dattranvnfrr | 1:ca7bf48a2f71 | 235 | if(!simulateMode) |
dattranvnfrr | 1:ca7bf48a2f71 | 236 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 237 | doorInterlock = OUT_ON; //door locked |
dattranvnfrr | 1:ca7bf48a2f71 | 238 | vfd = OUT_ON; //vfd for pump up to speed |
dattranvnfrr | 1:ca7bf48a2f71 | 239 | } |
bmcclure | 2:829038a1352b | 240 | doorHasOpened = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 241 | countDown(120); //start timer for 2min |
dattranvnfrr | 1:ca7bf48a2f71 | 242 | if(doorClosed == IN_OFF || cancelPending) |
dattranvnfrr | 1:ca7bf48a2f71 | 243 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 244 | continue; |
dattranvnfrr | 1:ca7bf48a2f71 | 245 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 246 | |
dattranvnfrr | 1:ca7bf48a2f71 | 247 | |
dattranvnfrr | 1:ca7bf48a2f71 | 248 | /* |
dattranvnfrr | 1:ca7bf48a2f71 | 249 | * Finished washing - turn off the pump |
dattranvnfrr | 1:ca7bf48a2f71 | 250 | */ |
dattranvnfrr | 1:ca7bf48a2f71 | 251 | vfd = OUT_OFF; //pump off |
dattranvnfrr | 1:ca7bf48a2f71 | 252 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 253 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 254 | rgbLCD.print("CYCLE FINISHED! "); |
dattranvnfrr | 1:ca7bf48a2f71 | 255 | wait(1); |
dattranvnfrr | 1:ca7bf48a2f71 | 256 | if(doorClosed == IN_OFF || cancelPending) |
dattranvnfrr | 1:ca7bf48a2f71 | 257 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 258 | continue; |
dattranvnfrr | 0:2f5d939d4a4a | 259 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 260 | |
dattranvnfrr | 1:ca7bf48a2f71 | 261 | |
dattranvnfrr | 1:ca7bf48a2f71 | 262 | /* |
bmcclure | 2:829038a1352b | 263 | * Drip dry and vent after washing for 5 minutes |
dattranvnfrr | 1:ca7bf48a2f71 | 264 | */ |
dattranvnfrr | 1:ca7bf48a2f71 | 265 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 266 | rgbLCD.locate(0,0); |
bmcclure | 2:829038a1352b | 267 | rgbLCD.print("DRIP DRYING! "); |
bmcclure | 2:829038a1352b | 268 | if(!simulateMode) |
bmcclure | 2:829038a1352b | 269 | { |
bmcclure | 2:829038a1352b | 270 | fanRelay = OUT_ON; //fan on |
bmcclure | 2:829038a1352b | 271 | } |
bmcclure | 2:829038a1352b | 272 | damperRotate(1); //vent opened |
bmcclure | 2:829038a1352b | 273 | countDown(270); // 5 minutes, including the damper opening |
dattranvnfrr | 1:ca7bf48a2f71 | 274 | if(doorClosed == IN_OFF || cancelPending) |
dattranvnfrr | 0:2f5d939d4a4a | 275 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 276 | continue; |
bmcclure | 2:829038a1352b | 277 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 278 | |
dattranvnfrr | 1:ca7bf48a2f71 | 279 | |
dattranvnfrr | 1:ca7bf48a2f71 | 280 | /* |
dattranvnfrr | 1:ca7bf48a2f71 | 281 | * Entire cycle is done, close up and go back to waiting |
dattranvnfrr | 1:ca7bf48a2f71 | 282 | */ |
dattranvnfrr | 1:ca7bf48a2f71 | 283 | fanRelay = OUT_OFF; //fan off |
bmcclure | 2:829038a1352b | 284 | damperRotate(0); //vent closed |
dattranvnfrr | 1:ca7bf48a2f71 | 285 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 286 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 287 | rgbLCD.print("Tank is ready! "); |
bmcclure | 2:829038a1352b | 288 | doorInterlock = OUT_OFF; //door unlocked |
bmcclure | 2:829038a1352b | 289 | greenRelay = OUT_ON; //green light on |
bmcclure | 2:829038a1352b | 290 | yellowRelay = OUT_OFF; //yellow light off |
dattranvnfrr | 0:2f5d939d4a4a | 291 | } |
dattranvnfrr | 0:2f5d939d4a4a | 292 | else //door open |
dattranvnfrr | 0:2f5d939d4a4a | 293 | { |
bmcclure | 2:829038a1352b | 294 | greenRelay = OUT_OFF; //green light OFF |
bmcclure | 2:829038a1352b | 295 | yellowRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 296 | redRelay = OUT_ON; //turn red light ON |
bmcclure | 4:d56051982cf5 | 297 | if(!simulateMode) |
bmcclure | 4:d56051982cf5 | 298 | { |
bmcclure | 4:d56051982cf5 | 299 | fanRelay = OUT_ON; //fan on |
bmcclure | 4:d56051982cf5 | 300 | } |
bmcclure | 2:829038a1352b | 301 | damperRotate(1); //damper opened |
dattranvnfrr | 0:2f5d939d4a4a | 302 | rgbLCD.locate(0,1); |
dattranvnfrr | 1:ca7bf48a2f71 | 303 | rgbLCD.print("Door open "); |
bmcclure | 2:829038a1352b | 304 | doorHasOpened = true; |
bmcclure | 4:d56051982cf5 | 305 | |
bmcclure | 4:d56051982cf5 | 306 | if(cycleStartBtt == IN_ON || stopBtt == IN_ON) |
bmcclure | 4:d56051982cf5 | 307 | { |
bmcclure | 4:d56051982cf5 | 308 | cancelPending = true; |
bmcclure | 4:d56051982cf5 | 309 | } |
dattranvnfrr | 0:2f5d939d4a4a | 310 | } |
dattranvnfrr | 0:2f5d939d4a4a | 311 | |
dattranvnfrr | 1:ca7bf48a2f71 | 312 | wait(1); |
dattranvnfrr | 1:ca7bf48a2f71 | 313 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 314 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 315 | |
dattranvnfrr | 1:ca7bf48a2f71 | 316 | |
dattranvnfrr | 1:ca7bf48a2f71 | 317 | |
dattranvnfrr | 1:ca7bf48a2f71 | 318 | |
dattranvnfrr | 1:ca7bf48a2f71 | 319 | void damperRotate(int damper) //damper condition |
dattranvnfrr | 1:ca7bf48a2f71 | 320 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 321 | if(damper==0 && damperIsOpen == true && !simulateMode) |
dattranvnfrr | 1:ca7bf48a2f71 | 322 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 323 | damperRelayAlt=OUT_ON; //toggle damper relay |
dattranvnfrr | 1:ca7bf48a2f71 | 324 | rgbLCD.locate(0,1); |
dattranvnfrr | 1:ca7bf48a2f71 | 325 | rgbLCD.print("Closing damper "); |
dattranvnfrr | 1:ca7bf48a2f71 | 326 | wait(30); |
dattranvnfrr | 1:ca7bf48a2f71 | 327 | damperRelayAlt=OUT_OFF; //time out to reduce wear |
dattranvnfrr | 1:ca7bf48a2f71 | 328 | damperIsOpen = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 329 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 330 | else if(damper == 1 && damperIsOpen == false && !simulateMode) |
dattranvnfrr | 1:ca7bf48a2f71 | 331 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 332 | damperRelay=OUT_ON; //toggle damper relay |
dattranvnfrr | 1:ca7bf48a2f71 | 333 | rgbLCD.locate(0,1); |
dattranvnfrr | 1:ca7bf48a2f71 | 334 | rgbLCD.print("Opening damper "); |
dattranvnfrr | 1:ca7bf48a2f71 | 335 | wait(30); |
dattranvnfrr | 1:ca7bf48a2f71 | 336 | damperRelay=OUT_OFF; //time out to reduce wear |
dattranvnfrr | 1:ca7bf48a2f71 | 337 | damperIsOpen = true; |
dattranvnfrr | 1:ca7bf48a2f71 | 338 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 339 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 340 | |
dattranvnfrr | 1:ca7bf48a2f71 | 341 | void fullLineItoA(int m, char* str) |
dattranvnfrr | 1:ca7bf48a2f71 | 342 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 343 | if(str == NULL) |
dattranvnfrr | 1:ca7bf48a2f71 | 344 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 345 | return; |
dattranvnfrr | 1:ca7bf48a2f71 | 346 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 347 | |
dattranvnfrr | 1:ca7bf48a2f71 | 348 | // Empty the array to 16 white spaces |
dattranvnfrr | 1:ca7bf48a2f71 | 349 | for(int j=0; j < 16; j++) |
dattranvnfrr | 1:ca7bf48a2f71 | 350 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 351 | str[j] = ' '; |
dattranvnfrr | 1:ca7bf48a2f71 | 352 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 353 | str[16] = 0; |
dattranvnfrr | 1:ca7bf48a2f71 | 354 | |
dattranvnfrr | 1:ca7bf48a2f71 | 355 | // Put our counter in it, with the least-significant digit in col 4. |
dattranvnfrr | 1:ca7bf48a2f71 | 356 | int i = 3; |
dattranvnfrr | 1:ca7bf48a2f71 | 357 | do |
dattranvnfrr | 1:ca7bf48a2f71 | 358 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 359 | str[i] = m%10 + '0'; |
dattranvnfrr | 1:ca7bf48a2f71 | 360 | m /= 10; |
dattranvnfrr | 1:ca7bf48a2f71 | 361 | i--; |
dattranvnfrr | 1:ca7bf48a2f71 | 362 | }while(m > 0 && i >= 0); |
dattranvnfrr | 1:ca7bf48a2f71 | 363 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 364 | |
dattranvnfrr | 1:ca7bf48a2f71 | 365 | void countDown(int s) //countdown in sec |
dattranvnfrr | 1:ca7bf48a2f71 | 366 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 367 | int m=0; |
dattranvnfrr | 1:ca7bf48a2f71 | 368 | char count[12]; // make a 'count' string |
dattranvnfrr | 1:ca7bf48a2f71 | 369 | |
dattranvnfrr | 1:ca7bf48a2f71 | 370 | for(m=s; m>0; m--) |
dattranvnfrr | 1:ca7bf48a2f71 | 371 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 372 | if(stopBtt == IN_ON) |
dattranvnfrr | 1:ca7bf48a2f71 | 373 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 374 | cancelPending = true; |
dattranvnfrr | 1:ca7bf48a2f71 | 375 | break; |
dattranvnfrr | 1:ca7bf48a2f71 | 376 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 377 | |
dattranvnfrr | 1:ca7bf48a2f71 | 378 | fullLineItoA(m, count); |
dattranvnfrr | 1:ca7bf48a2f71 | 379 | |
dattranvnfrr | 1:ca7bf48a2f71 | 380 | rgbLCD.locate(0,1); |
dattranvnfrr | 1:ca7bf48a2f71 | 381 | rgbLCD.print(count); |
dattranvnfrr | 1:ca7bf48a2f71 | 382 | |
dattranvnfrr | 1:ca7bf48a2f71 | 383 | wait(1); |
dattranvnfrr | 1:ca7bf48a2f71 | 384 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 385 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 386 | |
dattranvnfrr | 1:ca7bf48a2f71 | 387 | |
dattranvnfrr | 1:ca7bf48a2f71 | 388 | void debugMode() |
dattranvnfrr | 1:ca7bf48a2f71 | 389 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 390 | char displayLine1[17]; |
dattranvnfrr | 1:ca7bf48a2f71 | 391 | char displayLine2[17]; |
dattranvnfrr | 1:ca7bf48a2f71 | 392 | unsigned int count = 0; |
bmcclure | 2:829038a1352b | 393 | bool stopReleased = false; |
dattranvnfrr | 1:ca7bf48a2f71 | 394 | |
bmcclure | 2:829038a1352b | 395 | damperRelay = OUT_OFF; //Damper solenoid control |
bmcclure | 2:829038a1352b | 396 | damperRelayAlt = OUT_OFF; //Damper solenoid toggle control |
bmcclure | 2:829038a1352b | 397 | vfd = OUT_OFF; //VFD Start relay |
dattranvnfrr | 1:ca7bf48a2f71 | 398 | rgbLCD.clear(); |
dattranvnfrr | 1:ca7bf48a2f71 | 399 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 400 | |
dattranvnfrr | 1:ca7bf48a2f71 | 401 | do |
dattranvnfrr | 1:ca7bf48a2f71 | 402 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 403 | strcpy(displayLine1, "Door= "); |
dattranvnfrr | 1:ca7bf48a2f71 | 404 | if(doorClosed == 1) |
dattranvnfrr | 1:ca7bf48a2f71 | 405 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 406 | strcat(displayLine1, "1"); |
dattranvnfrr | 1:ca7bf48a2f71 | 407 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 408 | else |
dattranvnfrr | 1:ca7bf48a2f71 | 409 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 410 | strcat(displayLine1, "0"); |
dattranvnfrr | 1:ca7bf48a2f71 | 411 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 412 | |
dattranvnfrr | 1:ca7bf48a2f71 | 413 | strcat(displayLine1, ",Start="); |
dattranvnfrr | 1:ca7bf48a2f71 | 414 | if(cycleStartBtt == 1) |
dattranvnfrr | 1:ca7bf48a2f71 | 415 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 416 | strcat(displayLine1, "1 "); |
dattranvnfrr | 1:ca7bf48a2f71 | 417 | } |
bmcclure | 2:829038a1352b | 418 | else // start pressed |
dattranvnfrr | 1:ca7bf48a2f71 | 419 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 420 | strcat(displayLine1, "0 "); |
bmcclure | 4:d56051982cf5 | 421 | if(stopBtt == IN_OFF && doorClosed == IN_OFF && !simulateMode) |
bmcclure | 2:829038a1352b | 422 | { |
bmcclure | 2:829038a1352b | 423 | fanRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 424 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 425 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 426 | |
dattranvnfrr | 1:ca7bf48a2f71 | 427 | |
dattranvnfrr | 1:ca7bf48a2f71 | 428 | strcpy(displayLine2, "Stop= "); |
dattranvnfrr | 1:ca7bf48a2f71 | 429 | if(stopBtt == 1) |
dattranvnfrr | 1:ca7bf48a2f71 | 430 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 431 | strcat(displayLine2, "1 "); |
bmcclure | 3:07d400d50a96 | 432 | stopReleased = true; |
dattranvnfrr | 1:ca7bf48a2f71 | 433 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 434 | else |
dattranvnfrr | 1:ca7bf48a2f71 | 435 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 436 | strcat(displayLine2, "0 "); |
bmcclure | 3:07d400d50a96 | 437 | fanRelay = OUT_OFF; |
dattranvnfrr | 1:ca7bf48a2f71 | 438 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 439 | |
dattranvnfrr | 1:ca7bf48a2f71 | 440 | // Every 2s, change the outputs |
bmcclure | 2:829038a1352b | 441 | if((count&7) == 0) // only do it 1 time out of 8 |
dattranvnfrr | 1:ca7bf48a2f71 | 442 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 443 | doorInterlock = OUT_OFF; //Door interlock |
dattranvnfrr | 1:ca7bf48a2f71 | 444 | redRelay = OUT_OFF; //Red light |
dattranvnfrr | 1:ca7bf48a2f71 | 445 | yellowRelay = OUT_OFF; //Yellow light |
dattranvnfrr | 1:ca7bf48a2f71 | 446 | greenRelay = OUT_OFF; //Green light |
dattranvnfrr | 1:ca7bf48a2f71 | 447 | |
bmcclure | 2:829038a1352b | 448 | switch((count>>3)%4) // ignore the bottom 3 bits, and then roll over when you've counted to 4 |
dattranvnfrr | 1:ca7bf48a2f71 | 449 | { |
dattranvnfrr | 1:ca7bf48a2f71 | 450 | case 0: |
dattranvnfrr | 1:ca7bf48a2f71 | 451 | doorInterlock = OUT_ON; //Door interlock |
dattranvnfrr | 1:ca7bf48a2f71 | 452 | strcat(displayLine2, " Lock "); |
dattranvnfrr | 1:ca7bf48a2f71 | 453 | break; |
dattranvnfrr | 1:ca7bf48a2f71 | 454 | case 1: |
dattranvnfrr | 1:ca7bf48a2f71 | 455 | redRelay = OUT_ON; //Red light |
dattranvnfrr | 1:ca7bf48a2f71 | 456 | strcat(displayLine2, " Red "); |
dattranvnfrr | 1:ca7bf48a2f71 | 457 | break; |
bmcclure | 2:829038a1352b | 458 | case 2: |
dattranvnfrr | 1:ca7bf48a2f71 | 459 | yellowRelay = OUT_ON; //Yellow light |
dattranvnfrr | 1:ca7bf48a2f71 | 460 | strcat(displayLine2, " Yellow "); |
dattranvnfrr | 1:ca7bf48a2f71 | 461 | break; |
bmcclure | 2:829038a1352b | 462 | case 3: |
dattranvnfrr | 1:ca7bf48a2f71 | 463 | greenRelay = OUT_ON; //Green light |
dattranvnfrr | 1:ca7bf48a2f71 | 464 | strcat(displayLine2, " Green "); |
dattranvnfrr | 1:ca7bf48a2f71 | 465 | break; |
dattranvnfrr | 1:ca7bf48a2f71 | 466 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 467 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 468 | |
bmcclure | 2:829038a1352b | 469 | // Adjust the damper with start/stop if the door is closed |
bmcclure | 2:829038a1352b | 470 | if(cycleStartBtt == IN_ON && stopBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON) |
bmcclure | 2:829038a1352b | 471 | { |
bmcclure | 2:829038a1352b | 472 | damperRelay = OUT_ON; |
bmcclure | 2:829038a1352b | 473 | } |
bmcclure | 2:829038a1352b | 474 | else if(stopBtt == IN_ON && cycleStartBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON) |
bmcclure | 2:829038a1352b | 475 | { |
bmcclure | 2:829038a1352b | 476 | damperRelayAlt = OUT_ON; |
bmcclure | 2:829038a1352b | 477 | } |
bmcclure | 2:829038a1352b | 478 | else |
bmcclure | 2:829038a1352b | 479 | { |
bmcclure | 2:829038a1352b | 480 | damperRelay = OUT_OFF; |
bmcclure | 2:829038a1352b | 481 | damperRelayAlt = OUT_OFF; |
bmcclure | 2:829038a1352b | 482 | } |
bmcclure | 2:829038a1352b | 483 | |
dattranvnfrr | 1:ca7bf48a2f71 | 484 | rgbLCD.locate(0,0); |
dattranvnfrr | 1:ca7bf48a2f71 | 485 | rgbLCD.print(displayLine1); |
dattranvnfrr | 1:ca7bf48a2f71 | 486 | rgbLCD.locate(0,1); |
dattranvnfrr | 1:ca7bf48a2f71 | 487 | rgbLCD.print(displayLine2); |
dattranvnfrr | 1:ca7bf48a2f71 | 488 | |
dattranvnfrr | 1:ca7bf48a2f71 | 489 | wait(0.25); |
dattranvnfrr | 1:ca7bf48a2f71 | 490 | count++; |
dattranvnfrr | 1:ca7bf48a2f71 | 491 | } |
dattranvnfrr | 1:ca7bf48a2f71 | 492 | while(cycleStartBtt == IN_OFF || stopBtt == IN_OFF || doorClosed == IN_OFF); |
dattranvnfrr | 0:2f5d939d4a4a | 493 | } |