/**
 * @file display.ino
 * @author SeanKwok (shaoxiang@m5stack.com)
 * @brief M5CoreS3 Display Test
 * @version 0.1
 * @date 2023-12-18
 *
 *
 * @Hardwares: M5CoreS3
 * @Platform Version: Arduino M5Stack Board Manager v2.0.7
 * @Dependent Library:
 * M5GFX: https://github.com/m5stack/M5GFX
 * M5Unified: https://github.com/m5stack/M5Unified
 * M5CoreS3: https://github.com/m5stack/M5CoreS3
 */
#include "M5CoreS3.h"
#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);

// Configure the name and password of the connected wifi and your MQTT Serve
// host.  配置所连接wifi的名称、密码以及你MQTT服务器域名
const char* ssid        = "lemon_2.4";
const char* password    = "shengaqiao";
const char* mqtt_server = "192.168.50.233";

unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

// 新增:记录上次重启的时间
unsigned long lastRebootTime = 0;

// 记录上次收到 MQTT 消息的时间
unsigned long lastMQTTMsgTime = 0;
//用来做显示格式化的一个数组
char TXXX[50];
//记录闪一次温度的一个值,用来解决屏闪问题的
int lastTemperature = 0;

void setupWifi();
void callback(char* topic, byte* payload, unsigned int length);
void reConnect();

void setup() {
    auto cfg = M5.config();
    CoreS3.begin(cfg);
    setupWifi();
    client.setServer(mqtt_server,1883);  // Sets the server details.  配置所连接的服务器
    client.setCallback(callback);  // Sets the message callback function.  设置消息回调函数

    // 初始化上次重启时间
    lastRebootTime = millis();
}

void loop() {
    if (!client.connected()) {
        reConnect();
    }
    client.loop();  // This function is called periodically to allow clients to
                    // process incoming messages and maintain connections to the
                    // server.
    // 定期调用此函数,以允许主机处理传入消息并保持与服务器的连接

    unsigned long now = millis();  // Obtain the host startup duration.  获取主机开机时长
    if (now - lastMsg > 2000) {
        lastMsg = now;
        ++value;
    }

    // 如果 1 分钟内没有收到 MQTT 消息,则休眠
    if (now - lastMQTTMsgTime > 60000) {
        // 在此处添加休眠的相关代码
        Serial.println("Going to sleep due to no MQTT messages for 1 minutes.");
        // 在此处调用相关的关机函数或执行关机操作
        M5.Display.sleep();
    }

    // 新增:每 1 小时(3600000 毫秒)重启设备
    if (now - lastRebootTime > 3600000 ) {
        ESP.restart();
    }
}

void setupWifi() {
    delay(10);
    CoreS3.Lcd.print("Connecting to Network...");
    Serial.printf("Connecting to %s", ssid);
    WiFi.mode(WIFI_STA);  // Set the mode to WiFi station mode.  设置模式为WIFI站模式
    WiFi.begin(ssid, password);  // Start Wifi connection.  开始wifi连接

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.printf("\nSuccess\n");
    CoreS3.Lcd.println("Success");
    CoreS3.Lcd.println("For communication information see serial port");
    CoreS3.Lcd.fillScreen(BLACK);  // Set BLACK to the background color.  将黑色设置为底色
}

void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    // 将 payload 转换为整数
    int payloadValue = atoi((const char*)payload);

    //如果新的值与老的值不等于,才需要去更新
    if(payloadValue != lastTemperature){
            
            //先用黑色的字体把上一次的温度数值直接擦写掉
            CoreS3.Lcd.setRotation(1);
            CoreS3.Lcd.setCursor(40, 40);
            CoreS3.Lcd.setTextColor(BLACK);
            CoreS3.Lcd.setTextSize(20);
            sprintf(TXXX,"%02d",lastTemperature);
            CoreS3.Lcd.print(TXXX);
            //将最新的值赋给lastTemperature
            lastTemperature = payloadValue;

            M5.Display.wakeup();
            CoreS3.Lcd.setRotation(1);
            //CoreS3.Lcd.fillScreen(BLACK);  // Set BLACK to the background color.  将黑色设置为底色
            CoreS3.Lcd.setCursor(40, 40);
            // 根据 payload 值设置字体颜色
            if (payloadValue < 50) {
                CoreS3.Lcd.setTextColor(GREEN);  // 设置为绿色
            } else if (payloadValue >= 50 && payloadValue < 70) {
                CoreS3.Lcd.setTextColor(YELLOW);  // 设置为黄色
            } else {
                CoreS3.Lcd.setTextColor(RED);  // 设置为绿色
            }
            CoreS3.Lcd.setTextSize(20);  // Set the font size to 2.  设置字体大小为2
            sprintf(TXXX,"%02d",payloadValue); //  XX
            Serial.print(payloadValue);
            CoreS3.Lcd.print(TXXX);
            Serial.println();
    }

    // 收到回调时更新时间
    lastMQTTMsgTime = millis();
}

