Board not supported error despite having esp package 1.0.6?

Hi all, I hope you can help me. I am using an ESP32 in the Arduino IDE 2.0.3. I was running code for DHT22 and BMP280 successfully, but when I tried including SD.h it failed. So I started trying the examples (SD_Test) from the esp32 package, but it keeps giving the error #error Architecture or board not supported.
The full Error message is:
In file included from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/Sd2Card.h:26:0,
from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/SdFat.h:29,
from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/SD.h:20,
from C:\Users\patri\AppData\Local\Temp.arduinoIDE-unsaved202312-9180-1inoje4.nqvx\SD_Test\SD_Test.ino:16:
C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/Sd2PinMap.h:524:2: error: #error Architecture or board not supported.
#error Architecture or board not supported.
^
Multiple libraries were found for "SD.h"
Used: C:\Users\patri\AppData\Local\Arduino15\libraries\SD
Not used: C:\Users\patri\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\SD
exit status 1

Compilation error: exit status 1
I appreciate any help. Thank you all and have a nice day!

Please post the full sketch that causes the error, using code tags when you do

/*
 * Connect the SD card to the following pins:
 *
 * SD Card | ESP32
 *    D2       -
 *    D3       SS
 *    CMD      MOSI
 *    VSS      GND
 *    VDD      3.3V
 *    CLK      SCK
 *    VSS      GND
 *    D0       MISO
 *    D1       -
 */
#include "FS.h"
#include "SD.h"
#include "SPI.h"

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("Failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println("Not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("  SIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

void createDir(fs::FS &fs, const char * path){
    Serial.printf("Creating Dir: %s\n", path);
    if(fs.mkdir(path)){
        Serial.println("Dir created");
    } else {
        Serial.println("mkdir failed");
    }
}

void removeDir(fs::FS &fs, const char * path){
    Serial.printf("Removing Dir: %s\n", path);
    if(fs.rmdir(path)){
        Serial.println("Dir removed");
    } else {
        Serial.println("rmdir failed");
    }
}

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\n", path);

    File file = fs.open(path);
    if(!file){
        Serial.println("Failed to open file for reading");
        return;
    }

    Serial.print("Read from file: ");
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("Failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("File written");
    } else {
        Serial.println("Write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("Failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("Message appended");
    } else {
        Serial.println("Append failed");
    }
    file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("File renamed");
    } else {
        Serial.println("Rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\n", path);
    if(fs.remove(path)){
        Serial.println("File deleted");
    } else {
        Serial.println("Delete failed");
    }
}

void testFileIO(fs::FS &fs, const char * path){
    File file = fs.open(path);
    static uint8_t buf[512];
    size_t len = 0;
    uint32_t start = millis();
    uint32_t end = start;
    if(file){
        len = file.size();
        size_t flen = len;
        start = millis();
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            len -= toRead;
        }
        end = millis() - start;
        Serial.printf("%u bytes read for %u ms\n", flen, end);
        file.close();
    } else {
        Serial.println("Failed to open file for reading");
    }


    file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("Failed to open file for writing");
        return;
    }

    size_t i;
    start = millis();
    for(i=0; i<2048; i++){
        file.write(buf, 512);
    }
    end = millis() - start;
    Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
    file.close();
}

void setup(){
    Serial.begin(115200);
    if(!SD.begin()){
        Serial.println("Card Mount Failed");
        return;
    }
    uint8_t cardType = SD.cardType();

    if(cardType == CARD_NONE){
        Serial.println("No SD card attached");
        return;
    }

    Serial.print("SD Card Type: ");
    if(cardType == CARD_MMC){
        Serial.println("MMC");
    } else if(cardType == CARD_SD){
        Serial.println("SDSC");
    } else if(cardType == CARD_SDHC){
        Serial.println("SDHC");
    } else {
        Serial.println("UNKNOWN");
    }

    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    Serial.printf("SD Card Size: %lluMB\n", cardSize);

    listDir(SD, "/", 0);
    createDir(SD, "/mydir");
    listDir(SD, "/", 0);
    removeDir(SD, "/mydir");
    listDir(SD, "/", 2);
    writeFile(SD, "/hello.txt", "Hello ");
    appendFile(SD, "/hello.txt", "World!\n");
    readFile(SD, "/hello.txt");
    deleteFile(SD, "/foo.txt");
    renameFile(SD, "/hello.txt", "/foo.txt");
    readFile(SD, "/foo.txt");
    testFileIO(SD, "/test.txt");
    Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
    Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}

