/* * Craig's Smart Dog Bowl Monitor v3.0 - Professional Logic
* Pins: GPIO 0 (Sensor), 2 (Blue), 3 (Red), 4 (Green), 5 (Yellow)
*/
const int sensorPin = 0;
const int blueLED = 2;
const int redLED = 3;
const int greenLED = 4;
const int yellowLED = 5;
String currentStatus = "INIT";
void setup() {
Serial.begin(115200);
pinMode(blueLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
// --- STARTUP SELF-CHECK ---
Serial.println(">>> Initializing Hardware...");
int sequence[] = {redLED, yellowLED, blueLED, greenLED};
for (int pin : sequence) {
digitalWrite(pin, HIGH);
delay(250);
digitalWrite(pin, LOW);
}
Serial.println("--- System Online: Dog Bowl Monitor v3.0 ---");
}
void loop() {
// 1. SMOOTHING (Average 20 samples)
long total = 0;
for (int i = 0; i < 20; i++) {
total += analogRead(sensorPin);
delay(5);
}
int weight = total / 20;
// Calculate approximate percentage for the simulation
// ESP32 ADC is 12-bit (0-4095)
float percent = (weight / 4095.0) * 100.0;
// 2. DIFFERENTIAL ERROR DETECTION
// LOW ERROR (Broken Wire/Unplugged)
if (weight < 10) {
handleError("LOW", redLED, yellowLED, blueLED);
return;
}
// HIGH ERROR (Crushed/Short Circuit)
else if (weight > 4080) {
handleError("HIGH", blueLED, redLED, yellowLED);
return;
}
// 3. WATER LEVEL LOGIC
if (weight > 2500) {
setLights(LOW, LOW, HIGH); // Blue
updateLog("FULL", weight, percent);
}
else if (weight < 2300 && weight > 1000) {
setLights(LOW, HIGH, LOW); // Yellow
updateLog("WARNING", weight, percent);
}
else if (weight < 800) {
setLights(HIGH, LOW, LOW); // Red
updateLog("CRITICAL", weight, percent);
}
// 4. SYNC BLINK (Green)
if (millis() % 10000 < 300) {
digitalWrite(greenLED, HIGH);
} else {
digitalWrite(greenLED, LOW);
}
delay(200);
}
// ERROR HANDLING: One LED stays solid, others blink
void handleError(String type, int solidPin, int blink1, int blink2) {
digitalWrite(solidPin, HIGH);
digitalWrite(blink1, HIGH);
digitalWrite(blink2, HIGH);
Serial.print("!! SENSOR ERROR ["); Serial.print(type); Serial.println("] !!");
delay(300);
digitalWrite(blink1, LOW);
digitalWrite(blink2, LOW);
delay(300);
}
void setLights(int r, int y, int b) {
digitalWrite(redLED, r);
digitalWrite(yellowLED, y);
digitalWrite(blueLED, b);
}
void updateLog(String status, int weight, float percent) {
if (currentStatus != status) {
Serial.print("STATUS: "); Serial.print(status);
Serial.print(" | Weight: "); Serial.print(weight);
Serial.print(" | Approx: "); Serial.print(percent, 1); Serial.println("%");
currentStatus = status;
}
}Loading
esp32-c6-devkitc-1
esp32-c6-devkitc-1