119 lines
3.7 KiB
C++
119 lines
3.7 KiB
C++
/*
|
|
Non-blocking Write
|
|
|
|
This example demonstrates how to perform non-blocking writes
|
|
to a file on a SD card. The file will contain the current millis()
|
|
value every 10ms. If the SD card is busy, the data will be dataBuffered
|
|
in order to not block the sketch.
|
|
|
|
If data is successfully written, the built in LED will flash. After a few
|
|
seconds, check the card for a file called datalog.txt
|
|
|
|
NOTE: myFile.availableForWrite() will automatically sync the
|
|
file contents as needed. You may lose some unsynced data
|
|
still if myFile.sync() or myFile.close() is not called.
|
|
|
|
Pin numbers reflect the default SPI pins for Uno and Nano models
|
|
Updated for clarity and uniformity with other examples
|
|
|
|
The circuit:
|
|
analog sensors on analog ins 0, 1, and 2
|
|
SD card attached to SPI bus as follows:
|
|
** SDO - pin 11
|
|
** SDI - pin 12
|
|
** CLK - pin 13
|
|
** CS - depends on your SD card shield or module.
|
|
Pin 10 used here for consistency with other Arduino examples
|
|
(for MKR Zero SD: SDCARD_SS_PIN)
|
|
|
|
modified 24 July 2020
|
|
by Tom Igoe
|
|
|
|
This example code is in the public domain.
|
|
*/
|
|
#include <SD.h>
|
|
|
|
const int chipSelect = 10;
|
|
|
|
// file name to use for writing
|
|
const char filename[] = "datalog.txt";
|
|
|
|
// File object to represent file
|
|
File myFile;
|
|
// string to buffer output
|
|
String dataBuffer;
|
|
// last time data was written to card:
|
|
unsigned long lastMillis = 0;
|
|
|
|
void setup() {
|
|
// Open serial communications and wait for port to open:
|
|
Serial.begin(9600);
|
|
// reserve 1 kB for String used as a dataBuffer
|
|
dataBuffer.reserve(1024);
|
|
|
|
// set LED pin to output, used to blink when writing
|
|
pinMode(LED_BUILTIN, OUTPUT);
|
|
|
|
// wait for Serial Monitor to connect. Needed for native USB port boards only:
|
|
while (!Serial);
|
|
|
|
Serial.print("Initializing SD card...");
|
|
|
|
if (!SD.begin(chipSelect)) {
|
|
Serial.println("initialization failed. Things to check:");
|
|
Serial.println("1. is a card inserted?");
|
|
Serial.println("2. is your wiring correct?");
|
|
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
|
|
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
|
|
while (true);
|
|
}
|
|
|
|
Serial.println("initialization done.");
|
|
|
|
// If you want to start from an empty file,
|
|
// uncomment the next line:
|
|
// SD.remove(filename);
|
|
// try to open the file for writing
|
|
|
|
myFile = SD.open(filename, FILE_WRITE);
|
|
if (!myFile) {
|
|
Serial.print("error opening ");
|
|
Serial.println(filename);
|
|
while (true);
|
|
}
|
|
|
|
// add some new lines to start
|
|
myFile.println();
|
|
myFile.println("Hello World!");
|
|
Serial.println("Starting to write to file...");
|
|
}
|
|
|
|
void loop() {
|
|
// check if it's been over 10 ms since the last line added
|
|
unsigned long now = millis();
|
|
if ((now - lastMillis) >= 10) {
|
|
// add a new line to the dataBuffer
|
|
dataBuffer += "Hello ";
|
|
dataBuffer += now;
|
|
dataBuffer += "\r\n";
|
|
// print the buffer length. This will change depending on when
|
|
// data is actually written to the SD card file:
|
|
Serial.print("Unsaved data buffer length (in bytes): ");
|
|
Serial.println(dataBuffer.length());
|
|
// note the time that the last line was added to the string
|
|
lastMillis = now;
|
|
}
|
|
|
|
// check if the SD card is available to write data without blocking
|
|
// and if the dataBuffered data is enough for the full chunk size
|
|
unsigned int chunkSize = myFile.availableForWrite();
|
|
if (chunkSize && dataBuffer.length() >= chunkSize) {
|
|
// write to file and blink LED
|
|
digitalWrite(LED_BUILTIN, HIGH);
|
|
myFile.write(dataBuffer.c_str(), chunkSize);
|
|
digitalWrite(LED_BUILTIN, LOW);
|
|
// remove written data from dataBuffer
|
|
dataBuffer.remove(0, chunkSize);
|
|
}
|
|
}
|