void reConnect() {
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Create a random client ID.  创建一个随机的客户端ID
        String clientId = "M5Stack-";
        clientId += String(random(0xffff), HEX);
        // Attempt to connect.  尝试重新连接
        if (client.connect(clientId.c_str())) {
            Serial.println("connected");
            // ... and resubscribe.  重新订阅话题
            client.subscribe("lemon_gpu_temp");
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println("try again in 5 seconds");
            delay(5000);
        }
    }
}

用以上MQTT作为一个起手式的模板

/**
 * @file sdcard.ino
 * @author SeanKwok (shaoxiang@m5stack.com)
 * @brief M5CoreS3 MicroSD Card Test
 * @version 0.1
 * @date 2023-12-25
 *
 *
 * @Hardwares: M5CoreS3
 * @Platform Version: Arduino M5Stack Board Manager v2.0.9
 * @Dependent Library:
 * M5GFX: https://github.com/m5stack/M5GFX
 * M5Unified: https://github.com/m5stack/M5Unified
 * M5CoreS3: https://github.com/m5stack/M5CoreS3
 */

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

#define SD_SPI_SCK_PIN  36
#define SD_SPI_MISO_PIN 35
#define SD_SPI_MOSI_PIN 37
#define SD_SPI_CS_PIN   4

void listDir(fs::FS &fs, const char *dirname, uint8_t levels);
void createDir(fs::FS &fs, const char *path);
void removeDir(fs::FS &fs, const char *path);
void readFile(fs::FS &fs, const char *path);
void writeFile(fs::FS &fs, const char *path, const char *message);
void appendFile(fs::FS &fs, const char *path, const char *message);
void renameFile(fs::FS &fs, const char *path1, const char *path2);
void deleteFile(fs::FS &fs, const char *path);
void testFileIO(fs::FS &fs, const char *path);

M5Canvas canvas(&CoreS3.Display);

void printf_log(const char *format, ...);
void println_log(const char *str);

