I am working on building a filling machine that will work with 3 containers, as you can see in the image, each tank has an inlet and a discharge solenoid valve.
It is intended to work as follows:
with the "0" button the filling valves of the 3 containers will be opened until each one reaches the liquid level determined by the sensor (in green).
Buttons 1, 2 and 3 release the contenst of each deposit accordingly.
I started writing the code according to these operating principles without stopping to think if it was even possible.
Considering that a delay() function is used for the discharge of each container, I assume that it is not possible to open a discharge valve while another one is discharging. Is there any way to work around this problem? Or would I need to use different arduinos for each set of valves?
Here's the code Ive written so far:
//XKC-Y25-V
const int SENSOR1 = 13;
const int SENSOR2 = 12;
const int SENSOR3 = 11;
const int BUTTON0 = 10; //button for loading all 3 fillers
const int BUTTON1 = 9; //filler #1 discharge
const int BUTTON2 = 8; //filler #2 discharge
const int BUTTON3 = 7; //filler #3 discharge
const int VAL11 = 6;
const int VAL12 = 5;
const int VAL21 = 4;
const int VAL22 = 3;
const int VAL31 = 2;
const int VAL32 = 1;
bool flag00 = 1; //flag variable for unloaded fillers
bool flag01 = 0; //flag variable for load button
bool flag02 = 0; //flag variable for load button
bool flag03 = 0; //flag variable for load button
bool flag11 = 0; //flag variable for load conditions
bool flag21 = 0; //flag variable for load conditions
bool flag31 = 0; //flag variable for load conditions
bool flag1L = 0; //marks the end of loading 1
bool flag2L = 0; //marks the end of loading 2
bool flag3L = 0; //marks the end of loading 3
bool flag12 = 0; //flag variable for discharge button1
bool flag22 = 0; //flag variable for discharge button2
bool flag32 = 0; //flag variable for discharge button3
bool flag1D = 0; //marks the end of discharge 1
bool flag2D = 0; //marks the end of discharge 2
bool flag3D = 0; //marks the end of discharge 3
unsigned long discharge_time = 40000; //NOTE TO SELF:CHECK FOR ERROR, COULD BE SMALLER
void setup()
{
Serial.begin(9600);
//SENSORS
pinMode(SENSOR1, INPUT);
pinMode(SENSOR2, INPUT);
pinMode(SENSOR3, INPUT);
//BUTTONS
pinMode(BUTTON0, INPUT);
pinMode(BUTTON1, INPUT);
pinMode(BUTTON2, INPUT);
pinMode(BUTTON3, INPUT);
// VALVE CONTROL
pinMode(VAL11, OUTPUT);
pinMode(VAL12, OUTPUT);
pinMode(VAL21, OUTPUT);
pinMode(VAL22, OUTPUT);
pinMode(VAL31, OUTPUT);
pinMode(VAL32, OUTPUT);
}
void loop()
{
// begin with all valves shut
digitalWrite(VAL11,HIGH);
digitalWrite(VAL12,HIGH);
digitalWrite(VAL21,HIGH);
digitalWrite(VAL22,HIGH);
digitalWrite(VAL31,HIGH);
digitalWrite(VAL32,HIGH);
delay(100);
// get sensor readings & print
int level1 = digitalRead(SENSOR1); //CHECKS FOR LIQUID LEVEL in filler#1
int level2 = digitalRead(SENSOR2); //CHECKS FOR LIQUID LEVEL in filler#2
int level3 = digitalRead(SENSOR3); //CHECKS FOR LIQUID LEVEL in filler#3
Serial.print("READINGS ");
Serial.print(level1);
Serial.print(", ");
Serial.print(level2);
Serial.print(", ");
Serial.println(level3);
// CHECK FOR LOADING CONDITIONS
int load = digitalRead(BUTTON0);
if (load != 1) {
delay(200);
flag01 = 1;
flag02 = 1;
flag03 = 1;
}
flag11 = flag01 && flag00
flag21 = flag02 && flag00
flag31 = flag03 && flag00
flag1D = 0
flag2D = 0
flag3D = 0
// open valve11
if (level1 == 1 && flag11==1) {
digitalWrite(VAL11, LOW);
//flag0 = 1;
//flag3 = 1;
}
else {
digitalWrite(VAL11, HIGH);
flag11 = 0;
flag01 = 0;
flag1L = 1;
}
// open valve21
if (level2 == 1 && flag21==1) {
digitalWrite(VAL21, LOW);
//flag0 = 1;
//flag3 = 1;
}
else {
digitalWrite(VAL21, HIGH);
flag21 = 0;
flag02 = 0;
flag2L = 1;
}
// open valve31
if (level3 == 1 && flag31==1) {
digitalWrite(VAL31, LOW);
//flag0 = 1;
//flag3 = 1;
}
else {
digitalWrite(VAL31, HIGH);
flag31 = 0;
flag03 = 0;
flag3L = 1;
}
// DISCHARGE SECTION
int disch1 = digitalRead(BUTTON1); //CHECKING BUTTON1
if (disch1 != 1) {
delay(200);
flag12 = 1;
}
int disch2 = digitalRead(BUTTON2); //CHECKING BUTTON2
if (disch2 != 1) {
delay(200);
flag22 = 1;
}
int disch3 = digitalRead(BUTTON3); //CHECKING BUTTON3
if (disch3 != 1) {
delay(200);
flag32 = 1;
}
if (flag12 == 1 && flag1L == 1) { //DISCHARGES FILLER1 through VAL12
digitalWrite(VAL12, LOW);
delay(discharge_time);
digitalWrite(VAL12, HIGH);
flag12 = 0;
flag1L = 0;
flag1D = 1;
}
if (flag22 == 1 && flag2L == 1) { //DISCHARGES FILLER2 through VAL22
digitalWrite(VAL22, LOW);
delay(discharge_time);
digitalWrite(VAL22, HIGH);
flag22 = 0;
flag2L = 0;
flag2D = 1;
}
if (flag32 == 1 && flag3L == 1) { //DISCHARGES FILLER3 through VAL32
digitalWrite(VAL32, LOW);
delay(discharge_time);
digitalWrite(VAL32, HIGH);
flag32 = 0;
flag3L = 0;
flag3D = 1;
}
flag00= flag1D && flag2D && flag3D
}
