ESP32如何将磁盘、内存、PSRAM使用率转为百分比?代码异常求助
问题分析与修复方案
核心问题排查
1. 全局变量持续累加导致数值异常
memory、memoryPsram、disk作为全局变量,每次进入loop()都会在原有值基础上累加10次计算结果,导致数值不断膨胀(比如第一次正确值是47.6,第十次就会变成476)。
2. 整数除法导致PSRAM/磁盘使用率为0
ESP32相关内存、磁盘函数返回的是整数类型,直接执行(ESP.getFreePsram() * 100 / ESP.getPsramSize())这类整数运算时,若分子小于分母,整数除法会直接截断为0,最终结果自然是0。
3. PSRAM未启用或硬件不支持
如果你的ESP32模块不带PSRAM,或者在PlatformIO配置中未开启PSRAM支持,ESP.getPsramSize()会返回0,触发代码分支直接取0值。
4. SPIFFS挂载未做错误校验
代码直接调用SPIFFS.begin(),未检查挂载结果,若挂载失败,totalBytes()返回0,同样会触发分支取0值。
修复后的代码
#include <SPIFFS.h> void setup() { Serial.begin(115200); Serial.println("Arrancando telemetria: "); // 检查SPIFFS挂载状态,失败时输出提示 if(!SPIFFS.begin(true)){ Serial.println("SPIFFS挂载失败"); return; } } void loop() { float memory = 0.0; float memoryPsram = 0.0; float disk = 0.0; for (int i = 0; i < 10; i++) { // 内存使用率计算:先转浮点避免整数截断 if(ESP.getHeapSize() > 0){ float usedHeap = ESP.getHeapSize() - ESP.getFreeHeap(); memory += (usedHeap / ESP.getHeapSize()) * 100; } // PSRAM使用率计算 if(ESP.getPsramSize() > 0){ float usedPsram = ESP.getPsramSize() - ESP.getFreePsram(); memoryPsram += (usedPsram / ESP.getPsramSize()) * 100; } else { memoryPsram += 0.0; // 无PSRAM时返回0 } // SPIFFS磁盘使用率计算 if(SPIFFS.totalBytes() > 0){ disk += ((float)SPIFFS.usedBytes() / SPIFFS.totalBytes()) * 100; } else { disk += 0.0; } } Serial.print("Memory: "); Serial.println(memory/10, 2); // 保留两位小数输出 Serial.print("Memory Psram: "); Serial.println(memoryPsram/10, 2); Serial.print("Disk: "); Serial.println(disk/10, 2); delay(1000); }
PSRAM启用配置(针对带PSRAM的模块)
如果你的ESP32模块搭载了PSRAM,需要在PlatformIO的platformio.ini中添加以下配置开启支持:
build_flags = -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue
关键修复点说明
- 将统计变量移至
loop()内部,每次循环重新初始化,彻底解决累加问题 - 先将整数转换为浮点型再执行除法,避免整数截断导致的0值问题
- 增加SPIFFS挂载错误检查,便于快速定位磁盘异常
- 调整使用率计算逻辑为「已使用空间/总空间*100」,逻辑更直观清晰
- 使用
Serial.println(value, 2)控制输出小数位数,格式更规范
内容的提问来源于stack exchange,提问作者joaquinStrada
相关产品推荐
相关产品推荐

