ESP32如何从SPIFFS文件读取值设置TIME_TO_SLEEP?
解决从SPIFFS读取数值设置ESP32深度睡眠时间的问题
错误原因
你之前用#define TIME_TO_SLEEP yourInputString = readFile(SPIFFS, "/inputString.txt");的写法完全错误,因为#define是预编译宏,仅做文本替换,不能用来执行变量赋值或函数调用,所以编译器找不到yourInputString的定义,才会报出那个错误。
正确实现步骤
1. 实现SPIFFS文件读取函数
如果还没有readFile函数,先添加以下代码:
String readFile(fs::FS &fs, const char * path){ Serial.printf("Reading file: %s\r\n", path); File file = fs.open(path); if(!file || file.isDirectory()){ Serial.println("- failed to open file for reading"); return ""; } String fileContent; while(file.available()){ fileContent += char(file.read()); } file.close(); return fileContent; }
2. 修改深度睡眠逻辑
把原来直接用宏定义的地方,改成动态读取文件内容并转换为整数,注意esp_sleep_enable_timer_wakeup的参数是微秒,需要将读取到的秒数乘以1000000:
server.on("/L", HTTP_GET, [] (AsyncWebServerRequest *request) { digitalWrite(led_gpio, LOW); // GET /L turns the LED off // 读取SPIFFS文件中的睡眠时间数值 String sleepTimeStr = readFile(SPIFFS, "/inputString.txt"); // 转换为整数,设置默认值5(防止文件读取失败) int TIME_TO_SLEEP = sleepTimeStr.toInt(); if(TIME_TO_SLEEP <= 0) { TIME_TO_SLEEP = 5; } // 设置深度睡眠时间(转换为微秒) esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * 1000000ULL); esp_deep_sleep_start(); request->send(200, "text/plain", "ok"); });
3. 额外注意事项
- 确保在
setup函数中正确挂载SPIFFS,示例代码:if(!SPIFFS.begin(true)) { Serial.println("SPIFFS Mount Failed"); return; } /inputString.txt文件内只能存放纯数字(如30),不要有多余空格或换行,否则toInt()可能读取错误- 添加默认值判断,避免文件读取失败时程序异常
内容的提问来源于stack exchange,提问作者Cyra Spark
相关产品推荐
相关产品推荐

