Simulation of a chemical etch wetbench tank

Dependencies:   mbed C12832

Revision:
0:1a475dea8e4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jul 31 17:56:44 2020 +0000
@@ -0,0 +1,232 @@
+// including necessary header folders
+#include"mbed.h"
+#include"C12832.h"
+
+// declaring necessary components and variables
+Serial pc(USBTX,USBRX);                             //USB tx,rx
+C12832 lcd(p5,p7,p6,p8,p11);                        //Breakout board lcd
+
+AnalogIn lvl(p19);                                  //pot1 level sensor
+AnalogIn temp(p20);                                 //pot2 temperature sensor
+
+DigitalIn start(p15);                               //joystick up start button
+DigitalIn prod(p13);                                //joystick left product detected in tank (simulates sensor input)
+DigitalOut invalve(LED1);                           //LED1 represents an input valve to fill the tank - open is true
+DigitalOut outvalve(LED2);                          //LED2 represents an output valve to empty the tank - open is true
+DigitalOut heatstir(LED3);                          //LED3 represents an heater and stirrer to maintain temp and stir the tank - on is true
+DigitalOut sysrun(LED4);                            //LED4 represents a Clear To Run signal outputted to system to allow product loading - on is true
+Timer debounce;
+
+InterruptIn emo(p14);                               //joystick button EMO activation button (Interrupt)
+InterruptIn stop(p12);                              //joystick down stop button (Interrupt)
+
+/* criteria set for tank level between 0 and 25 litres, temperature between 0 and 200 degrees C.
+Low/High levels represent acceptable manufacturing level. Critical levels will indicate system/equipment failure and dump tank.
+Chemical lifespan is set to 50 hours of production and production time for each lot in tool is 1.5hrs */
+float lvlset=20.0, lvllo=15.0, lvlhi=23.0, lvlhihi=24.0;                    // tank level criteria - current level, setpoint, lowest level, high level, critical high
+float tmpset=150.0, tmplo=130.0, tmphi=170.0, tmphihi=190.0;                // tank temperature criteria - current temp, setpoint, lowest level, high level, critical high
+float tanklife=50.0, prodtime=1.5;                                          // production criteria - lifespan of chemicals, production time per lot
+int ctf=0, cth, ctr, prodpres;                                              // flags for clear to fill, clear to heat, clear to run, product in tank - in all cases clear is true
+
+// Interrupt program for Emergency Manual Overide activation
+void override(){
+    debounce.start();               // start the timer
+    invalve=0;                      // close input valve
+    outvalve=1;                     // dump tank
+    heatstir=0;                     // stop heater
+    ctf=0;                          // clear to fill to false
+    cth=0;                          // clear to heat to false
+    ctr=0;                          // clear to run to false
+    lcd.cls();                      // clear LCD screen
+    lcd.locate(0,0);                // home the lcd screen
+    lcd.printf("EMO activated!\nContact Equipment Group!\nDumping Tank");       //print emo text on LCD
+    pc.printf("EMO activated! Contact Equipment Group! Dumping Tank\n\r");      //print emo text on pc
+    if (debounce.read_ms() >= 500){ // determine the timer limits - greater than or equal incase the exact count was missed by timer               
+        debounce.reset();           // reset the timer for the next use
+    }
+    
+}
+
+// Interrupt program for Stop button activation
+void halt(){
+    debounce.start();               // start the timer
+    invalve=0;                      // close input valve
+    outvalve=0;                     // close output valve
+    heatstir=0;                     // stop heater
+    ctf=0;                          // clear to fill to false
+    cth=0;                          // clear to heat to false
+    ctr=0;                          // clear to run to false
+    lcd.cls();                      // clear LCD screen
+    lcd.locate(0,0);                // home the lcd screen
+    lcd.printf("Stop Pressed!\nContact Equipment Group!\nHold to verify");                  //print stop text on LCD
+    pc.printf("Stop Pressed! Contact Equipment Group! Hold to verify production ok!\n\r");  //print stop text on pc
+    if (debounce.read_ms() >= 500){ // determine the timer limits - greater than or equal incase the exact count was missed by timer               
+        debounce.reset();           // reset the timer for the next use
+    }
+    
+}
+
+// Start of main program
+int main(){
+    // define emo interrupt
+    emo.rise(&override);     //attach the function address to the rising edge
+    // define Stop interrupt
+    stop.rise(&halt);     //attach the function address to the rising edge
+
+    
+    while(1){                               //always on loop
+        float level=25.0*lvl+0;             //define the current tank level (y=mx+c)
+        float temperature=200.0*temp+0;     //define the current tank temperature (y=mx+c)
+        
+        // initial start conditions are an error or a start button press
+        if(ctf==0 and prod==1){                                                                     //load error detected - product in tank/sensor failure
+            lcd.cls();                                                                              //clear LCD screen
+            lcd.locate(0,0);                                                                        //error - home the lcd screen
+            lcd.printf("System Error!\nContact Equipment Group!\nProduct detected in tank!");       //error - print error text on LCD
+            pc.printf("System Error! - Contact Equipment Group! - Product detected in tank!\n\r");  //error - print error text via terraterm to pc
+            }
+        if(ctf==0 and start==1){                                                                    //start button goes true (momentary)
+            ctf=1;                                                                                  //clear to fill flag goes true (set)
+            lcd.cls();                                                                              //clear LCD screen
+            lcd.locate(0,0);                                                                        //home LCD screen
+            lcd.printf("Start Button Pressed");                                                     //print start text on LCD
+            pc.printf("Start Button Pressed\n\r");                                                  //clear to fill flag goes true (set) - only stop/emo/dump will unset this
+            wait(0.5);                                                                              //debounce delay                                       
+            }
+        
+        //if cleared to fill various states are possible based upon volume detected
+        if(ctf==1){                                                                                             //clearance given to run
+
+            if(level<lvllo){                                                                                    //tank below lowest usable level
+                invalve=1;                                                                                      //open the input valve
+                outvalve=0;                                                                                     //close the output valve
+                cth=0;                                                                                          //heat/stir flag set to false
+                lcd.cls();                                                                                      //LCD screen cleared
+                lcd.locate(0,0);                                                                                //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTank Filling",level,temperature);                        //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank filling\n\r",level,temperature);    //status to pc
+                wait(1);                                                                                        //pause for 1 second to prevent flood of data
+                }
+            else if(level<lvlset){                                                                              //minimum usable volume reached, heating now allowed
+                invalve=1;                                                                                      //filling to setpoint
+                outvalve=0;                                                                                     //closed output valve
+                cth=0;                                                                                          //clear to heat flag goes true (set)
+                lcd.cls();                                                                                      //LCD screen cleared
+                lcd.locate(0,0);                                                                                //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTank Level Low",level,temperature);                      //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank level low\n\r",level,temperature);  //status to pc
+                wait(1);                                                                                        //pause for 1 second to prevent flood of data
+                }
+            else if(level<lvlhi){                                                                               //volume setpoint reached
+                invalve=0;                                                                                      //input valve closed
+                outvalve=0;                                                                                     //output valve remains closed
+                cth=1;                                                                                          //clear to fill flag remains true
+                lcd.cls();                                                                                      //LCD screen cleared
+                lcd.locate(0,0);                                                                                //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nAt Level Setpoint",level,temperature);                           //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank at level setpoint\n\r",level,temperature);  //status to pc
+                wait(1);                                                                                                //pause for 1 second to prevent flood of data
+                }
+            else if(level<lvlhihi){                                                                             //warning state - volume goes high enough to flag - possible ceased input valve/system error
+                invalve=0;                                                                                      //input valve off command reconfirmed
+                outvalve=1;                                                                                     //output valve opened to release volume
+                cth=0;                                                                                          //clear to heat flag goes false (set)
+                lcd.cls();                                                                                      //LCD screen cleared
+                lcd.locate(0,0);                                                                                //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTank Level High!",level,temperature);                                //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank Level High Warning!\n\r",level,temperature);    //status to pc
+                wait(1);                                                                                                    //pause for 1 second to prevent flood of data
+                }
+            else if(lvlhihi<=level){                                                                            //critical state - critical volume detected, overflow risk - emergency dump
+                invalve=0;                                                                                      // input valve closed
+                outvalve=1;                                                                                     //output valve open to dump
+                cth=0;                                                                                          //clear to heat flag remains false
+                ctf=0;                                                                                          //clear to fill flag goes false - tool returned to start conditions
+                lcd.cls();                                                                                      //LCD screen cleared
+                lcd.locate(0,0);                                                                                //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nLevel Critical! Tank Dump",level,temperature);                               //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank Overflow Risk! Dumping Tank\n\r",level,temperature);    //status to pc
+                wait(1);                                                                                                            //pause for 1 second to prevent flood of data
+                }
+        }
+                
+        //if cleared to heat various states are possible based upon volume detected
+        if(cth==1){                                                                                 //clearance given to run heater/stirrer
+
+            if(temperature<tmplo){                                                                  //tank below lowest usable temperature
+                heatstir=1;                                                                         //turn on the heater/stirrer
+                ctr=0;                                                                              //clear to run flag set to false
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTank Heating",level,temperature);                                            //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank Temperature Low, Heater on\n\r",level,temperature);     //status to pc
+                wait(1);                                                                                                            //pause for 1 second to prevent flood of data
+                }
+            else if(temperature<tmpset){                                                            //minimum usable temperature reached, running now allowed
+                heatstir=1;                                                                         //heating to setpoint
+                ctr=1;                                                                              //clear to run flag goes true (set)
+                sysrun=1;                                                                           //output to system to begin loading product
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTemp Low",level,temperature);                                        //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Temperaturelow,  ok to run\n\r",level,temperature);  //status to pc
+                wait(1);                                                                                                    //pause for 1 second to prevent flood of data
+                }
+            else if(temperature<tmphi){                                                             //temp setpoint reached
+                heatstir=0;                                                                         //heater off
+                ctr=1;                                                                              //clear to run flag remains true
+                sysrun=1;                                                                           //output to system to begin loading product
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTemp at Setpoint",level,temperature);                                    //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank at temperature setpoint\n\r",level,temperature);    //status to pc
+                wait(1);                                                                                                        //pause for 1 second to prevent flood of data
+                }
+            else if(temperature<tmphihi){                                                           //warning state - temp goes high enough to flag - possible ceased heater/system error
+                heatstir=0;                                                                         //input valve off command reconfirmed
+                ctr=0;                                                                              //clear to heat flag goes false (set)
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTemp High!",level,temperature);                                          //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank Temperature High Warning!\n\r",level,temperature);  //status to pc
+                wait(1);                                                                                                        //pause for 1 second to prevent flood of data
+                }
+            else if(tmphihi<=temperature){                                                          //critical state - critical volume detected, overflow risk - emergency dump
+                heatstir=0;                                                                         // input valve closed
+                ctr=0;                                                                              //clear to run flag goes false
+                cth=0;                                                                              //clear to heat flag goes false
+                ctf=0;                                                                              //clear to fill flag goes false - tool returned to start conditions
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f\nTemp: %3.1f\nTemp Critical! Tank Dump",level,temperature);                                            //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Tank Overheated, Production Risk! Dumping Tank\n\r",level,temperature);  //status to pc
+                wait(1);                                                                                                                        //pause for 1 second to prevent flood of data
+                }
+            }
+            
+            if(ctr==1){                                                                             //clearance given to run heater/stirrer
+               if(prod==1){                                                                         //when product arrives at station and triggers sensor
+                    tanklife-=prodtime;                                                             //chemical time is reduced by set amount of production time
+                    }
+                lcd.cls();                                                                          //LCD screen cleared
+                lcd.locate(0,0);                                                                    //LCD homed
+                lcd.printf("Level: %2.1f L\nTemp: %3.1f C\nChem Time: %3.1f Hrs",level,temperature,tanklife);                           //status to LCD
+                pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Remaining Chem hours: %3.1f\n\r",level,temperature,tanklife);    //status to pc
+                wait(1);                                                                                                                //clearance given to run heater/stirrer
+                   }
+                   
+                if(tanklife<=0){                                                                    //when usable lifespan of chemical expires
+                    ctr=0;                                                                          //clear to run flag goes false
+                    cth=0;                                                                          //clear to heat flag goes false
+                    ctf=0;                                                                          //clear to fill flag goes false
+                    sysrun=0;                                                                       //command to run production rescinded
+                    lcd.cls();                                                                      //LCD screen cleared
+                    lcd.locate(0,0);                                                                //LCD homed
+                    lcd.printf("Level: %2.1f\nTemp: %3.1f\nChem Time Over, Dump!",level,temperature);                                           //status to LCD
+                    pc.printf("Tank level: %2.1f, Tank temperature: %3.1f, Chemical time limit expired! Dumping Tank\n\r",level,temperature);   //status to pc
+                    wait(1);                                                                                                                    //pause for 1 second to prevent flood of data
+                    }
+                
+               
+        } // while loop end
+} // main end
\ No newline at end of file