arduino stuffs
Diffstat (limited to 'libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino')
| -rw-r--r-- | libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino b/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino new file mode 100644 index 0000000..29d8ec6 --- /dev/null +++ b/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino @@ -0,0 +1,91 @@ +/* + 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 buffered + in order to not block the sketch. + + 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. + + The circuit: + - Arduino MKR Zero board + - micro SD card attached + + This example code is in the public domain. +*/ + +#include <SD.h> + +// file name to use for writing +const char filename[] = "demo.txt"; + +// File object to represent file +File txtFile; + +// string to buffer output +String buffer; + +unsigned long lastMillis = 0; + +void setup() { + Serial.begin(9600); + while (!Serial); + + // reserve 1kB for String used as a buffer + buffer.reserve(1024); + + // set LED pin to output, used to blink when writing + pinMode(LED_BUILTIN, OUTPUT); + + // init the SD card + if (!SD.begin()) { + Serial.println("Card failed, or not present"); + // don't do anything more: + while (1); + } + + // If you want to start from an empty file, + // uncomment the next line: + // SD.remove(filename); + + // try to open the file for writing + txtFile = SD.open(filename, FILE_WRITE); + if (!txtFile) { + Serial.print("error opening "); + Serial.println(filename); + while (1); + } + + // add some new lines to start + txtFile.println(); + txtFile.println("Hello World!"); +} + +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 buffer + buffer += "Hello "; + buffer += now; + buffer += "\r\n"; + + lastMillis = now; + } + + // check if the SD card is available to write data without blocking + // and if the buffered data is enough for the full chunk size + unsigned int chunkSize = txtFile.availableForWrite(); + if (chunkSize && buffer.length() >= chunkSize) { + // write to file and blink LED + digitalWrite(LED_BUILTIN, HIGH); + txtFile.write(buffer.c_str(), chunkSize); + digitalWrite(LED_BUILTIN, LOW); + + // remove written data from buffer + buffer.remove(0, chunkSize); + } +} |