void setup() {
    CoreS3.begin();
    Serial.begin(115200);
    println_log("\nHello From SD card demo program");

    canvas.setColorDepth(1);  // mono color
    canvas.createSprite(CoreS3.Display.width(), CoreS3.Display.height());
    canvas.setPaletteColor(1, GREEN);
    canvas.setTextSize((float)canvas.width() / 160);
    canvas.setTextScroll(true);

    // SD Card Initialization
    SPI.begin(SD_SPI_SCK_PIN, SD_SPI_MISO_PIN, SD_SPI_MOSI_PIN, SD_SPI_CS_PIN);

    if (!SD.begin(SD_SPI_CS_PIN, SPI, 25000000)) {
        // Print a message if the SD card initialization
        // fails orif the SD card does not exist.
        // 如果SD卡初始化失败或者SD卡不存在,则打印消息.
        println_log("Card failed, or not present");
        while (1)
            ;
    }

    uint8_t cardType = SD.cardType();

    if (cardType == CARD_NONE) {
        println_log("No SD card attached");
        return;
    }

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

    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    printf_log("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");
    printf_log("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
    printf_log("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
void loop() {
}

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

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

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

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

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

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

    File file = fs.open(path);
    if (!file) {
        println_log("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) {
    printf_log("Writing file: %s\n", path);

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

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

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

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

void deleteFile(fs::FS &fs, const char *path) {
    printf_log("Deleting file: %s\n", path);
    if (fs.remove(path)) {
        println_log("File deleted");
    } else {
        println_log("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;
        printf_log("%u bytes read for %lu ms\n", flen, end);
        file.close();
    } else {
        println_log("Failed to open file for reading");
    }

    file = fs.open(path, FILE_WRITE);
    if (!file) {
        println_log("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;
    printf_log("%u bytes written for %lu ms\n", 2048 * 512, end);
    file.close();
}

void printf_log(const char *format, ...) {
    char buf[256];
    va_list args;
    va_start(args, format);
    vsnprintf(buf, 256, format, args);
    va_end(args);
    Serial.print(buf);
    canvas.printf(buf);
    canvas.pushSprite(0, 0);
}

void println_log(const char *str) {
    Serial.println(str);
    canvas.println(str);
    canvas.pushSprite(0, 0);
}

看了一下这个是去年年底的例子,应该可以的

看了一下和图形化的init的参数对的上的

但是就是这个IDE太不给力了

慢的要死

又是一个看不懂的报错

之前其实遇到过这个报错的

原因就是端口被占用了

然后记得需要长按REST键(方块下方有个小的循环的标志的哪个按钮),内部绿色LED灯亮起的时候就进入了烧录模式

这时候再来

这次上传就OK了

还有一件事就是

它不会自动重启M5,而需要手动按下reset的开关才可以

    Serial.begin(115200);
    Serial.print("Hello From SD card demo program");

串口打印的问题,记得需要先设置好波特率,否则根本跟不到任何输出

起码能看到正确的输出了对吧

SD的类型是SDHC,鬼知道是啥

接着是打开listDir函数,看看SD卡上的文件它是否能列齐全

OK,没有问题

接下来是打开文件并显示

不行,这个插件根本就运行不起来,没法配置板子和库

 https://github.com/m5stack/M5GFX/blob/master/examples/Basic/drawImageData/drawImageData.ino 

接着我们看一下M5GFX库咋干的

#include <Arduino.h>
#include <M5GFX.h>
M5GFX display;

void setup()
{


  display.begin();
}

先加入引用和setup

display.drawPngFile(SD, "/Face_1.png", 0, 0);

然后再加一句画PNG文件,齐活儿

记得sd卡要小于16G以及是FAT32哈,上一篇文章里有写的

核心库在这里:

 https://github.com/m5stack/M5CoreS3 

Compiling sketch...
"C:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\tools\\xtensa-esp32s3-elf-gcc\\esp-2021r2-patch5-8.4.0/bin/xtensa-esp32s3-elf-g++" -DHAVE_CONFIG_H "-DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"" -DUNITY_INCLUDE_CONFIG_H -DWITH_POSIX -D_GNU_SOURCE "-DIDF_VER=\"v4.4.6-dirty\"" -DESP_PLATFORM -D_POSIX_READER_WRITER_LOCKS "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/newlib/platform_include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freertos/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freertos/include/esp_additions/freertos" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freertos/port/xtensa/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freertos/include/esp_additions" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hw_support/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hw_support/include/soc" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hw_support/include/soc/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hw_support/port/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hw_support/port/esp32s3/private_include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/heap/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/log/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/lwip/include/apps" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/lwip/include/apps/sntp" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/lwip/lwip/src/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/lwip/port/esp32/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/lwip/port/esp32/include/arch" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/soc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/soc/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/soc/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/hal/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/hal/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/hal/platform_port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_rom/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_rom/include/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_rom/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_system/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_system/port/soc" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_system/port/public_compat" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/xtensa/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/xtensa/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/driver/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/driver/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_pm/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_ringbuf/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/efuse/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/efuse/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/vfs/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_wifi/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_event/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_netif/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_eth/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/tcpip_adapter/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_phy/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_phy/esp32s3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_ipc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/app_trace/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_timer/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/mbedtls/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/mbedtls/mbedtls/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/mbedtls/esp_crt_bundle/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/app_update/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/spi_flash/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bootloader_support/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/nvs_flash/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/pthread/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_gdbstub/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_gdbstub/xtensa" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_gdbstub/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espcoredump/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espcoredump/include/port/xtensa" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/wpa_supplicant/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/wpa_supplicant/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/wpa_supplicant/esp_supplicant/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/ieee802154/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/console" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/asio/asio/asio/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/asio/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/common/osi/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/include/esp32c3/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/common/api/include/api" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/common/btc/profile/esp/blufi/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/common/btc/profile/esp/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/host/bluedroid/api/include/api" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_core" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_core/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_core/storage" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/btc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_models/common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_models/client/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/mesh_models/server/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/api/core/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/api/models/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/bt/esp_ble_mesh/api" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/cbor/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/unity/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/unity/unity/src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/cmock/CMock/src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/coap/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/coap/libcoap/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/nghttp/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/nghttp/nghttp2/lib/includes" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-tls" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-tls/esp-tls-crypto" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_adc_cal/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_hid/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/tcp_transport/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_http_client/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_http_server/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_https_ota/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_https_server/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_lcd/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_lcd/interface" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/protobuf-c/protobuf-c" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/protocomm/include/common" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/protocomm/include/security" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/protocomm/include/transports" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/mdns/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_local_ctrl/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/sdmmc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_serial_slave_link/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_websocket_client/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/expat/expat/expat/lib" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/expat/port/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/wear_levelling/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/fatfs/diskio" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/fatfs/vfs" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/fatfs/src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freemodbus/freemodbus/common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/idf_test/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/idf_test/include/esp32s3" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/jsmn/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/json/cJSON" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/libsodium/libsodium/src/libsodium/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/libsodium/port_include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/mqtt/esp-mqtt/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/openssl/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/perfmon/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/spiffs/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/usb/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/ulp/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/wifi_provisioning/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/rmaker_common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_diagnostics/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/rtc_store/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_insights/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/json_parser/upstream/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/json_parser/upstream" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/json_generator/upstream" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_schedule/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp_secure_cert_mgr/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_rainmaker/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/gpio_button/button/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/qrcode/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/ws2812_led" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/freertos/include/freertos" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/arduino_tinyusb/tinyusb/src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/arduino_tinyusb/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp_littlefs/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/tool" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/typedef" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/image" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/math" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/nn" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/layer" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/detect" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp-dl/include/model_zoo" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp32-camera/driver/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/esp32-camera/conversions/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/dotprod/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/support/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/support/mem/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/hann/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/blackman/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/blackman_harris/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/nuttall/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/windows/flat_top/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/iir/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/fir/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/add/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/sub/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/mul/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/addc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/mulc/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/math/sqrt/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/matrix/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/fft/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/dct/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/conv/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/common/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/kalman/ekf/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/include/fb_gfx/include" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2/tools/sdk/esp32s3/qio_qspi/include" -mlongcalls -ffunction-sections -fdata-sections -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -ggdb -freorder-blocks -Wwrite-strings -fstack-protector -fstrict-volatile-bitfields -Wno-error=unused-but-set-variable -fno-jump-tables -fno-tree-switch-conversion -std=gnu++11 -fexceptions -fno-rtti -MMD -c -w -Os -DF_CPU=240000000L -DARDUINO=10607 -DARDUINO_M5STACK_CORES3 -DARDUINO_ARCH_ESP32 "-DARDUINO_BOARD=\"M5STACK_CORES3\"" "-DARDUINO_VARIANT=\"m5stack_cores3\"" -DARDUINO_PARTITION_app3M_fat9M_16MB -DESP32 -DCORE_DEBUG_LEVEL=0 -DARDUINO_RUNNING_CORE=1 -DARDUINO_EVENT_RUNNING_CORE=1 -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 "@C:\\Users\\lemon\\AppData\\Local\\Temp\\arduino\\sketches\\3E35D0F9798A316FBC70A51C06F0454F/build_opt.h" "@C:\\Users\\lemon\\AppData\\Local\\Temp\\arduino\\sketches\\3E35D0F9798A316FBC70A51C06F0454F/file_opts" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2\\cores\\esp32" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2\\variants\\m5stack_cores3" "-Ie:\\development\\Arduino\\libraries\\M5CoreS3\\src" "-Ie:\\development\\Arduino\\libraries\\M5Unified\\src" "-Ie:\\development\\Arduino\\libraries\\M5GFX\\src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2\\libraries\\SPI\\src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2\\libraries\\SD\\src" "-IC:\\Users\\lemon\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\2.1.2\\libraries\\FS\\src" "C:\\Users\\lemon\\AppData\\Local\\Temp\\arduino\\sketches\\3E35D0F9798A316FBC70A51C06F0454F\\sketch\\sdcard.ino.cpp" -o "C:\\Users\\lemon\\AppData\\Local\\Temp\\arduino\\sketches\\3E35D0F9798A316FBC70A51C06F0454F\\sketch\\sdcard.ino.cpp.o"
In file included from e:\development\Arduino\libraries\M5GFX\src/M5GFX.h:22,
                 from e:\development\Arduino\libraries\M5Unified\src/M5Unified.hpp:19,
                 from e:\development\Arduino\libraries\M5Unified\src/M5Unified.h:5,
                 from e:\development\Arduino\libraries\M5CoreS3\src/M5CoreS3.h:4,
                 from E:\development\Arduino\sdcard\sdcard.ino:17:
e:\development\Arduino\libraries\M5GFX\src/lgfx/v1/LGFXBase.hpp: In instantiation of 'bool lgfx::v1::LGFXBase::drawPngFile(T&, const char*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, float, float, lgfx::v1::datum::datum_t) [with T = fs::SDFS; int32_t = int; lgfx::v1::datum::datum_t = lgfx::v1::textdatum::textdatum_t]':
E:\development\Arduino\sdcard\sdcard.ino:103:48:   required from here
e:\development\Arduino\libraries\M5GFX\src/lgfx/v1/LGFXBase.hpp:949:23: error: cannot declare variable 'file' to be of abstract type 'lgfx::v1::DataWrapperT<fs::SDFS>'
       DataWrapperT<T> file ( &fs ); \
                       ^~~~
e:\development\Arduino\libraries\M5GFX\src/lgfx/v1/LGFXBase.hpp:957:5: note: in expansion of macro 'LGFX_FUNCTION_GENERATOR'
     LGFX_FUNCTION_GENERATOR(drawPng, draw_png)
     ^~~~~~~~~~~~~~~~~~~~~~~
In file included from e:\development\arduino\libraries\m5gfx\src\lgfx\v1\platforms\esp32/common.hpp:20,
                 from e:\development\arduino\libraries\m5gfx\src\lgfx\v1\platforms\common.hpp:22,
                 from e:\development\Arduino\libraries\M5GFX\src/lgfx/v1/platforms/esp32/Bus_SPI.hpp:57,
                 from e:\development\Arduino\libraries\M5GFX\src/lgfx/v1/platforms/device.hpp:48,
                 from e:\development\Arduino\libraries\M5GFX\src/M5GFX.h:19,
                 from e:\development\Arduino\libraries\M5Unified\src/M5Unified.hpp:19,
                 from e:\development\Arduino\libraries\M5Unified\src/M5Unified.h:5,
                 from e:\development\Arduino\libraries\M5CoreS3\src/M5CoreS3.h:4,
                 from E:\development\Arduino\sdcard\sdcard.ino:17:
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:91:10: note:   because the following virtual functions are pure within 'lgfx::v1::DataWrapperT<fs::SDFS>':
   struct DataWrapperT : public DataWrapper {
          ^~~~~~~~~~~~
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:72:17: note: 	'virtual int lgfx::v1::DataWrapper::read(uint8_t*, uint32_t)'
     virtual int read(uint8_t *buf, uint32_t len) = 0;
                 ^~~~
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:74:18: note: 	'virtual void lgfx::v1::DataWrapper::skip(int32_t)'
     virtual void skip(int32_t offset) = 0;
                  ^~~~
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:75:18: note: 	'virtual bool lgfx::v1::DataWrapper::seek(uint32_t)'
     virtual bool seek(uint32_t offset) = 0;
                  ^~~~
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:76:18: note: 	'virtual void lgfx::v1::DataWrapper::close()'
     virtual void close(void) = 0;
                  ^~~~~
e:\development\arduino\libraries\m5gfx\src\lgfx\v1\misc\datawrapper.hpp:77:21: note: 	'virtual int32_t lgfx::v1::DataWrapper::tell()'
     virtual int32_t tell(void) = 0;
                     ^~~~
Multiple libraries were found for "SD.h"
  Used: C:\Users\lemon\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.2\libraries\SD
  Not used: C:\Users\lemon\AppData\Local\Arduino15\libraries\SD
Using library M5CoreS3 at version 1.0.0 in folder: E:\development\Arduino\libraries\M5CoreS3 
Using library M5Unified at version 0.1.17 in folder: E:\development\Arduino\libraries\M5Unified 
Using library M5GFX at version 0.1.17 in folder: E:\development\Arduino\libraries\M5GFX 
Using library SPI at version 2.0.0 in folder: C:\Users\lemon\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.2\libraries\SPI 
Using library SD at version 2.0.0 in folder: C:\Users\lemon\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.2\libraries\SD 
Using library FS at version 2.0.0 in folder: C:\Users\lemon\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.2\libraries\FS 
exit status 1

Compilation error: exit status 1

然后就是编译报错了

 https://github.com/m5stack/M5GFX/issues/79 

我擦,和引入顺序有关系?


/**
 * @file sdcard.ino
 * @author SeanKwok (shaoxiang@m5stack.com)
 * @brief M5CoreS3 MicroSD Card Test
 * @version 0.1
 * @date 2023-12-25
 *
 *
 * @Hardwares: M5CoreS3
 * @Platform Version: Arduino M5Stack Board Manager v2.0.9
 * @Dependent Library:
 * M5GFX: https://github.com/m5stack/M5GFX
 * M5Unified: https://github.com/m5stack/M5Unified
 * M5CoreS3: https://github.com/m5stack/M5CoreS3
 */
#include <SPI.h>
#include <SD.h>
#include <M5CoreS3.h>

#define SD_SPI_SCK_PIN  36
#define SD_SPI_MISO_PIN 35
#define SD_SPI_MOSI_PIN 37
#define SD_SPI_CS_PIN   4

void listDir(fs::FS &fs, const char *dirname, uint8_t levels);
void createDir(fs::FS &fs, const char *path);
void removeDir(fs::FS &fs, const char *path);
void readFile(fs::FS &fs, const char *path);
void writeFile(fs::FS &fs, const char *path, const char *message);
void appendFile(fs::FS &fs, const char *path, const char *message);
void renameFile(fs::FS &fs, const char *path1, const char *path2);
void deleteFile(fs::FS &fs, const char *path);
void testFileIO(fs::FS &fs, const char *path);

M5Canvas canvas(&CoreS3.Display);
M5GFX display = CoreS3.Display;

void printf_log(const char *format, ...);
void println_log(const char *str);

void setup() {
    CoreS3.begin();
    Serial.begin(115200);
    println_log("\nHello From SD card demo program");
    display.begin();

    canvas.setColorDepth(1);  // mono color
    canvas.createSprite(CoreS3.Display.width(), CoreS3.Display.height());
    canvas.setPaletteColor(1, GREEN);
    canvas.setTextSize((float)canvas.width() / 160);
    canvas.setTextScroll(true);

    // SD Card Initialization
    SPI.begin(SD_SPI_SCK_PIN, SD_SPI_MISO_PIN, SD_SPI_MOSI_PIN, SD_SPI_CS_PIN);

    if (!SD.begin(SD_SPI_CS_PIN, SPI, 25000000)) {
        // Print a message if the SD card initialization
        // fails orif the SD card does not exist.
        // 如果SD卡初始化失败或者SD卡不存在,则打印消息.
        println_log("Card failed, or not present");
        while (1)
            ;
    }

    uint8_t cardType = SD.cardType();

    if (cardType == CARD_NONE) {
        println_log("No SD card attached");
        return;
    }

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

    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    printf_log("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");
    printf_log("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
    printf_log("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));

    display.drawPngFile(SD, "/Face_1.png", 0, 0);
}
void loop() {
}

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

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

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

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

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

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

    File file = fs.open(path);
    if (!file) {
        println_log("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) {
    printf_log("Writing file: %s\n", path);

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

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

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

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

void deleteFile(fs::FS &fs, const char *path) {
    printf_log("Deleting file: %s\n", path);
    if (fs.remove(path)) {
        println_log("File deleted");
    } else {
        println_log("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;
        printf_log("%u bytes read for %lu ms\n", flen, end);
        file.close();
    } else {
        println_log("Failed to open file for reading");
    }

    file = fs.open(path, FILE_WRITE);
    if (!file) {
        println_log("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;
    printf_log("%u bytes written for %lu ms\n", 2048 * 512, end);
    file.close();
}

void printf_log(const char *format, ...) {
    char buf[256];
    va_list args;
    va_start(args, format);
    vsnprintf(buf, 256, format, args);
    va_end(args);
    Serial.print(buf);
    canvas.printf(buf);
    canvas.pushSprite(0, 0);
}

void println_log(const char *str) {
    Serial.println(str);
    canvas.println(str);
    canvas.pushSprite(0, 0);
}

卧槽,最终的可运行程序竟然就是这样,朴实无华的一个小技巧啊