#include #define TRIGGER_PIN 14 #define ECHO_PIN 12 #define MAX_DISTANCE 400 #define SAMPLE_INTERVAL_MS 600000 // 10 minutes in milliseconds #define PRINT_INTERVAL_MS 1000 // 1 second in milliseconds typedef struct { float distanceSum; int count; float maxDistance; float minDistance; } Data; Data data; unsigned long lastSampleTime = 0; unsigned long lastPrintTime = 0; void setup() { Serial.begin(115200); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); EEPROM.begin(sizeof(Data)); EEPROM.get(0, data); if (data.minDistance == 0) { data.minDistance = MAX_DISTANCE; } } void loop() { if (millis() - lastSampleTime > SAMPLE_INTERVAL_MS) { lastSampleTime = millis(); sampleDistance(); } if (millis() - lastPrintTime > PRINT_INTERVAL_MS) { lastPrintTime = millis(); printDistance(); } if (Serial.available() > 0) { char command = Serial.read(); if (command == 's') { printSummary(); } } } void sampleDistance() { digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW); float distance = pulseIn(ECHO_PIN, HIGH) / 58.0; if (distance > 0 && distance <= MAX_DISTANCE) { data.distanceSum += distance; data.count++; if (distance > data.maxDistance) { data.maxDistance = distance; } if (distance < data.minDistance) { data.minDistance = distance; } EEPROM.put(0, data); } } void printDistance() { float distance = data.distanceSum / data.count; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } void printSummary() { float averageDistance = data.distanceSum / data.count; Serial.print("Average Distance: "); Serial.print(averageDistance); Serial.println(" cm"); Serial.print("Max Distance: "); Serial.print(data.maxDistance); Serial.println(" cm"); Serial.print("Min Distance: "); Serial.print(data.minDistance); Serial.println(" cm"); }