#include "FS.h" #include "SD.h" #include "SPI.h" unsigned long setmillis = 0; unsigned long sensemillis = 0; //millis for timing unsigned long tenminmillis = 0; const unsigned long period = 1000; #define sensorpin 36 #define buttonpin 39 //declare sensors int datamessage; char out[10]; int avgten = 0; int scanamount = 0; int maxi = 0; int mini = 100; void writeFile(fs::FS &fs, const char *path, const char *message) { //SD Library Write Serial.printf("Writing file: %s\n", path); File file = fs.open(path, FILE_WRITE); if (!file) { Serial.println("Failed to open file for writing"); return; } if (file.print(message)) { Serial.println("File written"); } else { Serial.println("Write failed"); } file.close(); } void appendFile(fs::FS &fs, const char *path, const char *message) { //Sd Library Append Serial.printf("Appending to file: %s\n", path); File file = fs.open(path, FILE_APPEND); if (!file) { Serial.println("Failed to open file for appending"); return; } if (file.print(message)) { Serial.println("Message appended"); } else { Serial.println("Append failed"); } file.close(); } void readFile(fs::FS &fs, const char *path) { // SD Library Read Serial.printf("Reading file: %s\n", path); File file = fs.open(path); if (!file) { Serial.println("Failed to open file for reading"); return; } Serial.print("Moisture Sensor Data from file: \n"); while (file.available()) { Serial.write(file.read()); } file.close(); } // This function returns the analog soil moisture measurement int readsensor() { delay(10); // Allow power to settle int val = analogRead(sensorpin); //take reading int ratio = val / 41; int percent = 100 - ratio; //convert to percent wvf int finalval = 2 * percent; if (finalval > maxi) { //check low and high values maxi = finalval; } if (finalval < mini) { mini = finalval; } return finalval; // Return analog moisture value } void takedata() { //millis function to take the reading every second if (setmillis - sensemillis >= period) { avgten += readsensor(); sensemillis = millis(); tenminmillis++; } } void average() { //does the average compution for every ten minutes int averageValue = avgten / 600; String averageString = String(averageValue); appendFile(SD, "/readings.txt", averageString.c_str()); appendFile(SD, "/readings.txt", "%"); appendFile(SD, "/readings.txt", "\n"); delay(10); avgten = 0; tenminmillis = 0; } void viewdata() { //if button presss sends data to serial int a = digitalRead(buttonpin); if (a == HIGH) { Serial.print("Highest Reading:"); Serial.print(maxi); Serial.print("% \nLowest Reading:"); Serial.print(mini); Serial.print("%\n"); readFile(SD, "/readings.txt"); delay(100); } return; } void setup() { //sets up serial and sd card Serial.begin(9600); if (!SD.begin()) { Serial.println("Card Mount Failed"); return; } uint8_t cardType = SD.cardType(); if (cardType == CARD_NONE) { Serial.println("No SD card attached"); return; } pinMode(buttonpin, INPUT); } void loop() { //loop runs needed data functions setmillis = millis(); takedata(); if (tenminmillis >= 600) { average(); } viewdata(); }