The Final Pressure Controled Pump Control PLC
The Final Pressure Controled Pump Control PLC
#include <LiquidCrystal.h>
void setup() {
pinMode(inputPin, INPUT);
pinMode(pump1Pin, OUTPUT);
pinMode(pump2Pin, OUTPUT);
pinMode(pump3Pin, OUTPUT);
pinMode(controlLedPin, OUTPUT);
pinMode(pushToReadPin, INPUT_PULLUP);
pinMode(modeSwitchPin, INPUT_PULLUP);
pinMode(lowPressureLedPin, OUTPUT);
pinMode(vfdLedPin, OUTPUT);
lcd.begin(20, 4);
byte clockIcon[8] = {
B11111, B01110, B01110, B00100,
B01110, B01110, B11111, B11111
};
lcd.createChar(0, clockIcon);
byte newIcon[8] = {
B11111, B11111, B01110, B00100,
B01110, B11111, B11111, B01110
};
lcd.createChar(1, newIcon);
digitalWrite(pump1Pin, LOW);
digitalWrite(pump2Pin, LOW);
digitalWrite(pump3Pin, LOW);
digitalWrite(controlLedPin, LOW);
digitalWrite(lowPressureLedPin, LOW);
digitalWrite(vfdLedPin, LOW);
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
handlePressureLogic();
handleScreenLogic();
handleControlLedLogic(currentTime);
handleVfdLedLogic(currentTime);
handleOriginalPumpLogic();
float pressureSum = 0;
for (int i = 0; i < 10; i++) {
pressureSum += pressureReadings[i];
}
// Function to handle the screen logic (mode switch and push-to-read switch)
void handleScreenLogic() {
int pushToReadState = digitalRead(pushToReadPin);
int modeSwitchState = digitalRead(modeSwitchPin);
if (modeSwitchState != lastModeSwitchState) {
lastDebounceTime = currentTime;
}
lastModeSwitchState = modeSwitchState;
if (pushToReadState == LOW) {
displayPressureScreen = true;
} else {
displayPressureScreen = false;
}
if (isInThresholdMode) {
highThreshold = (analogRead(highThresholdPin) * (6.0 / 1023.0));
lowThreshold = (analogRead(lowThresholdPin) * (6.0 / 1023.0));
}
}
// Function to handle the original pump logic (correct pump cycling and stop order)
void handleOriginalPumpLogic() {
int currentInputState = digitalRead(inputPin);
unsigned long currentTime = millis();
// Pump ON logic
if (pump1On && (currentTime - startTime >= delayDuration)) {
digitalWrite(pumpOrder[0], HIGH); // Turn ON the first pump in the order
Serial.println("First Pump ON");
}
// Correct pump OFF logic: pumps stop in the same order they started
if (currentInputState == LOW && (pump1On || pump2On || pump3On)) {
if (pump1On) {
digitalWrite(pumpOrder[0], LOW); // Turn OFF the first pump in the order
pump1On = false;
Serial.println("First Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
if (pump2On) {
digitalWrite(pumpOrder[1], LOW); // Turn OFF the second pump in the order
pump2On = false;
Serial.println("Second Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
if (pump3On) {
digitalWrite(pumpOrder[2], LOW); // Turn OFF the third pump in the order
pump3On = false;
Serial.println("Third Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
if (isInThresholdMode) {
lcd.setCursor(0, 0);
lcd.print("Set Pressure Limits");
lcd.setCursor(0, 1);
lcd.print("High Threshold: ");
lcd.print(highThreshold, 2);
lcd.setCursor(0, 2);
lcd.print("Low Threshold: ");
lcd.print(lowThreshold, 2);
lcd.setCursor(0, 3);
lcd.print("Press Mode to Exit");
} else if (displayPressureScreen) {
lcd.setCursor(0, 0);
lcd.print("PRESSURE: ");
lcd.print(smoothedPressure, 2);
lcd.setCursor(0, 1);
lcd.print("PUMP1=");
lcd.print(digitalRead(pump1Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 1);
lcd.print("PUMP2=");
lcd.print(digitalRead(pump2Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 2);
lcd.print("PUMP3=");
lcd.print(digitalRead(pump3Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 3);
lcd.write(byte(1));
lcd.setCursor(11, 3);
lcd.print("RIK & SUBHRO");
} else {
lcd.setCursor(0, 0);
lcd.print("*******COSMOS*******");
lcd.setCursor(0, 1);
lcd.print("PUMP PLC T5 ROSEDALE");
lcd.setCursor(0, 2);
lcd.print("PUMP1=");
lcd.print(digitalRead(pump1Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 2);
lcd.print("PUMP2=");
lcd.print(digitalRead(pump2Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 3);
lcd.print("PUMP3=");
lcd.print(digitalRead(pump3Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 3);
lcd.write(byte(0));
lcd.setCursor(11, 3);
#include <LiquidCrystal.h>
void setup() {
pinMode(inputPin, INPUT);
pinMode(pump1Pin, OUTPUT);
pinMode(pump2Pin, OUTPUT);
pinMode(pump3Pin, OUTPUT);
pinMode(controlLedPin, OUTPUT);
pinMode(pushToReadPin, INPUT_PULLUP);
pinMode(modeSwitchPin, INPUT_PULLUP);
pinMode(lowPressureLedPin, OUTPUT);
pinMode(vfdLedPin, OUTPUT);
lcd.begin(20, 4);
byte clockIcon[8] = {
B11111, B01110, B01110, B00100,
B01110, B01110, B11111, B11111
};
lcd.createChar(0, clockIcon);
byte newIcon[8] = {
B11111, B11111, B01110, B00100,
B01110, B11111, B11111, B01110
};
lcd.createChar(1, newIcon);
digitalWrite(pump1Pin, LOW);
digitalWrite(pump2Pin, LOW);
digitalWrite(pump3Pin, LOW);
digitalWrite(controlLedPin, LOW);
digitalWrite(lowPressureLedPin, LOW);
digitalWrite(vfdLedPin, LOW);
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
handlePressureLogic();
handleScreenLogic();
handleControlLedLogic(currentTime);
handleVfdLedLogic(currentTime);
handleOriginalPumpLogic();
float pressureSum = 0;
for (int i = 0; i < 10; i++) {
pressureSum += pressureReadings[i];
}
// Function to handle the screen logic (mode switch and push-to-read switch)
void handleScreenLogic() {
int pushToReadState = digitalRead(pushToReadPin);
int modeSwitchState = digitalRead(modeSwitchPin);
if (modeSwitchState != lastModeSwitchState) {
lastDebounceTime = currentTime;
}
lastModeSwitchState = modeSwitchState;
if (pushToReadState == LOW) {
displayPressureScreen = true;
} else {
displayPressureScreen = false;
}
if (isInThresholdMode) {
highThreshold = (analogRead(highThresholdPin) * (6.0 / 1023.0));
lowThreshold = (analogRead(lowThresholdPin) * (6.0 / 1023.0));
}
}
// Function to handle the original pump logic (correct pump cycling and stop order)
void handleOriginalPumpLogic() {
int currentInputState = digitalRead(inputPin);
unsigned long currentTime = millis();
// Pump ON logic
if (pump1On && (currentTime - startTime >= delayDuration)) {
digitalWrite(pumpOrder[0], HIGH); // Turn ON the first pump in the order
Serial.println("First Pump ON");
}
// Correct pump OFF logic: pumps stop in the same order they started
if (currentInputState == LOW && (pump1On || pump2On || pump3On)) {
if (pump1On) {
digitalWrite(pumpOrder[0], LOW); // Turn OFF the first pump in the order
pump1On = false;
Serial.println("First Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
if (pump2On) {
digitalWrite(pumpOrder[1], LOW); // Turn OFF the second pump in the order
pump2On = false;
Serial.println("Second Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
if (pump3On) {
digitalWrite(pumpOrder[2], LOW); // Turn OFF the third pump in the order
pump3On = false;
Serial.println("Third Pump OFF");
updateLCD(); // Update LCD in real-time
delay(closeDelay);
}
// Function to update the LCD display based on mode and screen toggling
void updateLCD() {
lcd.clear();
if (isInThresholdMode) {
lcd.setCursor(0, 0);
lcd.print("Set Pressure Limits");
lcd.setCursor(0, 1);
lcd.print("High Threshold: ");
lcd.print(highThreshold, 2);
lcd.setCursor(0, 2);
lcd.print("Low Threshold: ");
lcd.print(lowThreshold, 2);
lcd.setCursor(0, 3);
lcd.print("Press Mode to Exit");
} else if (displayPressureScreen) {
lcd.setCursor(0, 0);
lcd.print("PRESSURE: ");
lcd.print(smoothedPressure, 2);
lcd.setCursor(0, 1);
lcd.print("PUMP1=");
lcd.print(digitalRead(pump1Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 1);
lcd.print("PUMP2=");
lcd.print(digitalRead(pump2Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 2);
lcd.print("PUMP3=");
lcd.print(digitalRead(pump3Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 3);
lcd.write(byte(1));
lcd.setCursor(11, 3);
lcd.print("RIK & SUBHRO");
} else {
lcd.setCursor(0, 0);
lcd.print("*******COSMOS*******");
lcd.setCursor(0, 1);
lcd.print("PUMP PLC T5 ROSEDALE");
lcd.setCursor(0, 2);
lcd.print("PUMP1=");
lcd.print(digitalRead(pump1Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 2);
lcd.print("PUMP2=");
lcd.print(digitalRead(pump2Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 3);
lcd.print("PUMP3=");
lcd.print(digitalRead(pump3Pin) == HIGH ? "ON " : "OFF");
lcd.setCursor(10, 3);
lcd.write(byte(0));
lcd.setCursor(11, 3);