void loop(){

}

Error:

In file included from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/Sd2Card.h:26:0,
from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/SdFat.h:29,
from C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/SD.h:20,
from C:\Users\patri\AppData\Local\Temp.arduinoIDE-unsaved202312-9180-19mdl99.l7d1f\SD_Test\SD_Test.ino:16:
C:\Users\patri\AppData\Local\Arduino15\libraries\SD\src/utility/Sd2PinMap.h:524:2: error: #error Architecture or board not supported.
#error Architecture or board not supported.
^
Multiple libraries were found for "SD.h"
Used: C:\Users\patri\AppData\Local\Arduino15\libraries\SD
Not used: C:\Users\patri\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\SD
exit status 1

Compilation error: exit status 1

I was able to compile for both esp32 dev module and esp32 wrover kit board AND I noticed that like your setup, I too have 2 SD libraries installed. One is in my esp32 directory:

~/.arduino15/packages/esp32/hardware/esp32/2.0.6/libraries/SD

and the other here:
~/.arduino15/libraries/SD/

And I've tried both examples, ie one from the default Sketch examples and the other from the esp32 SD/examples directory. odd indeed.

1 Like

For some reason the IDE is selecting the Arduino SD library and not the ESP32 SD library. Then it complains that the Arduino SD library won't run on an ESP32.

I think at least part of the problem is that the library.properties file in the Arduino SD library contains the line:
architectures=*
That means it will run on any Arduino architecture... but it won't. Lazy programming.

A sure-fire solution is to create a duplicate of the ESP32 SD library but give it a new name, like ESP32SD. You will have to change the names SD.h and SD.cpp.

Thank you for that. What if I deleted the original Arduino libraries? I am not going to use an Arduino anyways.

Deleting C:\Users\patri\AppData\Local\Arduino15\libraries\SD should work.

Thank you for your help John, I deleted the SD library in the said location and everything works fine

The reason the wrong SD library was selected is because of a problem in the ESP32 platform's variant of the SD library. That problem was fixed two years ago, but you are using a very outdated version of the ESP32 boards platform @de_botaniker1 so the version you are using doesn't have that fix:

If there is a specific reason you are using ESP32 boards platform version 1.0.6, that is fine because you already found a workaround, but many people are still using that version without being aware that newer versions are available due to a misconfiguration. Some years ago, Espressif changed the URL of the "Additional Boards Manager URL" you add to the Arduino IDE to install and update the ESP32 platform. The old URL still works, but they don't maintain it anymore so it only gives you the outdate 1.0.6 version of the platform. The solution is to change your preferences to use the new URL.

I'll provide instructions in case it will be helpful to you:

  1. Select File > Preferences from the Arduino IDE menus.
    The "Preferences" dialog will open.
  2. Click the icon on the right side of the "Additional Boards Manager URLs" field.
    An "Additional Boards Manager URLs" dialog will open. The field contains a list of any URLs you already configured.
  3. If the following URL is present on the list, delete it:
    https://dl.espressif.com/dl/package_esp32_index.json
    
    This is the old URL which Espressif no longer maintains so it doesn't provide the new versions of the platform.
  4. Add the following URL on a new line in the field:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    
  5. Click the OK button on the "Additional Boards Manager URLs" dialog.
  6. Click the OK button on the "Preferences" dialog.
  7. You will now see a "Downloading index: ..." notification at the bottom right corner of the IDE window. Wait for that notification to close.
  8. Select Tools > Board > Boards Manager from the Arduino IDE menus to open the "Boards Manager".
  9. Scroll down through the list of boards platforms until you see the "esp32 by Espressif Systems" entry.
  10. Make sure version 2.0.6 is selected from the version menu at the bottom of the entry.
  11. Click the "INSTALL" button.
  12. Wait for the installation to finish.

Thank you so much! Thats the solution I was looking for. I read so many articles and I never found a hint that that URL could be outdated. Also I tried to update my package, but ofc it was the latest one of that version. Thank you so much, I was going crazy!

the latest esp32 libraries are v2.0.6 so 1.0.6 is VERY old. I would go to the library manager and update the esp32 package.

You are welcome. I'm glad if I was able to be of assistance.

Regards,
Per

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.