#include #include #define ADC_PIN 34 #define ENABLE_PIN 22 #define BLUE_PIN 12 #define GREEN_PIN 14 #define RED_PIN 27 #define DELAY 100 //milliseconds per cycle of loop #define SAVEDELAY 15 * 1000 //number of loops between saves, change first number for seconds #define ERRORDELAY 5 * 1000 //time between error code reset float calibration = 1; int serialPrint = 0; int fileNum = 0; String fileName; File file; void setup() { Serial.begin(115200); pinMode(ADC_PIN, INPUT); pinMode(ENABLE_PIN, INPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); pinMode(RED_PIN, OUTPUT); digitalWrite(RED_PIN, HIGH); digitalWrite(BLUE_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); delay(500); while(digitalRead(ENABLE_PIN) != HIGH);//wait for enable high digitalWrite(BLUE_PIN, LOW); delay(500); if (!SD.begin()) { //MOSI:23, MISO:19, SCLK:18, CS:5 Serial.println("SD card initialization failed."); return; } do { file.close(); fileName = "/" + String(++fileNum) + ".txt"; file = SD.open(fileName, FILE_READ); } while(file.size()); file.close(); SD.remove(fileName); delay(500); file = SD.open(fileName, FILE_WRITE); file.seek(file.size()); if (!file) { Serial.println("Error opening file."); return; } Serial.print("Setup Successful\nSaving data to "); Serial.println(fileName); digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, HIGH); } int len(char *string) { return sizeof(string) / sizeof(string[0]) - 1; } int startsWith(char *string, char *start) { for (int i = 0; i < len(string); i++) { if (string[i] != start[i]) { return 0; } } return 1; } void print(int i = 0, int length = 10) { file.seek(0); while(file.available() && i-- > 0) { //seek to line while(file.available() && file.read() != '\n'); } if(!file.available()) { Serial.println("Value of i inputted is larger than number of measurements taken!"); return; } Serial.print("Position :"); Serial.println(file.position()); char numChar[6]; i = 0; while(file.available() && length > 0) { if (file.peek() == '\n') { String numString = String(numChar); Serial.println(numString.substring(0, 5)); file.read(); strcpy(numChar, ""); i = 0; length--; } else { numChar[i++] = file.read(); } } file.seek(file.size()); Serial.println(file.available()); return; } void dumpFile(int num) { if(num == 0) {num = fileNum;} String name = "/" + String(num) + ".txt"; file.close(); file = SD.open(name, FILE_READ); int i = 0; Serial.print("Start Dump "); Serial.println(file.name()); while(file.available()) { if(file.peek() == '\n') {i++;} char c[2] = {file.read(), '\0'}; Serial.print(c); } Serial.print("File length: "); Serial.println(i); file.close(); file = SD.open(fileName, FILE_WRITE); file.seek(file.size()); return; } void calibrate(float reference) { float volts = analogRead(ADC_PIN) * 3.3 * 5810 / 3810 / pow(2, 12); calibration = reference / volts; file.print("Calibrated"); return; } void stop() { Serial.println("Entering sleep\nPress boot button to restart"); file.close(); digitalWrite(BLUE_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(RED_PIN, HIGH); delay(5000); esp_deep_sleep_start(); } void statistics(int num) { if(num == 0) {num = fileNum;} String name = "/" + String(num) + ".txt"; file.close(); file = SD.open(name, FILE_READ); file.seek(0); float min, max; double sum = 0; unsigned long i = 0; String numString = ""; while (file.available()) { if (file.peek() == '\n') { numString.trim(); float f = numString.toFloat(); sum += f; if(f < min) { min = f; } if(f > max) { max = f; } file.read(); i++; numString = ""; } else { char c[2] = {file.read(), '\0'}; numString.concat(c); } } sum /= i; Serial.print("File length: "); Serial.println(i); float average = (float) sum; file.close(); SD.remove("/stats.txt"); file = SD.open("/stats.txt", FILE_WRITE); file.println(String(min, 3)); file.println(String(max, 3)); file.println(String(average, 3)); Serial.println("min: " + String(min, 3)); Serial.println("max: " + String(max, 3)); Serial.println("average: " + String(average, 3)); file.close(); file = SD.open(fileName, FILE_WRITE); file.seek(file.size()); return; } void serialEvent() { String command = Serial.readStringUntil('\n'); char args[10][10]; int j = 0, k = 0; for (int i = 0; i < command.length(); i++) { if (command.charAt(i) == ' ') { j++; k = 0; } else { args[j][k++] = command.charAt(i); } } if (startsWith(args[0], "print")) { print(String(args[1]).toInt(), String(args[2]).toInt()); } else if (startsWith(args[0], "stop")) { stop(); } else if (startsWith(args[0], "calibrate")) { calibrate(String(args[1]).toFloat()); } else if (startsWith(args[0], "stats")) { statistics(String(args[1]).toInt()); } else if(startsWith(args[0], "dump")) { dumpFile(String(args[1]).toInt()); } else if(startsWith(args[0], "serial")) { serialPrint = String(args[1]).toInt(); } else { Serial.println("Unknown command"); } return; } unsigned long measureTime = millis(); unsigned long saveTime = millis(); unsigned long errorTime = millis(); unsigned long prevFileSize = 0; int fileError = 0; void loop() { if(measureTime - millis() > DELAY) { measureTime = millis(); float volts = analogRead(ADC_PIN) * calibration * 3.3 * 5810 / 3810 / pow(2, 12); //undoes adc, and 5v to 3.3v divider file.println(String(volts, 3)); if(serialPrint) {Serial.println(String(volts, 3));} if(volts <= 0.05 && !fileError) { digitalWrite(BLUE_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); } if(volts >= 4.5 && !fileError) { digitalWrite(BLUE_PIN, HIGH); digitalWrite(GREEN_PIN, HIGH); } } if(saveTime - millis() > SAVEDELAY) { saveTime = millis(); file.close(); file = SD.open(fileName, FILE_WRITE); file.seek(file.size()); if(file && file.size() > prevFileSize) { digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, HIGH); fileError = 0; prevFileSize = file.size(); } else { digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); fileError = 1; } } if(errorTime - millis() > ERRORDELAY) { digitalWrite(BLUE_PIN, LOW); if(!fileError) digitalWrite(GREEN_PIN, HIGH); } if(digitalRead(ENABLE_PIN) == LOW) {stop();} if (Serial.available()) {serialEvent();} }