#define CMD_START_RECORDING 's' #define CMD_DISPLAY_AVERAGES 'd' int sensor = 27; int sampleCount = 0; int totalSum = 0; unsigned long measurementPeriod = 1000; // 1 second unsigned long lastMeasurement = 0; int lowest = 100; // start with the maximum possible percentage int highest = 0; // start with the minimum possible percentage int tenSecs[6] = {0, 0, 0, 0, 0, 0}; int intervalCount = 0; bool recordingMode = false; String outputBuffer = ""; void setup() { Serial.begin(9600); Serial.println("Program starting..."); } void loop() { if (Serial.available() > 0) { char cmd = Serial.read(); if (cmd == CMD_START_RECORDING) { recordingMode = true; sampleCount = 0; totalSum = 0; lastMeasurement = millis(); lowest = 100; highest = 0; memset(tenSecs, 0, sizeof(tenSecs)); intervalCount = 0; outputBuffer = ""; } else if (cmd == CMD_DISPLAY_AVERAGES) { recordingMode = false; calculateAndDisplayAverages(); } } if (recordingMode) { unsigned long currentMillis = millis(); if (currentMillis - lastMeasurement >= measurementPeriod) { int soil = analogRead(sensor); int soilPercent = map(soil, 4095, 2076, 0, 100); soilPercent = constrain(soilPercent, 0, 100); totalSum += soilPercent; sampleCount++; if (soilPercent > highest) highest = soilPercent; if (soilPercent < lowest) lowest = soilPercent; outputBuffer += String((currentMillis - lastMeasurement) / 1000) + "," + String(soilPercent) + "\n"; tenSecs[intervalCount] += soilPercent; if (sampleCount % 10 == 0) intervalCount++; if (soilPercent >= 80) { Serial.println("Enough water for plant."); } else if (soilPercent <= 40) { Serial.println("Water level is low."); } else { Serial.println("Water level is OK."); } Serial.print("Raw Soil Moisture: "); Serial.println(soil); Serial.print("Soil Moisture Percentage: "); Serial.println(soilPercent); lastMeasurement = currentMillis; } } } void calculateAndDisplayAverages() { Serial.println("Sample,10 sec interval average (%)"); for (int i = 0; i < 6; i++) { int intervalAverage = tenSecs[i] / 10; Serial.println("Interval " + String(i + 1) + "," + String(intervalAverage)); } int average = totalSum / sampleCount; Serial.println("Highest Value: " + String(highest)); Serial.println("Lowest Value: " + String(lowest)); Serial.println("Overall Average: " + String(average)); }