#define POT_PIN 32
#define DETECT_LED 2
#define CAM_LED 4
#define SAMPLES 10
float prevAvg = 0;
bool captured = false;
// ----------- Get Average -----------
float getAverage() {
float sum = 0;
for (int i = 0; i < SAMPLES; i++) {
sum += analogRead(POT_PIN);
delay(5);
}
return sum / SAMPLES;
}
// ----------- Get Variance -----------
float getVariance(float avg) {
float sum = 0;
for (int i = 0; i < SAMPLES; i++) {
float val = analogRead(POT_PIN);
sum += (val - avg) * (val - avg);
delay(5);
}
return sum / SAMPLES;
}
void setup() {
Serial.begin(115200);
pinMode(DETECT_LED, OUTPUT);
pinMode(CAM_LED, OUTPUT);
}
void loop() {
float avg = getAverage();
float variance = getVariance(avg);
float rate = abs(avg - prevAvg);
prevAvg = avg;
// -------- ML-like Scoring --------
float score = (0.5 * avg) + (0.3 * variance) + (0.2 * rate);
Serial.print("Avg: "); Serial.print(avg);
Serial.print(" | Var: "); Serial.print(variance);
Serial.print(" | Rate: "); Serial.print(rate);
Serial.print(" | Score: "); Serial.println(score);
// -------- Decision Boundary --------
if (score > 2000 && !captured) {
digitalWrite(DETECT_LED, HIGH);
digitalWrite(CAM_LED, HIGH);
Serial.println("⚠ ML Model: High probability of particles");
Serial.println("Triggering camera...");
delay(1000);
Serial.println("Image Captured: sample.jpg");
Serial.println("Sending to CV system...");
Serial.println("---------------------------");
captured = true;
}
else if (score < 1500) {
Serial.println("Water Clear (ML confidence low)");
digitalWrite(DETECT_LED, LOW);
digitalWrite(CAM_LED, LOW);
captured = false;
}
delay(1000);
}