| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | /* * Simple data logger. */#include <SPI.h>#include "SdFat.h"// SD chip select pin.  Be sure to disable any other SPI devices such as Enet.const uint8_t chipSelect = SS;// Interval between data records in milliseconds.// The interval must be greater than the maximum SD write latency plus the// time to acquire and write data to the SD to avoid overrun errors.// Run the bench example to check the quality of your SD card.const uint32_t SAMPLE_INTERVAL_MS = 1000;// Log file base name.  Must be six characters or less.#define FILE_BASE_NAME "Data"//------------------------------------------------------------------------------// File system object.SdFat sd;// Log file.SdFile file;// Time in micros for next data record.uint32_t logTime;//==============================================================================// User functions.  Edit writeHeader() and logData() for your requirements.const uint8_t ANALOG_COUNT = 4;//------------------------------------------------------------------------------// Write data header.void writeHeader() {  file.print(F("micros"));  for (uint8_t i = 0; i < ANALOG_COUNT; i++) {    file.print(F(",adc"));    file.print(i, DEC);  }  file.println();}//------------------------------------------------------------------------------// Log a data record.void logData() {  uint16_t data[ANALOG_COUNT];  // Read all channels to avoid SD write latency between readings.  for (uint8_t i = 0; i < ANALOG_COUNT; i++) {    data[i] = analogRead(i);  }  // Write data to file.  Start with log time in micros.  file.print(logTime);  // Write ADC data to CSV record.  for (uint8_t i = 0; i < ANALOG_COUNT; i++) {    file.write(',');    file.print(data[i]);  }  file.println();}//==============================================================================// Error messages stored in flash.#define error(msg) sd.errorHalt(F(msg))//------------------------------------------------------------------------------void setup() {  const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;  char fileName[13] = FILE_BASE_NAME "00.csv";  Serial.begin(9600);  // Wait for USB Serial  while (!Serial) {    yield();  }  delay(1000);  Serial.println(F("Type any character to start"));  while (!Serial.available()) {    yield();  }  // Initialize at the highest speed supported by the board that is  // not over 50 MHz. Try a lower speed if SPI errors occur.  if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) {    sd.initErrorHalt();  }  // Find an unused file name.  if (BASE_NAME_SIZE > 6) {    error("FILE_BASE_NAME too long");  }  while (sd.exists(fileName)) {    if (fileName[BASE_NAME_SIZE + 1] != '9') {      fileName[BASE_NAME_SIZE + 1]++;    } else if (fileName[BASE_NAME_SIZE] != '9') {      fileName[BASE_NAME_SIZE + 1] = '0';      fileName[BASE_NAME_SIZE]++;    } else {      error("Can't create file name");    }  }  if (!file.open(fileName, O_WRONLY | O_CREAT | O_EXCL)) {    error("file.open");  }  // Read any Serial data.  do {    delay(10);  } while (Serial.available() && Serial.read() >= 0);  Serial.print(F("Logging to: "));  Serial.println(fileName);  Serial.println(F("Type any character to stop"));  // Write data header.  writeHeader();  // Start on a multiple of the sample interval.  logTime = micros()/(1000UL*SAMPLE_INTERVAL_MS) + 1;  logTime *= 1000UL*SAMPLE_INTERVAL_MS;}//------------------------------------------------------------------------------void loop() {  // Time for next record.  logTime += 1000UL*SAMPLE_INTERVAL_MS;  // Wait for log time.  int32_t diff;  do {    diff = micros() - logTime;  } while (diff < 0);  // Check for data rate too high.  if (diff > 10) {    error("Missed data record");  }  logData();  // Force data to SD and update the directory entry to avoid data loss.  if (!file.sync() || file.getWriteError()) {    error("write error");  }  if (Serial.available()) {    // Close file and stop.    file.close();    Serial.println(F("Done"));    while (true) {}  }}
 |