Skip to main content

MicroSD basics

The built-in microSD card slot on Inkplate 13SPECTRA can be a great asset for your project. It can store a very large number of high-quality image files to be displayed, and it can also read and write data between deep sleep cycles. This page contains basic examples that will help you quickly get started with using the built-in microSD card slot.

ℹ️
Inkplate 13SPECTRA uses the SdFat library
⚠️
All supported card formats are: FAT16, FAT32, exFAT
⚠️
All supported card types are: SD, SDHC and SDXC

Preparing the microSD card before usage

For best results, use the official SD card formatter to format the card to FAT32 before usage.

Official SD card formatter
The official SD Card formatter

Initializing

Before the microSD card can be used in code, it must first be initialized. This powers on the microSD card circuitry and performs all the necessary memory allocations. In this code snippet, the microSD card is initialized and the result of the initialization is checked:

#include "Inkplate.h" // Include the Inkplate library in the sketch
Inkplate display; // Create an object of the Inkplate library
SdFile file; // Create SdFile object used for accessing files on the SD card

void setup()
{
Serial.begin(115200); // Initialize serial communication
display.begin(); // Initialize the Inkplate library (you should call this function ONLY ONCE)

// Initialize SD card. Display if the SD card is initialized properly or not.
if (display.sdCardInit())
{
Serial.println("SD Card ok!");
}
else
{ // If card initialization was not successful, display an error on the screen, put the SD card in sleep mode, and stop the program
// (using an infinite loop)
Serial.println("SD Card error!");
display.sdCardSleep();
while (true)
;
}
}
void loop(){
// Nothing...
}

Initializes the SD card through SPI.

Returns value: Returns true if the initialization was successful, otherwise returns false.


Reading and writing

Place a sample text.txt file on the microSD card and write something in it. This code snippet will read the file and print its contents to the e-Paper display:

#include "Inkplate.h" //Include Inkplate library to the sketch
Inkplate display; // Create an object on Inkplate library
SdFile file; // Create SdFile object used for accessing files on SD card

void setup()
{
display.begin(); // Init Inkplate library (you should call this function ONLY ONCE)
display.clearDisplay(); // Clear frame buffer of display
display.display(); // Put clear image on display
display.setCursor(0, 0);
display.setTextColor(INKPLATE_BLACK);
display.setTextSize(2);
// Init SD card. Display if SD card is init propery or not.
if (display.sdCardInit())
{
display.println("SD Card ok! Reading data...");
display.display();

// Try to load text with max lenght of 200 chars.
if (!file.open("/text.txt", O_RDONLY))
{ // If it fails to open, send error message to display, otherwise read the file.
display.println("File open error");
display.display();
}
else
{
display.clearDisplay(); // Clear everything that is stored in frame buffer of epaper
display.setCursor(0, 0); // Set print position at the begining of the screen
char text[3001]; // Array where data from SD card is stored (max 200 chars here)
int len = file.fileSize(); // Read how big is file that we are opening
if (len > 3000)
len = 3000; // If it's more than 200 bytes (200 chars), limit to max 200 bytes
file.read(text, len); // Read data from file and save it in text array
text[len] = 0; // Put null terminating char at the and of data
display.print(text); // Print data/text
display.sdCardSleep(); // Put sd card in sleep mode
display.display(); // Do a full refresh of display
}
}
else
{ // If card init was not successful, display error on screen, put sd card in sleep mode, and stop the program
// (using infinite loop)
display.println("SD Card error!");
display.display();
display.sdCardSleep();
while (true)
;
}
}

void loop()
{
// Nothing...
}
Example output displayed on e-paper display
Example output displayed on e-paper display

file.open()

Opens a file in the current working directory.

Returns value: Returns true if opening is successful, otherwise returns false.

Function parameters:

TypeNameDescription
const char *pathThe path to the file which is being opened; if it's in the root folder, just write the filename.
oflag_toflagThe settings for opening the file. The different flags have to be OR'd, e.g., O_CREAT | O_RDWR. Below is a table of these flags and what they mean.
FlagHex ValueDescription
O_RDONLY0x00Open for reading only.
O_WRONLY0x01Open for writing only.
O_RDWR0x02Open for reading and writing.
O_AT_END0x04Open at the end-of-file (EOF).
O_APPEND0x08Set append mode (writes are added to EOF).
O_CREAT0x10Create the file if it does not exist.
O_TRUNC0x20Truncate the file to zero length.
O_EXCL0x40Fail if the file already exists.
O_SYNC0x80Synchronized write I/O operations.

file.fileSize()

Returns the total number of bytes in a file.

Returns type: uint32_t

file.read()

Reads data from the file into the provided buffer. The function attempts to read up to a given number of bytes starting from the current file pointer.

Returns value: Returns the number of bytes read, or -1 if an error occurs.

Function parameters:

TypeNameDescription
void *bufA pointer to the buffer where the read file data will be stored.
size_tcountThe maximum number of bytes to read from the file.
ℹ️
In the above-mentioned functions, the file pointer acts as a marker where you continue reading the file from, so subsequent calls to file.print() will continue from where you left off.
ℹ️
Using this method, it's possible to write to a .csv file, making it easy to store a table or log of events!

[LINK PLACEHOLDER - 13spectra txt read example]

[LINK PLACEHOLDER - 13spectra txt write example]