First draft to the functional spec

Dependencies:   mbed Grove_LCD_RGB_Backlight DebounceIn

Revision:
1:ca7bf48a2f71
Parent:
0:2f5d939d4a4a
Child:
2:829038a1352b
--- a/main.cpp	Wed Sep 18 18:13:50 2019 +0000
+++ b/main.cpp	Tue Oct 08 16:24:32 2019 +0000
@@ -1,14 +1,22 @@
 #include "Grove_LCD_RGB_Backlight.h"
 #include "mbed.h"
 #include "DebounceIn.h"
-
+ 
+ 
+#define OUT_OFF    (0)
+#define OUT_ON     (1)
+ 
+#define IN_OFF     (1)
+#define IN_ON      (0)
+ 
+ 
 //input
-
-DebounceIn doorClosed(p5);             //Check door status
+DebounceIn doorClosed(p5);              //Check door status
 DebounceIn cycleStartBtt(p14);          //cycle start button 
-InterruptIn stopBtt(p15);                 //stop button
+DebounceIn stopBtt(p15);                //stop button
+//InterruptIn stopBtt(p15);             //stop button
 //DigitalIn pot(p20);
-
+ 
 //output
 DigitalOut doorInterlock(p6);           //Door interlock
 DigitalOut fanRelay(p7);                //Fan control
@@ -18,224 +26,433 @@
 DigitalOut damperRelay(p13);            //Damper solenoid control
 DigitalOut damperRelayAlt(p16);         //Damper solenoid toggle control                    
 DigitalOut vfd(p17);                    //VFD Start relay
-
+ 
 Grove_LCD_RGB_Backlight rgbLCD(p9, p10); //Timer display
-
-
+ 
+bool cancelPending = false;
+bool damperIsOpen;  
+bool simulateMode = false;
+ 
 I2C i2c(p9, p10);
 //Serial pc(USBTX, USBRX);
-
+ 
+ 
 //extern "C" void mbed_reset();
-
-void damperRotate(int damper)   //damper condition
-{
-    if(damper==0)
+ 
+// Function declarations
+void damperRotate(int damper);
+void fullLineItoA(int m, char* str);
+void countDown(int s);  //countdown in sec
+void fullStop();
+void debugMode();
+ 
+ 
+    
+int main()
+{ 
+    //on power up status
+    cycleStartBtt.mode(PullUp);
+    cycleStartBtt.set_debounce_us(1000);
+    cycleStartBtt.set_samples(100);
+    wait(.1);
+    
+    doorClosed.mode(PullUp);
+    doorClosed.set_debounce_us(1000);
+    doorClosed.set_samples(100);
+    wait(.1);
+    
+    stopBtt.mode(PullUp);
+    stopBtt.set_debounce_us(1000);
+    stopBtt.set_samples(100);
+    wait(.5);
+    
+    rgbLCD.clear();
+    rgbLCD.setRGB(0x00, 0x66, 0xaa);                 //set the color 
+    rgbLCD.locate(0,0);
+    
+    if(cycleStartBtt == IN_ON && stopBtt == IN_ON)
     {
-        damperRelayAlt=1;  //toggle damper relay
+        simulateMode = true; 
+        rgbLCD.print("Simulating....  ");     
         wait(5);
-        damperRelayAlt=0;   //time out to reduce wear   
-    }
-    else //damper==1
-    {
-        damperRelay=1;  //toggle damper relay
-        wait(5);
-        damperRelay=0;   //time out to reduce wear  
     }
-}
-
-void countDown(int s)  //countdown in sec
-{
-   int m=0;
-   char cnt[12];  // make a 'count' string
-   for(m=s; m>0; m--)
-   {
-       sprintf(cnt, "%i   ", m);
-       rgbLCD.locate(0,1);
-       rgbLCD.print(cnt);
-       wait(1); 
-    }
-}
-
-void fullStop()
-{
-    if(stopBtt==0)
+    if(stopBtt == IN_ON)
     {
-    //Display status
-    greenRelay=0;   //green light OFF
-    yellowRelay=0;   //yellow light OFF
-    redRelay=1;   //turn red light ON
+       debugMode();
+    }  
+    
+    //Display startup countdown
+    //Startin up and prep the tank
     rgbLCD.clear();
     rgbLCD.locate(0,0);
-    rgbLCD.print("CYCLE STOPPED.  "); 
-    vfd=0;             //pump off
-    doorInterlock=1;    //door latched
-    wait(2);
-    fanRelay=0;         //fan stops
-    damperRotate(0);    //damperRelay=0;      //damper closed
-
-    
-    //wait 60sec 
-    countDown(10);              
-    doorInterlock=0;    //door unlatched
-    
-    stopBtt.mode(PullUp);
-    wait(.1);
-    NVIC_SystemReset(); //reset system        
-    }
-}
+    rgbLCD.print("Starting up...  ");   
     
-int main()
-{
-   
-   //on power up status
-   cycleStartBtt.mode(PullUp);
-   wait(.1);
-   
-   doorClosed.mode(PullUp);
-   wait(.1);
-   
-   stopBtt.mode(PullUp);
-   wait(.1);
-   stopBtt.fall(&fullStop); // attach the address of the flip function to the rising edge
-   
-   
-   //check for closed door before running fan
-   while(doorClosed!=0)
-   {
+    vfd              = OUT_OFF;
+    damperIsOpen = false; // Assert and run the opener once
+    damperRotate(1); //vent opened;
+    if(!simulateMode)
+    {
+        //doorInterlock    = OUT_ON;
+        fanRelay         = OUT_ON;
+    }
+    greenRelay       = OUT_OFF;
+    yellowRelay      = OUT_OFF;
+    redRelay         = OUT_OFF;
+    
+    //start timer for 90sec
+    countDown(90);
+    
+    /*
+    //check for closed door before running fan
+    while(doorClosed!=IN_ON)
+    {
        rgbLCD.clear();
        rgbLCD.locate(0,0);
-       rgbLCD.print("Close the door   ");
-   }
+       rgbLCD.print("Door is opened  ");
+       wait(.25);
+    }
+    */
   
-   //Display startup countdown
-   //Startin up and prep the tank
-   rgbLCD.clear();
-   rgbLCD.setRGB(0x00, 0x66, 0xaa);                 //set the color 
-   rgbLCD.print("Starting up...  ");   
-    
-   vfd=0;
-   damperRotate(1); //vent opened;
-   doorInterlock=1;
-   fanRelay=1;
-   greenRelay=0;
-   yellowRelay=0;
-   redRelay=0;
-   
-   //start timer for 90sec
-   countDown(5);
+    //Tank is ready
+    rgbLCD.locate(0,0);
+    rgbLCD.print("Tank is ready!  ");
+    greenRelay       = OUT_ON;       //green light on
+    doorInterlock    = OUT_OFF;      //interlock unlatched, ready to load material into the tank
+    fanRelay         = OUT_OFF;      //fan off
     
-   //Tank is ready
-   rgbLCD.locate(0,0);
-   rgbLCD.print("Tank is ready!  ");
-   greenRelay=1;   //green light on
+    cancelPending = false;
    
-   //doorInterlock=0; //interlock unlatched, ready to load material into the tank
-   fanRelay=0;      //fan off
-   
-   while(1)
-   {
-                
-        if(doorClosed==0)    //door closed
+    while(1)
+    {    
+        if(cancelPending)
         {
-            rgbLCD.locate(0,1);
-            rgbLCD.print("Door closed      ");
-            greenRelay=1;   //green light stays on
-            yellowRelay=0;  //yellow light off
-            redRelay=0;     //red light off
+            cancelPending = false;
+            
+            //Display status
+            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)
+            {
+                doorInterlock = OUT_ON; //door latched
+                damperRotate(1);    //damper opened
+                fanRelay    = OUT_ON; //fan on
+            }
             
-            doorInterlock=0; //door unlocked
-            fanRelay=0;            
-                            
-            
-            //cycle start button pressed - wash cycle starts
-            if(cycleStartBtt==0)    
+            //wait 60sec 
+            countDown(60);              
+            doorInterlock=OUT_OFF;      //door unlatched
+            damperRotate(0);            //damper closed
+            fanRelay        = OUT_OFF;  //fan stops
+            rgbLCD.locate(0,0);
+            rgbLCD.print("Tank is ready!  ");
+        }
+    
+        if(doorClosed==IN_ON)    //door closed
+        {
+            /*
+             *  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;                            
+            while(cycleStartBtt != IN_ON && !(doorClosed == IN_OFF || cancelPending))
+            {
+                if(stopBtt == IN_ON)
+                {
+                    cancelPending = true;
+                    continue;    
+                }
+                wait(.25);
+            }
+            if(doorClosed == IN_OFF || cancelPending)
             {
-                
-                //Display status
-                rgbLCD.clear();
-                rgbLCD.locate(0,0);
-                rgbLCD.print("CYCLE STARTED!  ");     
-                greenRelay=0;       //green light off
-                yellowRelay=1;      //yellow light on                           
-                doorInterlock=1;    //door locked
-                fanRelay=0;         //fan stop
-                damperRotate(0);     //vent close
-                vfd=1;           //vfd for pump up to speed
-                
-                //Display wash cycle countdown
-                //start timer for 2min   
-                countDown(7);
-                
-                //finished washing
-                vfd=0;            //pump off
-                //Display status
-                rgbLCD.clear();
-                rgbLCD.locate(0,0);
-                rgbLCD.print("CYCLE FINISHED! ");           
-                countDown(5);
-                
-                //drip dry after washing
-                //Display status
-                rgbLCD.clear();
-                rgbLCD.locate(0,0);
-                rgbLCD.print("DRIP DRYING!    ");                
-                                
-                //start timer for 5min  
-                countDown(10);
-
-                //Display status
-                rgbLCD.clear();
-                rgbLCD.locate(0,0);
-                rgbLCD.print("AIR CYCLING!    ");                                 
-                damperRotate(1);    //vent opened
-                fanRelay=1;         //fan on
-                
-                //Display air cycling countdown
-                //start timer for 2min
-                countDown(10);  
-                
-                //finished cycling air             
-                greenRelay=1;       //green light on
-                yellowRelay=0;      //yellow light off
-                doorInterlock=0;    //door unlocked
-                fanRelay=0;         //fan off
-                damperRotate(0);    //damperRelay=0;      //vent closed
-                
-                //Tank is ready
-                rgbLCD.clear();
-                rgbLCD.locate(0,0);
-                rgbLCD.print("Tank is ready!  ");
+                continue;
+            }
+            
+                        
+            /*
+             * Cycle start button pressed - wash for 2 minutes
+             */
+            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
+            
+            if(!simulateMode)
+            {
+                doorInterlock   = OUT_ON;   //door locked
+                vfd             = OUT_ON;   //vfd for pump up to speed
+            }
+            countDown(120);             //start timer for 2min
+            if(doorClosed == IN_OFF || cancelPending)
+            {
+                continue;
+            }
+            
+            
+            /*
+             * Finished washing - turn off the pump
+             */
+            vfd = OUT_OFF;              //pump off
+            rgbLCD.clear();
+            rgbLCD.locate(0,0);
+            rgbLCD.print("CYCLE FINISHED! ");           
+            wait(1);
+            if(doorClosed == IN_OFF || cancelPending)
+            {
+                continue;
             }
- /*           
-            //Stop button is hit
-            if(stopBtt==1)
+            
+            
+            /*
+             * Drip dry after washing for 5 minutes
+             */
+            rgbLCD.clear();
+            rgbLCD.locate(0,0);
+            rgbLCD.print("DRIP DRYING!    ");                
+            countDown(300);
+            if(doorClosed == IN_OFF || cancelPending)
             {
-                //Display status
-                rgbLCD.locate(0,0);
-                rgbLCD.print("CYCLE STOPPED.  "); 
-                vfd=0;             //pump off
-                doorInterlock=1;    //door latched
-                wait(2);
-                fanRelay=0;         //fan stops
-                damperRotate(0);    //damperRelay=0;      //damper closed
-                
-                //wait 60sec 
-                countDown(10);              
-                doorInterlock=0;    //door unlatched
-            }  
-*/
+                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
+            rgbLCD.clear();
+            rgbLCD.locate(0,0);
+            rgbLCD.print("Tank is ready!  ");
         }
         else                    //door open
         {
             rgbLCD.locate(0,1);
-            rgbLCD.print("Door opened     ");
-            greenRelay=0;   //green light OFF
-            redRelay=1;   //turn red light ON
-            yellowRelay=0;
-            fanRelay=0;         //fan stops
-            damperRotate(1);    //damperRelay=1;      //damper closed            
-
+            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                  
         }
             
-   }
+        wait(1);
+    }
+}
+ 
+ 
+ 
+ 
+void damperRotate(int damper)   //damper condition
+{
+    if(damper==0 && damperIsOpen == true && !simulateMode)
+    {
+        damperRelayAlt=OUT_ON;  //toggle damper relay
+        rgbLCD.locate(0,1);
+        rgbLCD.print("Closing damper  ");
+        wait(30);
+        damperRelayAlt=OUT_OFF; //time out to reduce wear   
+        damperIsOpen = false;
+    }
+    else if(damper == 1 && damperIsOpen == false && !simulateMode)
+    {
+        damperRelay=OUT_ON;     //toggle damper relay
+        rgbLCD.locate(0,1);
+        rgbLCD.print("Opening damper  ");
+        wait(30);
+        damperRelay=OUT_OFF;    //time out to reduce wear  
+        damperIsOpen = true;
+    }
+}
+ 
+void fullLineItoA(int m, char* str)
+{
+    if(str == NULL)
+    {
+        return;
+    }
+    
+    // Empty the array to 16 white spaces
+    for(int j=0; j < 16; j++)
+    {
+        str[j] = ' ';   
+    }
+    str[16] = 0;
+ 
+    // Put our counter in it, with the least-significant digit in col 4.
+    int i = 3;       
+    do
+    {
+        str[i] = m%10 + '0';
+        m /= 10;
+        i--;
+    }while(m > 0 && i >= 0);
+}
+ 
+void countDown(int s)  //countdown in sec
+{
+    int m=0;
+    char count[12];  // make a 'count' string
+ 
+    for(m=s; m>0; m--)
+    {
+        if(stopBtt == IN_ON)
+        {
+           cancelPending = true;
+           break;
+        }
+ 
+        fullLineItoA(m, count);
+ 
+        rgbLCD.locate(0,1);
+        rgbLCD.print(count);
+        
+        wait(1); 
+    }
+}
+ 
+ 
+void debugMode()
+{
+    char displayLine1[17];
+    char displayLine2[17];
+    unsigned int count = 0;
+ 
+    rgbLCD.clear();
+    rgbLCD.locate(0,0);
+    //damperRotate(1);
+    
+    do
+    {
+        strcpy(displayLine1, "Door= ");
+        if(doorClosed == 1)
+        {
+            strcat(displayLine1, "1");
+        }
+        else
+        {
+            strcat(displayLine1, "0");
+        }
+    
+        strcat(displayLine1, ",Start=");
+        if(cycleStartBtt == 1)
+        {
+            strcat(displayLine1, "1 ");
+            if(stopBtt == 0)
+            {
+                fanRelay    = OUT_OFF;
+            }
+        }
+        else
+        {
+            strcat(displayLine1, "0 ");
+            fanRelay    = OUT_ON;
+        }
+    
+        
+        strcpy(displayLine2, "Stop= ");
+        if(stopBtt == 1)
+        {
+            strcat(displayLine2, "1 ");
+        }
+        else
+        {
+            strcat(displayLine2, "0 ");
+            
+        }
+               
+        // Every 2s, change the outputs
+        if((count&7) == 0)
+        {
+            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)
+            {
+            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:
+                yellowRelay     = OUT_ON;      //Yellow light 
+                strcat(displayLine2, " Yellow ");
+                break;
+            case 4:
+                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;
+            }
+        }
+        
+        rgbLCD.locate(0,0);
+        rgbLCD.print(displayLine1);
+        rgbLCD.locate(0,1);
+        rgbLCD.print(displayLine2);
+        
+        wait(0.25);
+        count++;
+    }
+    while(cycleStartBtt == IN_OFF || stopBtt == IN_OFF || doorClosed == IN_OFF);    
 }
\ No newline at end of file