You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32使用Preferences库存储chainCounter到非易失闪存的问题咨询

解决ESP32 Preferences库读取/存储整数变量问题

核心问题分析

你的代码无法读取闪存中保存的chainCounter值,根源在于读取操作的时机错误:在全局作用域调用preferences.getInt()时,Preferences实例还未通过begin()初始化,此时无法访问闪存,只能返回默认值0。另外,当前代码在setup中刚初始化就立刻存储初始值,也不符合实际需求(应该在变量变化后再存储)。

你的疑问解答

  1. 相关语句的位置

    • Preferences preferences;可以全局定义,方便整个代码调用。
    • preferences.begin()、getInt()、putInt()这些操作必须放在setup()或其他运行时函数中,且**getInt()和putInt()必须在begin()之后执行**。
    • preferences.end()可以在完成一批读写操作后调用,如果后续还需要读写,也可以暂时不调用(但建议在不需要访问闪存时关闭,节省资源)。
  2. 变量chainCounter的定义

    • 使用int类型完全符合需求,因为ESP32的Preferences库支持存储带符号的32位整数,能够正确保存正负数值。

修正后的代码示例

#include "sensesp/sensors/digital_output.h"
#include "sensesp/controllers/smart_switch_controller.h"
#include "sensesp/sensors/digital_input.h"
#include "sensesp/sensors/sensor.h"
#include "sensesp/signalk/signalk_output.h"
#include "sensesp/system/lambda_consumer.h"
#include "sensesp/transforms/debounce.h"
#include "sensesp/transforms/linear.h"
#include "sensesp/transforms/lambda_transform.h"
#include "sensesp/transforms/moving_average.h"
#include "sensesp_app.h"
#include "sensesp_app_builder.h"
#include <Preferences.h>

#include <math.h>

using namespace sensesp;

reactesp::ReactESP app;

Preferences preferences;
int chainCounter; // 先声明变量,不初始化

void setup() {
    // 初始化Preferences,第二个参数false表示可读写模式
    preferences.begin("my_app", false);
    
    // 此时才能从闪存读取保存的值
    chainCounter = preferences.getInt("counter", 0);
    
    // 关闭Preferences(如果后续不需要立刻读写,可以先关闭)
    preferences.end();

    // -------------------
    // 其他原有代码
    // -------------------

    sensesp_app->start();
}

// 示例:当chainCounter变化时,调用此函数保存到闪存
void saveChainCounter() {
    preferences.begin("my_app", false);
    preferences.putInt("counter", chainCounter);
    preferences.end();
}

void loop() { 
    app.tick(); 

    // 示例:假设这里有代码修改chainCounter,比如按键触发增减
    // if(按键按下) {
    //     chainCounter++;
    //     saveChainCounter(); // 修改后立刻保存
    // }
}

关键注意事项

  • 每次需要读写闪存时,都要先调用preferences.begin("my_app", false),操作完成后调用preferences.end()。
  • 只有当chainCounter的值发生变化时,才需要调用putInt()保存,避免频繁写入闪存(闪存有写入次数限制,减少不必要的写入能延长寿命)。
  • 确保begin()的命名空间(第一个参数"my_app")前后一致,否则会读取不同的存储区域。

内容的提问来源于stack exchange,提问作者gregy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:22