This question already has an answer here:

I have a nice sketch running which monitors a few things and displays output on an OLED display. Now I want to save the data to an SD card, but with or without the card module attached I'm getting constant reboots when I add 1 single line of code:

#include <SD.h>

Any idea what may be happening?

marked as duplicate by Juraj, VE7JRO, Greenonline, Dave X, MichaelT Apr 24 at 15:19

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 2
    Uno? you run out of SRAM. what is the memory usage report before Upload? – Juraj Apr 15 at 11:54
  • 1
    On an Uno or similar small board just including the SD library consumes a quarter of your memory. – Majenko Apr 15 at 11:58
  • Yep that's it, far out :) I'm also running an SSD1306 display. TIme to optimise. Thanks – Stephen York Apr 15 at 12:23
  • 1
    Ah. Common situation. There's loads of questions here about "SSD1306 and SD unable to allocate buffer" – Majenko Apr 15 at 12:48
  • There is a "text only" SSD1306 library somewhere that doesn't need an internal buffer to save memory. Can't do graphics, of course... – Majenko Apr 15 at 12:49

The following libraries are probably used:

  • SD Card, using a buffer of 512 bytes (see also the comment of DataFiddler below).
  • SSD1306 OLED library, using a buffer of 1,024 bytes
  • Serial, using a buffer of 128 bytes (64 for RX, 64 for TX, see comment of Majenko below)

Since there is only 2,048 bytes of SRAM in an Arduino, this leaves 384 bytes. If you actually READ a file you are already above the maximum.

Your own global variables also will consume a considerable amount of SRAM.

Than, if you execute your sketch, parameters and local variables are stored on the stack (in SRAM), so even if your program starts well, it might/will run in problems when calling functions.

  • 1
    Don't forget 128 bytes for Serial (64 TX, 64 RX) if Serial is being used... – Majenko Apr 15 at 14:32
  • @Majenko Thanks ... I updated my answer. – Michel Keijzers Apr 15 at 14:41
  • 1
    SD needs 512 bytes for the directory structure, and another 512 bytes later, when it opens a file. – DataFiddler Apr 15 at 15:22
  • 1
    Ta. I've been doing a lot of reading around memory usage and restructured a little to reduce the number and length of string literals. What I find surprising is that the Uno only has 2k but the Nano has 8k. That's a little counter intuitive. Unfortunately my brand new Nano has a broken Micro SD port and overloads my PC and bus shuts down. Gotta get a replacement under warranty so I can finish this project off. Will still optimise the code though. – Stephen York Apr 16 at 5:51
  • 1
    What was really doing my head in about it is I'm using Visual Micro add for Visual Studio to do my coding and it's not as obvious about the warnings. I switched to Arduino IDE and the warnings were far more obvious. – Stephen York Apr 16 at 5:53

Not the answer you're looking for? Browse other questions tagged or ask your own question.