First draft to the functional spec
Dependencies: mbed Grove_LCD_RGB_Backlight DebounceIn
Diff: main.cpp
- Revision:
- 2:829038a1352b
- Parent:
- 1:ca7bf48a2f71
- Child:
- 3:07d400d50a96
--- a/main.cpp Tue Oct 08 16:24:32 2019 +0000 +++ b/main.cpp Tue Oct 08 21:15:26 2019 +0000 @@ -2,6 +2,7 @@ #include "mbed.h" #include "DebounceIn.h" +#define FOREVER (1) #define OUT_OFF (0) #define OUT_ON (1) @@ -20,9 +21,9 @@ //output DigitalOut doorInterlock(p6); //Door interlock DigitalOut fanRelay(p7); //Fan control -DigitalOut redRelay(p8); //Red light -DigitalOut yellowRelay(p11); //Yellow light -DigitalOut greenRelay(p12); //Green light +DigitalOut redRelay(p8); //Red light - DOOR OPENED +DigitalOut yellowRelay(p11); //Yellow light - WASH IN PROGRESS +DigitalOut greenRelay(p12); //Green light - DOOR UNLOCKED, TANK READY DigitalOut damperRelay(p13); //Damper solenoid control DigitalOut damperRelayAlt(p16); //Damper solenoid toggle control DigitalOut vfd(p17); //VFD Start relay @@ -32,6 +33,8 @@ bool cancelPending = false; bool damperIsOpen; bool simulateMode = false; +bool doorHasOpened = false; +bool cycleHasStarted = false; I2C i2c(p9, p10); //Serial pc(USBTX, USBRX); @@ -87,69 +90,108 @@ rgbLCD.locate(0,0); rgbLCD.print("Starting up... "); + // Setup outputs vfd = OUT_OFF; - damperIsOpen = false; // Assert and run the opener once - damperRotate(1); //vent opened; - if(!simulateMode) - { - //doorInterlock = OUT_ON; - fanRelay = OUT_ON; - } + doorInterlock = OUT_OFF; greenRelay = OUT_OFF; yellowRelay = OUT_OFF; redRelay = OUT_OFF; - //start timer for 90sec - countDown(90); + // Door locked, damper open and fan on - we're assuming it's been sitting for a while + // and someone is about to open the door. Make them close the if open + // so we can get venting. + // Run the damper open twice to get to a known-good position of full-open + damperIsOpen = false; //Assert and run the opener once + damperRotate(1); //vent may be opened; + damperIsOpen = false; //Assert and run the opener a second time + damperRotate(1); //vent opened; - /* - //check for closed door before running fan - while(doorClosed!=IN_ON) + // Start the fan whether or not the door is open + if(!simulateMode) + { + fanRelay = OUT_ON; + } + else { - rgbLCD.clear(); - rgbLCD.locate(0,0); - rgbLCD.print("Door is opened "); - wait(.25); + fanRelay = OUT_OFF; } - */ - + + // Wait for the door to close + if(doorClosed == IN_OFF) + { + redRelay = OUT_ON; + rgbLCD.locate(0,0); + rgbLCD.print("Close the door "); + + while(doorClosed == IN_OFF) + { + wait(1); + } + } + rgbLCD.locate(0,0); + rgbLCD.print("Venting "); + doorInterlock = OUT_ON; + redRelay = OUT_OFF; + yellowRelay = OUT_ON; + + //wait 90sec + countDown(90); + + // We turn off the fan because we don't know how long until someone is ready to open the door //Tank is ready rgbLCD.locate(0,0); rgbLCD.print("Tank is ready! "); + yellowRelay = OUT_OFF; greenRelay = OUT_ON; //green light on doorInterlock = OUT_OFF; //interlock unlatched, ready to load material into the tank - fanRelay = OUT_OFF; //fan off + fanRelay = OUT_OFF; + damperRotate(0); // damper is closed cancelPending = false; - while(1) + while(FOREVER) { if(cancelPending) { cancelPending = false; //Display status + vfd = OUT_OFF; //pump off greenRelay = OUT_OFF; //green light OFF yellowRelay = OUT_OFF; //yellow light OFF redRelay = OUT_ON; //turn red light ON rgbLCD.clear(); rgbLCD.locate(0,0); rgbLCD.print("CYCLE STOPPED. "); - vfd = OUT_OFF; //pump off - if(doorClosed == IN_ON && !simulateMode) + + if(doorClosed == IN_ON && !simulateMode) { doorInterlock = OUT_ON; //door latched + fanRelay = OUT_ON; //fan on damperRotate(1); //damper opened - fanRelay = OUT_ON; //fan on + //wait 60s, including the 30s damper rotation + countDown(30); + fanRelay = OUT_OFF; //fan stops + damperRotate(0); //damper closed + } + else if(doorClosed == IN_OFF) + { + for(int i=0; i<3; i++) + { + wait(.5); + redRelay = OUT_OFF; + wait(.5); + redRelay = OUT_ON; + } } - //wait 60sec - countDown(60); + wait(0.5); + redRelay = OUT_OFF; + greenRelay = OUT_ON; doorInterlock=OUT_OFF; //door unlatched - damperRotate(0); //damper closed - fanRelay = OUT_OFF; //fan stops rgbLCD.locate(0,0); rgbLCD.print("Tank is ready! "); + doorHasOpened = false; } if(doorClosed==IN_ON) //door closed @@ -157,19 +199,21 @@ /* * Get set up for the wash, and wait for the start button */ - rgbLCD.locate(0,1); - rgbLCD.print("Door closed "); greenRelay = OUT_ON; //green light stays on yellowRelay = OUT_OFF; //yellow light off redRelay = OUT_OFF; //red light off doorInterlock = OUT_OFF; //door unlocked - fanRelay = OUT_OFF; + fanRelay = OUT_OFF; + damperRotate(0); //damper closed + rgbLCD.locate(0,1); + rgbLCD.print("Door closed "); + while(cycleStartBtt != IN_ON && !(doorClosed == IN_OFF || cancelPending)) { if(stopBtt == IN_ON) { cancelPending = true; - continue; + break; } wait(.25); } @@ -182,19 +226,18 @@ /* * Cycle start button pressed - wash for 2 minutes */ + cycleHasStarted = true; rgbLCD.clear(); rgbLCD.locate(0,0); rgbLCD.print("CYCLE STARTED! "); greenRelay = OUT_OFF; //green light off - yellowRelay = OUT_ON; //yellow light on - fanRelay = OUT_OFF; //fan stop - //damperRotate(0); //vent already close - + yellowRelay = OUT_ON; //yellow light on if(!simulateMode) { doorInterlock = OUT_ON; //door locked vfd = OUT_ON; //vfd for pump up to speed } + doorHasOpened = false; countDown(120); //start timer for 2min if(doorClosed == IN_OFF || cancelPending) { @@ -217,57 +260,45 @@ /* - * Drip dry after washing for 5 minutes + * Drip dry and vent after washing for 5 minutes */ rgbLCD.clear(); rgbLCD.locate(0,0); - rgbLCD.print("DRIP DRYING! "); - countDown(300); + rgbLCD.print("DRIP DRYING! "); + if(!simulateMode) + { + fanRelay = OUT_ON; //fan on + } + damperRotate(1); //vent opened + countDown(270); // 5 minutes, including the damper opening if(doorClosed == IN_OFF || cancelPending) { continue; - } - - - /* - * Change the air out for 2 minutes - */ - rgbLCD.clear(); - rgbLCD.locate(0,0); - rgbLCD.print("AIR CYCLING! "); - damperRotate(1); //vent opened - if(!simulateMode) - { - fanRelay = OUT_ON; //fan on - } - countDown(120); - if(doorClosed == IN_OFF || cancelPending) - { - continue; - } + } /* * Entire cycle is done, close up and go back to waiting */ - greenRelay = OUT_ON; //green light on - yellowRelay = OUT_OFF; //yellow light off - doorInterlock = OUT_OFF; //door unlocked fanRelay = OUT_OFF; //fan off - damperRotate(0); //vent closed + damperRotate(0); //vent closed rgbLCD.clear(); rgbLCD.locate(0,0); rgbLCD.print("Tank is ready! "); + doorInterlock = OUT_OFF; //door unlocked + greenRelay = OUT_ON; //green light on + yellowRelay = OUT_OFF; //yellow light off } else //door open { + greenRelay = OUT_OFF; //green light OFF + yellowRelay = OUT_OFF; + redRelay = OUT_ON; //turn red light ON + fanRelay = OUT_ON; //fan on + damperRotate(1); //damper opened rgbLCD.locate(0,1); rgbLCD.print("Door open "); - greenRelay = OUT_OFF; //green light OFF - redRelay = OUT_ON; //turn red light ON - yellowRelay = OUT_OFF; - damperRotate(1); //damper opened - fanRelay = OUT_ON; //fan on + doorHasOpened = true; } wait(1); @@ -351,10 +382,13 @@ char displayLine1[17]; char displayLine2[17]; unsigned int count = 0; + bool stopReleased = false; + damperRelay = OUT_OFF; //Damper solenoid control + damperRelayAlt = OUT_OFF; //Damper solenoid toggle control + vfd = OUT_OFF; //VFD Start relay rgbLCD.clear(); rgbLCD.locate(0,0); - //damperRotate(1); do { @@ -372,15 +406,15 @@ if(cycleStartBtt == 1) { strcat(displayLine1, "1 "); - if(stopBtt == 0) - { - fanRelay = OUT_OFF; - } + fanRelay = OUT_OFF; } - else + else // start pressed { strcat(displayLine1, "0 "); - fanRelay = OUT_ON; + if(stopBtt == IN_OFF && doorClosed == IN_OFF) + { + fanRelay = OUT_ON; + } } @@ -392,60 +426,54 @@ else { strcat(displayLine2, "0 "); + stopReleased = true; } // Every 2s, change the outputs - if((count&7) == 0) + if((count&7) == 0) // only do it 1 time out of 8 { doorInterlock = OUT_OFF; //Door interlock - //fanRelay = OUT_ON; //Fan control redRelay = OUT_OFF; //Red light yellowRelay = OUT_OFF; //Yellow light greenRelay = OUT_OFF; //Green light - damperRelay = OUT_OFF; //Damper solenoid control - damperRelayAlt = OUT_OFF; //Damper solenoid toggle control - vfd = OUT_OFF; //VFD Start relay - switch((count>>3)%8) + switch((count>>3)%4) // ignore the bottom 3 bits, and then roll over when you've counted to 4 { case 0: doorInterlock = OUT_ON; //Door interlock strcat(displayLine2, " Lock "); break; case 1: - //fanRelay = OUT_ON; //Fan control - //strcat(displayLine2, " Fan "); - break; - case 2: redRelay = OUT_ON; //Red light strcat(displayLine2, " Red "); break; - case 3: + case 2: yellowRelay = OUT_ON; //Yellow light strcat(displayLine2, " Yellow "); break; - case 4: + case 3: greenRelay = OUT_ON; //Green light strcat(displayLine2, " Green "); break; - case 5: - //damperRelayAlt = OUT_ON; //Damper solenoid toggle control - closed - //strcat(displayLine2, " Damper1"); - //wait(30); - break; - case 6: - //damperRelay = OUT_ON; //Damper solenoid control - open - //strcat(displayLine2, " Damper2"); - //wait(30); - break; - case 7: - //vfd = OUT_ON; //VFD Start relay - //strcat(displayLine2, " VFD "); - break; } } + // Adjust the damper with start/stop if the door is closed + if(cycleStartBtt == IN_ON && stopBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON) + { + damperRelay = OUT_ON; + } + else if(stopBtt == IN_ON && cycleStartBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON) + { + damperRelayAlt = OUT_ON; + } + else + { + damperRelay = OUT_OFF; + damperRelayAlt = OUT_OFF; + } + rgbLCD.locate(0,0); rgbLCD.print(displayLine1); rgbLCD.locate(0,1);