Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。
在ESP32开发中,数据持久化存储是一个常见需求。Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。

Preferences库利用ESP32芯片内置的NVS(Non-Volatile Storage)存储机制,能够在设备重启或断电后保留数据。与EEPROM相比,它提供了更好的性能、更大的存储空间和更灵活的数据管理方式。

核心概念

命名空间与键值对
Preferences采用命名空间(namespace)和键值对(key-value)的组织方式:
命名空间:相当于一个独立的存储区域,每个命名空间必须具有唯一名称
键值对:每个命名空间内包含多个键值对,键名在命名空间内必须唯一
命名空间和键名都区分大小写,且长度限制为最多15个字符。

数据类型支持

Preferences支持多种数据类型存储,包括:
类型名称 对应C/C++类型 大小(字节)
Bool bool 1
Char int8_t 1
UChar uint8_t 1
Short int16_t 2
UShort uint16_t 2
Int int32_t 4
UInt uint32_t 4
Long int32_t 4
ULong uint32_t 4
Float float_t 4
Long64 int64_t 8
ULong64 uint64_t 8
Double double_t 8
String const char*/String 可变长度
Bytes uint8_t 可变长度

基本使用流程

1. 初始化Preferences对象
首先需要创建Preferences对象:

Preferences prefs;  // 创建Preferences对象
2. 打开/创建命名空间
使用begin()方法打开或创建命名空间:
prefs.begin("myNamespace", false);  
// 参数1: 命名空间名称 
// 参数2: false表示读写模式,true表示只读模式 
3. 检查键是否存在
在首次运行时,通常需要检查键是否存在以确定是否需要初始化:
if(!prefs.isKey("initialized")) {
    // 首次运行,进行初始化
} 
4. 存储数据
使用putX系列方法存储数据:
prefs.putInt("counter", 0);      // 存储整型
prefs.putString("name", "ESP32");// 存储字符串
prefs.putFloat("temp", 25.5);    // 存储浮点数 
5. 读取数据
使用getX系列方法读取数据:
int counter = prefs.getInt("counter");
String name = prefs.getString("name"); 
float temp = prefs.getFloat("temp"); 
6. 关闭命名空间
完成操作后关闭命名空间:
prefs.end();
高级功能
批量数据存储
对于较大的数据块,可以使用Bytes类型:
uint8_t data[100] = {...};  // 要存储的数据
prefs.putBytes("dataKey", data, sizeof(data)); 
// 读取时
uint8_t buffer[100];
size_t len = prefs.getBytesLength("dataKey"); // 获取数据长度
prefs.getBytes("dataKey", buffer, len); 
数据管理
prefs.remove("keyName");  // 删除指定键
prefs.clear();            // 清空当前命名空间 
实用功能
size_t freeEntries = prefs.freeEntries(); // 获取剩余可用键数量 
PreferenceType type = prefs.getType("key"); // 获取键的数据类型 

存储限制

尽管 Preferences API 设计用来存储少量的数据,但它确实有一些存储限制,这些限制主要与底层存储技术以及 ESP32 的硬件特性有关:

  • 空间:默认情况下,ESP32 的 Preferences 存储空间大约是 4KB。这意味着你可以存储大约 3000 个键值对(每个键值对大约占用 1 个字节的键名长度和 4 个字节的值长度)。
  • 键名:键名必须是字符串,并且在整个 Preferences 命名空间中必须是唯一的。每个键名的最大长度是 15 个字符。
  • 值:对于字符串,最大长度是约 1020 个字符(考虑到内部元数据)。

实际应用示例

以下是一个完整的配置管理示例:
#include <Preferences.h>
 
Preferences prefs;
 
void setup() {
    Serial.begin(115200);
    
    // 打开配置命名空间
    prefs.begin("config", true);
    
    // 读取配置
    String ssid = prefs.getString("ssid");
    String passwd = prefs.getString("passwd");
    
    Serial.printf("SSID: %s\n", ssid.c_str());
    Serial.printf("Passwd: %s\n", passwd.c_str());
    
    prefs.end();
}
 
void updateConfig() {

    // 打开配置命名空间
    prefs.begin("config", false);

    // 设置默认值
    prefs.putString("ssid", "ssid");
    prefs.putString("passwd", "********");
    
    prefs.end();
}

void loop() {

}
- 本文内容来自网络,如有侵权,请联系本站处理。

2025-06   阅读(756)   评论(0)
 标签: 创客 Arduino ESP32 Preferences

涨知识
导轨

导轨又称滑轨、线性导轨、线性滑轨,用于直线往复运动场合,拥有比直线轴承更高的额定负载, 同时可以承担一定的扭矩,可在高负载的情况下实现高精度的直线运动。

评论:
相关文章
【ESP32 C++教程】Unit7-1:四位7段式数码管

本节主要讲解用TM1650来驱动四位7段式数码管模块的显示使用。


【ESP32 C++教程】Unit6-4:资源互斥访问

本节主要讲解FreeRTOS任务间如何使用互斥对象来实现资源互斥访问。


ESP32 Guru Meditation Error报错定位分析

在ESP32的开发,经常会有系统崩溃一直重启的情况,那么如何快速定位出现异常的代码呢?


【ESP32 C++教程】Unit6-3 FreeRTOS任务间通信

本节主要讲解FreeRTOS任务间如何使用消息队列、事件组和二进制信号量进行通信。


【ESP32 C++教程】Unit6-2 FreeRTOS多任务

本节主要讲解Task类,FreeRTOS多任务的使用。


【ESP32 C++教程】Unit6-1 定时器

本节主要讲解Timer类,FreeRTOS定时器的使用。


【ESP32 C++教程】Unit5-2 执行器件之舵机

本节主要讲解舵机驱动类和用按键控制舵机。


【ESP32 C++教程】Unit5-1 执行器件之继电器

本节主要讲解执行器件类型和用按键控制继电器。


【ESP32 C++教程】Unit4-3 红外接收和遥控

本小节主要讲解红外接收和遥控器件,以及遥控操作LED。


【ESP32 C++教程】Unit4-2 模拟量传感器

本小节讲解模拟量传感器使用,旋转电位器,DHT11温湿度传感器和实现自定义传感器类。