First init.
This commit is contained in:
118
libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino
Normal file
118
libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user