/*
==================================================
Tank + Pump Simulator (Single Arduino - Wokwi)
==================================================
Concept/Idea: N. M. D. Weerasinghe @ COTM
Sketch Created: with ChatGPT (GPT-5) on 2025-08-24
==================================================
Tank Level: 0-100
Virtual Sensors (LED outputs):
Pin 8 = HL (>75)
Pin 9 = HHL (>90)
Pin 10 = OF (>=98)
Pin 11 = LL (<25)
Pin 12 = LLL (<10)
Pin 13 = CL (<3)
Pump states:
Pin 7 = Pump command (controller)
Pin 6 = Pump running LED (green)
Pin A0 = Pump Fault switch (red button, HIGH = fault)
Pin A1 = Pump Force ON switch (yellow button, HIGH = force pump ON)
Pin A2 = Consumption switch (blue button, HIGH = consumption enabled)
==================================================
*/
int pumpCommand = 7; // Student controls pump here
int pumpLED = 6; // Green LED showing pump actually running
// Internal tank simulator variables
int tank_level = 0;
unsigned long lastPumpMillis = 0;
unsigned long lastUseMillis = 0;
// Sensor pins (output to "virtual environment")
int HL = 8;
int HHL = 9;
int OF = 10;
int LL = 11;
int LLL = 12;
int CL = 13;
// Control switches
int swFault = A0; // Pump fault
int swForceOn = A1; // Force pump on
int swConsume = A2; // Toggle consumption
// Status flags
bool consumptionEnabled = true;
void setup() {
// Pump
pinMode(pumpCommand, OUTPUT);
digitalWrite(pumpCommand, LOW);
pinMode(pumpLED, OUTPUT);
// Sensors
pinMode(HL, OUTPUT);
pinMode(HHL, OUTPUT);
pinMode(OF, OUTPUT);
pinMode(LL, OUTPUT);
pinMode(LLL, OUTPUT);
pinMode(CL, OUTPUT);
// Switches
pinMode(swFault, INPUT_PULLUP);
pinMode(swForceOn, INPUT_PULLUP);
pinMode(swConsume, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Tank + Pump Simulator Ready");
}
void loop() {
unsigned long now = millis();
// === External switches ===
bool faultActive = (digitalRead(swFault) == LOW); // pressed = fault
bool forceOnActive = (digitalRead(swForceOn) == LOW); // pressed = force pump
consumptionEnabled = (digitalRead(swConsume) == LOW); // pressed = consume
// === Determine pump running state ===
bool pumpRunning = false;
if (forceOnActive) {
pumpRunning = true; // override controller
} else if (faultActive) {
pumpRunning = false; // pump fault, ignore controller
} else {
pumpRunning = (digitalRead(pumpCommand) == HIGH);
}
digitalWrite(pumpLED, pumpRunning);
// === Tank filling (depends on pump running) ===
if (pumpRunning) {
if (now - lastPumpMillis >= 500) { // every 0.5s
lastPumpMillis = now;
if (tank_level < 100) tank_level++;
}
}
// === Tank consumption (independent) ===
if (consumptionEnabled) {
if (now - lastUseMillis >= 1000) { // every 1s
lastUseMillis = now;
if (tank_level > 0) tank_level--;
}
}
// === Update sensor outputs ===
digitalWrite(HL, (tank_level > 75));
digitalWrite(HHL, (tank_level > 90));
digitalWrite(OF, (tank_level >= 98));
digitalWrite(LL, (tank_level < 25));
digitalWrite(LLL, (tank_level < 10));
digitalWrite(CL, (tank_level < 3));
// ==================================================
// 🚧 STUDENT PUMP CONTROLLER LOGIC STARTS HERE 🚧
// Example (replace with student logic):
if (digitalRead(LL) == HIGH) {
digitalWrite(pumpCommand, HIGH); // turn ON pump
}
if (digitalRead(HL) == HIGH) {
digitalWrite(pumpCommand, LOW); // turn OFF pump
}
// 🚧 STUDENT SECTION ENDS 🚧
// ==================================================
// === Debug Print ===
Serial.print("Tank=");
Serial.print(tank_level);
Serial.print(" | HL="); Serial.print(digitalRead(HL));
Serial.print(" HHL="); Serial.print(digitalRead(HHL));
Serial.print(" OF="); Serial.print(digitalRead(OF));
Serial.print(" LL="); Serial.print(digitalRead(LL));
Serial.print(" LLL="); Serial.print(digitalRead(LLL));
Serial.print(" CL="); Serial.print(digitalRead(CL));
Serial.print(" | PumpCmd="); Serial.print(digitalRead(pumpCommand));
Serial.print(" ForceOn="); Serial.print(forceOnActive);
Serial.print(" Fault="); Serial.print(faultActive);
Serial.print(" Consume="); Serial.print(consumptionEnabled);
Serial.print(" | PumpRunning=");
Serial.println(pumpRunning);
delay(100);
}