Skip to content

Instantly share code, notes, and snippets.

@ladyada
Last active December 30, 2025 00:57
Show Gist options
  • Select an option

  • Save ladyada/13efab4022b7358033c7 to your computer and use it in GitHub Desktop.

Select an option

Save ladyada/13efab4022b7358033c7 to your computer and use it in GitHub Desktop.
#include <SPI.h>
#include <SD.h>
// Set the pins used
#define cardSelect 4
File logfile;
// blink out an error code
void error(uint8_t errno) {
while(1) {
uint8_t i;
for (i=0; i<errno; i++) {
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
}
for (i=errno; i<10; i++) {
delay(200);
}
}
}
// This line is not needed if you have Adafruit SAMD board package 1.6.2+
// #define Serial SerialUSB
void setup() {
// connect at 115200 so we can read the GPS fast enough and echo without dropping chars
// also spit it out
Serial.begin(115200);
Serial.println("\r\nAnalog logger test");
pinMode(13, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(cardSelect)) {
Serial.println("Card init. failed!");
error(2);
}
char filename[15];
strcpy(filename, "/ANALOG00.TXT");
for (uint8_t i = 0; i < 100; i++) {
filename[7] = '0' + i/10;
filename[8] = '0' + i%10;
// create if does not exist, do not open existing, write, sync after write
if (! SD.exists(filename)) {
break;
}
}
logfile = SD.open(filename, FILE_WRITE);
if( ! logfile ) {
Serial.print("Couldnt create ");
Serial.println(filename);
error(3);
}
Serial.print("Writing to ");
Serial.println(filename);
pinMode(13, OUTPUT);
pinMode(8, OUTPUT);
Serial.println("Ready!");
}
uint8_t i=0;
void loop() {
digitalWrite(8, HIGH);
logfile.print("A0 = "); logfile.println(analogRead(0));
Serial.print("A0 = "); Serial.println(analogRead(0));
digitalWrite(8, LOW);
delay(100);
}
@ZonkerHarris
Copy link

The sketch still writes incremental filenames, but doesn't write any data to the files.
(I'm using an RTC, would love to be able to write a valid timestamp as well...)
When I add logfile.flush() at the end of my loop, all is well.
I suppose this is the same as putting the Open and Close into the loop, yes?

@0xD0M1M0
Copy link

As per documentation of SD (https://www.arduino.cc/en/Reference/SDCardNotes):

Opening/Closing files
When you use file.write(), it doesn't write to the card until you flush() or close(). Whenever you open a file, be sure to close it to save your data.

The documentation of the "Adafruit Feather M0 Adalogger" needs to be updated, as "https://learn.adafruit.com/adafruit-feather-m0-adalogger/using-the-sd-card" is saying that it writes on the SD-Card once the buffer is full and with this code it will not.

@rpeaston
Copy link

If anyone has been waiting 10 years for this to behave as described in the Adafruit Learn article, just update the loop:

void loop() {
i = i + 1;
digitalWrite(8, HIGH);
logfile.print("A0 = "); logfile.println(analogRead(0));
Serial.print("A0 = "); Serial.println(analogRead(0));
digitalWrite(8, LOW);

if (i >= 50) {
logfile.flush();
i = 0;
}

delay(100);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment