// ==================================================
// Tank + Pump Simulator (Single Arduino - Wokwi)
//
// Concept/Idea: N. M. D. Weerasinghe @ COTM
// Sketch Created with assistance from ChatGPT (GPT-5)
// Date: 2025-08-24
//
// ==================================================
// Tank simulator runs internally, students edit ONLY
// the "STUDENT PUMP CONTROLLER LOGIC" section below.
//
// Tank Level: 0-100
// Pin Mappings (virtual sensors):
// 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 command = pin 7 (student output)
//
// ==================================================
int pumpCommand = 7; // Student controls pump here
// 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;
// Consumption toggle (simulate water usage)
bool consumptionEnabled = true;
void setup() {
// Pump output (student control)
pinMode(pumpCommand, OUTPUT);
digitalWrite(pumpCommand, LOW);
// Sensor outputs (driven by simulator)
pinMode(HL, OUTPUT);
pinMode(HHL, OUTPUT);
pinMode(OF, OUTPUT);
pinMode(LL, OUTPUT);
pinMode(LLL, OUTPUT);
pinMode(CL, OUTPUT);
Serial.begin(9600);
Serial.println("Tank + Pump Simulator Ready");
}
void loop() {
unsigned long now = millis();
// === Tank filling (depends on pump command) ===
if (digitalRead(pumpCommand) == HIGH) {
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: Simple rule-based pump control
// Replace with your own 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(" | Pump=");
Serial.println(digitalRead(pumpCommand));
delay(100);
}