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() {

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

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

涨知识
I2C

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

评论:
相关文章
ESP32 的中断机制和处理

本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。


在ESP32上实现WEB交互界面

本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。


Arduino ESP32获取芯片、RAM信息

本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


ESP32 GPIO 矩阵和引脚多路复用

ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。


理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


ESP32Encoder:高效的ESP32旋转编码器库

ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。


适合学习物联网的几款盒子

本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。


乐动掌控

乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。


ESP32 MicroPython存储数据到闪存

在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。