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.
Revision 0:1a475dea8e4f, committed 2020-07-31
- Comitter:
- saltire78
- Date:
- Fri Jul 31 17:56:44 2020 +0000
- Commit message:
- posting online
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C12832.lib Fri Jul 31 17:56:44 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/askksa12543/code/C12832/#990d5eec2ef6
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Jul 31 17:56:44 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file