Vacuum loading of a plastic extrusion machine with Industruino
Alex wrote to us about his project which automates the vacuum loading of a plastic extrusion moulding machine.
Have a look at his comprehensive video in which he clearly explains the process through a simulation.
Alex's code and explanation:
/*
A typical vacuum loading system, used in the plastic industry as well as other industries to convey material, works as follows: a central vacuum pump creates a vacuum. pipes and hoses connect the pump to vacuum loaders.
when there is demand in a vacuum loader (usually both a proximity switch under the vacuum loader and a toggle switch in a panel) a signal opens a solenoid valve that allows the vacuum to pull material through to the vacuum loader.
only 1 loader should vacuum at a time.
the arduino sketch works as follows:
there are 4 toggle switches connected to digital inputs 1 to 4. these switches determine which vacuum loader demands material.
The sketch cycles through the 4 inputs, and if a switch is on, it will power the corresponding solenoid
valve (digital outputs 5 to 8) for a predetermined amount of time (loadDuration). Additionally, there a safety/relief valve. if there is no demand in any vacuum loader (IE all switches are off)
the sketch will power ON this valve (analog output 1). in some systems a signal might just turn off the vacuum pump, that's not the case here.
additionally, this relief valve is also turned ON if only 1 loader has demand: that is because there must always be some OFF time to unload the material in the loader: if a loader runs continuosly it will
overfill and malfunction.
This system has one more output (analog output 2): there is a filtered dust separator between the vacuum line and the pump, and it is equipped with a blowback feature, which is scheduled to power every hour of operation (approx.).
basically it is another selonoid valve which blows air on the filters to clean them.
---LCD---
the lcd does the following: it displays the 4 loaders, and shows which loader's switch is on (with an update delay of under 1 second).
it shows which loader is currently active, and for how many more seconds.
it shows the total time system has been running since last reboot.
it informs if safety/relief valve is on, and if blowback valve is on.
-----------------------------
---Created by Alex Netzer----
-----------------------------
*/
#include <UC1701.h>
#include <Wire.h>
#include <Indio.h>
static UC1701 lcd;
int overallTimer; //will keep track of total time system has been running. used to display time
int blowTimer; //keeps track of time for the purpose of activation blower approx. every hour
int loadDuration; //defines duration that each vacuum loader stays on. change to this will affect all loaders
int hours;
int minutes;
int seconds;
int totalLoaders; //checks how many vacuum loaders are ON
void setup() {
Indio.digitalMode(1,INPUT); // Set CH1 as an input
Indio.digitalMode(2,INPUT); // Set CH2 as an input
Indio.digitalMode(3,INPUT); // Set CH3 as an input
Indio.digitalMode(4,INPUT); // Set CH4 as an input
Indio.digitalMode(5,OUTPUT); // Set CH5 as an output
Indio.digitalMode(6,OUTPUT); // Set CH6 as an output
Indio.digitalMode(7,OUTPUT); // Set CH7 as an output
Indio.digitalMode(8,OUTPUT); // Set CH8 as an output
Indio.analogWriteMode(1, V10); //set analog CH1 to 10v output for safety valve
Indio.analogWriteMode(2, V10); //set analog ch2 to 10v output for blowback valve
pinMode(13,OUTPUT); // 13 is the backlight
analogWrite(13, LOW); //backlight on
loadDuration=5; // enter duration of each loader, in seconds. change here to affect all loaders.
overallTimer=1; // used to display total running time
blowTimer=0; // used to keep track of when blowback needs to run
lcd.begin();
lcd.setCursor(0, 3);
lcd.print(" L1 L2 L3 L4 ");
lcd.setCursor(0, 4);
lcd.print(" off off off off");
}
// screenUpdate is the function that checks if toggle switches are on or off and accordingly updates the lcd screen
// as you can see later, this function is run every second, so any switch change will update in the lcd within up to a second
void screenUpdate(){
if (Indio.digitalRead(1) == HIGH) {
lcd.setCursor(0, 4);
lcd.print(" on ");
}
else{
lcd.setCursor(0, 4);
lcd.print(" off");
}
if (Indio.digitalRead(2) == HIGH) {
lcd.setCursor(30, 4);
lcd.print(" on ");
}
else{
lcd.setCursor(30, 4);
lcd.print(" off");
}
if (Indio.digitalRead(3) == HIGH) {
lcd.setCursor(60, 4);
lcd.print(" on ");
}
else{
lcd.setCursor(60, 4);
lcd.print(" off");
}
if (Indio.digitalRead(4) == HIGH) {
lcd.setCursor(90, 4);
lcd.print(" on ");
}
else{
lcd.setCursor(90, 4);
lcd.print(" off");
}
}
// displayTime checks overallTimer and uses it to update the total running time displaid in the top line. as you can see later, it updates every second.
void displayTime() //this function was adapted from a tutorial by John Boxall, which you can view here: http://tronixstuff.com/2011/06/22/tutorial-arduino-timing-methods-with-millis/
{
float h,m,s;
int over;
h=int(overallTimer/3600);
over=overallTimer%3600;
m=int(over/60);
over=over%60;
s=over;
lcd.setCursor(20, 0);
lcd.print(h,0);
lcd.setCursor(40, 0);
lcd.print(":");
lcd.setCursor(45, 0);
lcd.print(m,0);
lcd.setCursor(58, 0);
lcd.print(":");
lcd.setCursor(63, 0);
lcd.print(s,0);
}
void loop() {
// the following 4 IF statements cycle through the inputs and - if they are ON- will turn the corrisponding output ON for "loadDuration" seconds.
//input 1
if (Indio.digitalRead(1) == HIGH) {
for (int i=1; i <= loadDuration; i++){
Indio.digitalWrite(5, HIGH);
lcd.setCursor(15,6);
lcd.print(loadDuration-i);
screenUpdate();
displayTime();
delay(1000); // as you can see, there is a delay of 1 second which is repeated "loadDuration" times,
overallTimer=overallTimer + 1; //this affects the "refresh rate" of the screen, as well as the time keeping element of the sketch.
blowTimer=blowTimer + 1; // while this might not be a very precise way to keep time, it is sufficient for the project.
}
Indio.digitalWrite(5,LOW);
lcd.setCursor(15,6);
lcd.print(" ");
}
//input 2
if (Indio.digitalRead(2) == HIGH) {
for (int i=1; i <= loadDuration; i++){
Indio.digitalWrite(6, HIGH);
lcd.setCursor(45,6);
lcd.print(loadDuration-i);
screenUpdate();
displayTime();
delay(1000);
overallTimer=overallTimer + 1;
blowTimer=blowTimer + 1;
}
Indio.digitalWrite(6,LOW);
lcd.setCursor(45,6);
lcd.print(" ");
}
//input 3
if (Indio.digitalRead(3) == HIGH) {
for (int i=1; i <= loadDuration; i++){
Indio.digitalWrite(7, HIGH);
lcd.setCursor(75,6);
lcd.print(loadDuration-i);
screenUpdate();
displayTime();
delay(1000);
overallTimer=overallTimer + 1;
blowTimer=blowTimer + 1;
}
Indio.digitalWrite(7,LOW);
lcd.setCursor(75,6);
lcd.print(" ");
}
//input 4
if (Indio.digitalRead(4) == HIGH) {
for (int i=1; i <= loadDuration; i++){
Indio.digitalWrite(8, HIGH);
lcd.setCursor(105,6);
lcd.print(loadDuration-i);
screenUpdate();
displayTime();
delay(1000);
overallTimer=overallTimer + 1;
blowTimer=blowTimer + 1;
}
Indio.digitalWrite(8,LOW);
lcd.setCursor(105,6);
lcd.print(" ");
}
//-------relief valve operation----------
totalLoaders=Indio.digitalRead(1) + Indio.digitalRead(2) + Indio.digitalRead(3) + Indio.digitalRead(4); // here we check how many switches are on, in total
if (totalLoaders <=1) { //if only 1 loader is on, this safety valve runs for 5 seconds before returning to that loader. if no loaders are on,
for (int i=1; i <=5; i++){ // sketch will keep returning to this function.
Indio.analogWrite(1, 5, false); // I only used analog output bacause I ran out of digital ones...
lcd.setCursor(0,6);
lcd.print("safety valve on!");
screenUpdate();
displayTime();
delay(1000);
overallTimer=overallTimer + 1;
}
Indio.analogWrite(1, 0, false);
lcd.setCursor(0,6);
lcd.print(" ");
}
//---------blowback valve operation---------
if (blowTimer >3600) { // after every 3600 seconds of operations, which are tracked by blowTimer, blowback valve goes on for 7 seconds.
for (int i=1; i <=7; i++){ // blowTimer only incremented when loaders where running and did not increase when relief valve was running.
Indio.analogWrite(2, 5, false);
lcd.setCursor(0,2);
lcd.print("BLOWBACK ACTIVATED!!!");
screenUpdate();
displayTime();
delay(1000);
overallTimer=overallTimer + 1;
}
blowTimer=0; // this counters now resets, waiting for one more hour to restart blowback valve
Indio.analogWrite(2,0,false);
lcd.setCursor(0,2);
lcd.print(" ");
}
}