SD datalogger
This example shows how to log data from three analog sensors
to a storage device such as a microSD card.
This example code is in the public domain.
*/
#include <SD.h>
#include <MTP_Teensy.h>
File dataFile; // Specifies that dataFile is of File type
int record_count = 0;
bool write_data = false;
/////////////////////////////////////////////Setup/////////////////////////
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
// wait for serial port to connect.
}
Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
Serial.print("Initializing SD card ...");
if (!SD.begin(BUILTIN_SDCARD)) {
Serial.println("Error mounting SD card!");
while (1) {
// Error, so don't do anything more - stay stuck here
}
}
MTP.begin();
MTP.addFilesystem(SD, "SD");
Serial.println("SD card initialized.");
menu();
}
/////////////////////////////////////////////main loop//////////////////////
void loop() {
MTP.loop();
if (write_data) {
logData();
}
if (Serial.available()) {
char rr = Serial.read();
switch (rr) {
case 'l':
listFiles();
break;
case 'e':
eraseFiles();
break;
case 's':
Serial.println("\nLogging Data!!!");
write_data = true; // continue writing data until stopped
dataFile = SD.open("datalog.txt", FILE_WRITE);
logData();
break;
case 'x':
stopLogging();
break;
case 'd':
dumpLog();
break;
case '\r':
case '\n':
case 'h':
menu();
break;
}
while (Serial.read() != -1);
}
}
///////////////////////////////////////////////////////////////////////END OF main
void logData() {
// assemble the data to log:
String dataString;
// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) dataString += ",";
}
if (dataFile) {
dataFile.println(dataString);
Serial.println(dataString);
record_count++;
} else {
Serial.println("error opening datalog.txt");
}
delay(100);
}
void stopLogging() {
Serial.println("\nStopped Logging Data!!!");
write_data = false;
dataFile.close();
Serial.printf("Records written = %d\n", record_count);
MTP.reset();
}
void dumpLog() {
Serial.println("\nDumping Log!!!");
dataFile = SD.open("datalog.txt");
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
} else {
Serial.println("error opening datalog.txt");
}
}
void menu() {
Serial.println();
Serial.println("Menu Options:");
Serial.println("\tl - List files on disk");
Serial.println("\te - Erase log file");
Serial.println("\ts - Start Logging data");
Serial.println("\tx - Stop Logging data");
Serial.println("\td - Dump Log");
Serial.println("\th - Menu");
Serial.println();
}
void listFiles() {
Serial.println("\nDirectory\n---------");
printDirectory(SD.open("/"), 0);
}
void eraseFiles() {
if (SD.exists("datalog.txt")) {
SD.remove("datalog.txt");
}
Serial.println("\nLog erased!");
MTP.reset();
}
void printDirectory(File dir, int numSpaces) {
while (true) {
File entry = dir.openNextFile();
if (!entry) break;
for (int i = 0; i < numSpaces; i++) Serial.print(" ");
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numSpaces + 2);
} else {
for (int i = 0; i < (36 - numSpaces - strlen(entry.name())); i++) Serial.print(" ");
Serial.print(" ");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}