文件系统概述

ESP32支持SPIFFS(SPI Flash File System)和LittleFS两种文件系统,用于在闪存中存储和管理文件。本课程将介绍如何使用这些文件系统来存储网页HTML文件和读写JSON格式的配置文件。

注意: SPIFFS是ESP32默认支持的文件系统,而LittleFS需要额外安装库,但性能更好,特别是在频繁写入场景。

1. 存储网页HTML文件

将网页文件存储在ESP32的文件系统中,可以方便地通过Web服务器提供网页服务。

1.1 准备工作

在Arduino IDE中安装ESP32 Filesystem Uploader插件

创建data文件夹,放入HTML文件

使用插件将文件上传到ESP32闪存

1.2 示例HTML文件

<!DOCTYPE html>
<html>
<head>
    <title>ESP32控制面板</title>
    <style>
        body { font-family: Arial; text-align: center; }
        button { padding: 10px 20px; font-size: 16px; }
    </style>
</head>
<body>
    <h1>ESP32控制面板</h1>
    <button id="ledOn">打开LED</button>
    <button id="ledOff">关闭LED</button>
</body>
</html>

1.3 在代码中读取HTML文件

#include <SPIFFS.h>
#include <WebServer.h>

WebServer server(80);

void setup() {
    Serial.begin(115200);
    
    // 初始化SPIFFS
    if(!SPIFFS.begin(true)){
        Serial.println("SPIFFS初始化失败");
        return;
    }
    
    // 提供HTML文件
    server.on("/", HTTP_GET, [](){
        File file = SPIFFS.open("/index.html", "r");
        if(!file){
            server.send(404, "text/plain", "File not found");
            return;
        }
        server.streamFile(file, "text/html");
        file.close();
    });
    
    server.begin();
}

void loop() {
    server.handleClient();
}

2. 配置文件读写(JSON解析)

JSON是常用的配置文件格式,ESP32可以方便地读写和解析JSON格式的配置文件。

2.1 安装必要的库

// 在Arduino IDE中安装以下库:
// - ArduinoJson (用于JSON解析)
// - LittleFS (如果需要使用LittleFS)

2.2 写入JSON配置文件

#include <SPIFFS.h>
#include <ArduinoJson.h>

void saveConfig() {
    // 创建JSON文档
    StaticJsonDocument<256> doc;
    doc["ssid"] = "my_wifi";
    doc["password"] = "12345678";
    doc["server"] = "api.example.com";
    doc["port"] = 8080;
    
    // 打开文件写入
    File file = SPIFFS.open("/config.json", "w");
    if(!file){
        Serial.println("无法打开文件写入");
        return;
    }
    
    // 序列化JSON到文件
    serializeJson(doc, file);
    file.close();
    
    Serial.println("配置已保存");
}

2.3 读取JSON配置文件

void loadConfig() {
    // 打开文件读取
    File file = SPIFFS.open("/config.json", "r");
    if(!file){
        Serial.println("无法打开文件读取");
        return;
    }
    
    // 解析JSON
    StaticJsonDocument<256> doc;
    DeserializationError error = deserializeJson(doc, file);
    if(error){
        Serial.print("JSON解析失败: ");
        Serial.println(error.c_str());
        return;
    }
    
    // 获取配置值
    const char* ssid = doc["ssid"];
    const char* password = doc["password"];
    const char* server = doc["server"];
    int port = doc["port"];
    
    Serial.println("配置加载成功:");
    Serial.print("SSID: "); Serial.println(ssid);
    Serial.print("服务器: "); Serial.print(server);
    Serial.print(":"); Serial.println(port);
    
    file.close();
}

重要提示: 在使用文件系统时,务必检查文件操作是否成功,并处理可能的错误情况。频繁写入会缩短闪存寿命,建议尽量减少写入次数。

SPIFFS与LittleFS比较

特性 SPIFFS LittleFS
默认支持 需要额外安装
写入性能 较慢 更快
写入寿命 较短 更长
目录支持 有限 更好