Compiler errors while trying to program a WeMos D1 R2 for use with an SD Card.

I tried using some working examples of code to program my WeMos D1 R2 board but for some reason the complier throws me an error regarding the SD.h include file. This happens regardless of the sample code I try.

I have selected the WeMos D1 R2 board from the dropdown list of supported boards, using IDE Version 1.6.8 and Version 1.0.5 of the SD(ESP8266)

I’ve searched the net for two days now and haven’t found an answer.

Included is the code I’m trying and the output from the compiler.

Any help with this problem would be greatly appreciated. If you need more info, please ask.




 * Micro SD Shield - Datalogger
 * This example shows how to log data from an analog sensor
 * to an SD card using the SD library.
 * The WeMos Micro SD Shield uses:
 * D5, D6, D7, D8, 3V3 and G
 * The shield uses SPI bus pins:
 * D5 = CLK
 * D6 = MISO
 * D7 = MOSI
 * D8 = CS
 * The WeMos D1 Mini has one analog pin A0.
 * The SD card library uses 8.3 format filenames and is case-insensitive.
 * eg. IMAGE.JPG is the same as image.jpg
 * created  24 Nov 2010
 * modified 9 Apr 2012 by Tom Igoe
 * This example code is in the public domain.

#include <SPI.h>
#include <SD.h>

const int chipSelect = D8;

void setup()
  // Open serial communications and wait for port to open:
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only

  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
  Serial.println("card initialized.");

void loop()
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  //for (int analogPin = 0; analogPin < 3; analogPin++) {
  //  int sensor = analogRead(analogPin);
  //  dataString += String(sensor);
  //  if (analogPin < 2) {
  //    dataString += ",";
  //  }
  // The WeMos D1 Mini only has one analog pin A0.
  int sensor = analogRead(A0);
  dataString += String(sensor);

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile ="datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    // print to the serial port too:
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");



In file included from E:\ARDUINO\SKETCHES\libraries\SD\src/utility/Sd2Card.h:26:0,

                 from E:\ARDUINO\SKETCHES\libraries\SD\src/utility/SdFat.h:29,

                 from E:\ARDUINO\SKETCHES\libraries\SD\src/SD.h:20,

                 from E:\ARDUINO\SKETCHES\WEMOS_SD_Card_Example2\WEMOS_SD_Card_Example2.ino:1:

E:\ARDUINO\SKETCHES\libraries\SD\src/utility/Sd2PinMap.h:510:2: error: #error Architecture or board not supported.

Works perfectly for me on Ubuntu 16.04, Arduino IDE 1.8.1, ESP8266 core 2.3.0, SD 1.0.5:

Multiple libraries were found for "SD.h"
 Used: /home/pieter/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/SD
 Not used: /home/pieter/opt/arduino-1.8.1/libraries/SD
Using library SPI at version 1.0 in folder: /home/pieter/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/SPI 
Using library SD at version 1.0.5 in folder: /home/pieter/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/SD


As it turns out I had to replace the SD.h file with one from

It compiles fine now.

SlowPaddle: As it turns out I had to replace the SD.h file with one from

It compiles fine now.

That shouldn't be necessary. I suspect that it's because you installed an SD library in your SKETCHES/libraries folder. If you delete that library, it'll most likely work. Not sure why you need that library. The Arduino IDE comes with an SD library in C:\Program Files (x86)\Arduino\libraries\SD, and the ESP8266 core includes an SD library for the ESP8266 in C:\Users\Username\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\SD, so having an extra library with the same name in E:\ARDUINO\SKETCHES\libraries\SD will only cause a lot of headaches.


I didn't create the "SKETCHES/libraries" folder. The IDE created it. I actually deleted it once and the folder gets recreated.

Not sure why the program does this.

I also deleted the SD.h in the Sketches library and when I updated the SD.h file it was placed in the SKETCHES/libraries folder.

SKETCHES/libraries is the default installation folder for third party libraries and libraries yourself. You do NOT need a third party SD library, because it's included with the Arduino core. There's different versions: the default library in C:\Program Files (x86)\Arduino\libraries\SD, and there's another one specific for the ESP8266. When you select an ESP8266 board, the Arduino IDE will automatically use the right library.

However, when you install a library in SKETCHES/libraries, it will override the default library, the IDE will always use the one in SKETCHES/libraries. You probably installed an AVR/Arduino-specific version of the SD library. That didn't work, because this library doesn't support the ESP8266. Then you replaced this library by the WeMos SD library, so it worked. However, if you now want to use an SD card with a normal Arduino, it probably won't work, because it will try to use the WeMos version.

The right solution wasn't to replace the SD library in SKETCHES/libraries, but to delete it. Then the Arduino IDE will always automatically select the right one, no matter what board you're using.


Never was sure how that worked.

I've deleted the SKETCHES/libraries folder and the program compiles fine now.

Thank you for the information. It's appreciated.