ESP32重要库示例详解(一):EEPROM之Preferences库

1. 了解EEPROM

在嵌入式系统开发中,断电后晚能存储少量数据是常见需求。EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,即使断电数据也不会丢失。ESP32的EEPROM模拟功能利用闪存空间,方便地模拟传统EEPROM,提供安全、高效的存储方案。需要注意的是,EEPROM 具有一定的擦写寿命限制,在使用时需合理规划以避免过度擦写导致的寿命问题。在这里插入图片描述

1.1 ESP32 的 EEPROM 与传统的 EEPROM 有以下一些区别:

ESP32 的 EEPROM:

集成在芯片内部:作为 ESP32 微控制器的一部分,使用较为方便,无需额外的硬件。
特定的编程接口:ESP32 有其专门的库和编程方式来操作内部的 EEPROM。

传统 EEPROM:

通常是独立的芯片:需要通过特定的引脚与其他电路连接。
容量选择更广泛:可能有多种不同容量规格可供选择,更具灵活性。
可能在一些特定应用场景中更具针对性,例如对容量、读写速度等有更高要求时。
ESP32平台提供了一个内置的EEPROM模拟功能,通过Preferences库,我们可以方便地进行数据的读写。特别的强调地是,当你在Arduino IDE中配置为ESP32开发板时,Preferences库已经默认包含,无需额外导入。

2. Preferences示例

以下是一个简单的示例,演示如何利用Preferences库记录设备的启动次数:

#include <Arduino.h>

/*
 启动计数器示例,利用Preferences库。

 此示例展示了如何使用该库记录设备启动次数。
*/


void setup()
{
  Serial.begin(115200);
  Serial.println();
  
  Preferences preferences;
  preferences.begin("my-app", false); // 使用“my-app”命名空间,以防止键名冲突

  // 可以清除整个命名空间或删除特定键
  // preferences.clear();
  // preferences.remove("counter");

  unsigned int counter = preferences.getUInt("counter", 0); // 获取计数器值,不存在则设为0
  counter++;
  Serial.printf("Current counter value: %u\n", counter);

  preferences.putUInt("counter", counter);
  preferences.end();

  Serial.println("Restarting in 10 seconds...");
  delay(10000);
  ESP.restart();
}

void loop() {}

这段代码展示了如何在ESP32上利用Preferences库存储和读取数据。每次设备启动时,它会检查并增加"counter"的值,然后保存。

3. Preferences库的优势

  • 简便的API:使用Preferences库,数据读写操作就像操作字典一样简单。
  • 键值对存储:以键值对形式存储数据,便于管理和查找。
  • 命名空间:通过命名空间避免键名冲突,允许多个功能共享存储空间。
  • 自动类型处理:支持多种数据类型,如整型、字符串,无需手动处理序列化和反序列化。

4. 使用注意事项

  • 键名长度限制:键名长度限制为15个字符,如示例中的"counter"键。
  • 清除数据:可使用clear()清除整个命名空间,或用remove()删除特定键。

5. 示例解析

此示例演示了如何用Preferences库追踪设备启动次数:

  • setup()函数中,begin()以只读模式(false)开启"my-app"命名空间。注意不要把参数写为true.
  • getUInt()检索或初始化"counter"键的值,不存在则设为0。
  • 加1并更新计数器值。
  • 输出当前计数器值。
  • putUInt()保存计数器值, end()关闭Preferences
  • 延迟10秒后重启ESP32。

loop()函数中没有其他操作,因为所有逻辑都在setup()中完成。

通过这个例子,我们看到了ESP32如何借助内置的Preferences库简化了EEPROM操作,使数据持久化变得更加直观和高效。

6. 清除命名空间的操作

当将前面的代码烧录到ESP32后,你会发现无论你断电,还是重新烧录上述代码,counter的值都会一起累加。这个counter所在的命名空间会一直占用EEPROM空间,如何清楚除?请用以下代码清除

#include <Preferences.h>

void setup() {
  Serial.begin(115200);
  delay(1000); // 等待串口初始化完成

  // 开启命名空间,这里以"my-app"为例
  Preferences preferences;
  preferences.begin("my-app", false);

  // 清除该命名空间下的所有数据
  preferences.clear();

  // 关闭命名空间
  preferences.end();

  Serial.println("Preferences namespace 'my-app' has been cleared.");

  // 其他setup代码...
}

void loop() {
  // 主循环中无需操作
}

再重新烧录前面的重启次数统计的代码,counter的内容就会重新从零开始。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

时间范围交集查询

业务场景&#xff1a; 数据库中时开始时间与结束时间&#xff0c;筛选数据条件将这两个字段&#xff08;开始时间、结束时间&#xff09;糅合成一个字段&#xff0c;并且是范围筛选。 数据库字段&#xff1a; 筛选条件&#xff1a; 数据分析 全部包含&#xff08;子集&#…

WorkPlus im(即时通讯)集成平台助力政企数字化转型升级

随着互联网技术的不断发展&#xff0c;企业内部通讯软件已经成为企业日常运营中不可或缺的一部分。企业IM&#xff08;即时通讯&#xff09;和移动门户作为企业内部通讯软件的关键组成部分&#xff0c;为企业提供更加高效、便捷的通讯方式&#xff0c;提高了企业的运营效率。 针…

共绘财富管理新蓝图,ATFX赞助出席拉美峰会,引领家族资本新航向

全球新兴市场中&#xff0c;拉丁美洲以其非凡活力与潜力格外引人注目&#xff0c;成为全球资本竞相追逐的价值洼地。ATFX自2019年开设墨西哥办事处以来&#xff0c;持续深耕拉美市场已成为头部品牌。自4月行业资深人士Ergin Erdemir掌舵拉美业务后&#xff0c;掀起市场营销新浪…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

选型前必看,西门子五大系列PLC的区别及特点

西门子是全球知名的自动化解决方案提供商&#xff0c;其PLC&#xff08;可编程逻辑控制器&#xff09;系列产品广泛应用于工业控制领域。不同系列的PLC在功能、性能和适用范围上有所区别。本文将详细介绍西门子PLC各个系列的特点和区别&#xff0c;以及在实践应用时如何采用无线…

用vsCode开发uni-app(vue + ts)项目流程

提示:记录项目创建流程 文章目录 前言一、安装 uni-app 插件二、ts 类型校验1.安装类型声明文件2.配置 tsconfig,json三、json 注释问题四、组件引入1. 安装 uni-app2. 组件自动引入3. 配置 ts 类型五、小程序端 Pinia 持久化六、uni.request 请求封装七、请求成功提取数据和设…

内容付费小程序功能源码系统 带完整的安装代码包以及搭建部署教程

随着互联网技术的不断进步&#xff0c;内容创作和传播方式发生了翻天覆地的变化。用户对于高质量、有价值的内容需求日益增长&#xff0c;而内容创作者也希望通过自己的专业知识、经验分享等方式获取经济回报。然而&#xff0c;传统的内容分发方式存在诸多局限性&#xff0c;如…

使用map类型的参数在mapper.xml中使用案例

使用map类型的参数在mapper.xml中使用案例 简介&#xff1a;在常见的开发中&#xff0c;对于参数的装载一般使用map类型方式&#xff0c;这样可以避免创建很多参数实体类&#xff0c;不管嵌套多层的数据参数都可以通过map拿取&#xff0c;对于嵌套多层的map&#xff0c;我们需…

事件代理 浅谈

事件代理是一种将事件处理委托给父元素或祖先元素来管理的技术。当子元素触发特定事件时&#xff0c;该事件不会直接在子元素上进行处理&#xff0c;而是会冒泡到父元素或祖先元素&#xff0c;并在那里进行处理。这样做的好处是可以减少事件处理函数的数量&#xff0c;提高性能…

Centos 7.9 安装 tigervnc-server

环境&#xff1a;当前使用的 Centos 7.9 的光盘作为的本地源。 1 检查是否已安装 tigervnc [rootlocalhost /]# rpm -q tigervnc tigervnc-server 未安装软件包 tigervnc tigervnc-server-1.8.0-21.el7.x86_64 如果安装过卸掉 卸载: rpm -e [rootlocalhost /]# rpm -e tige…

Springboot 集成 Consul 实现服务注册中心-05

因为后续很多模块都要用到注册中心&#xff0c;所以此处先实现此模块。 Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康…

代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

搭建私有仓库Nexus的流程以及npm包的开发和发布

搭建私有仓库 Nexus 的流程&#xff08;Ubuntu&#xff09;以及 npm 包的开发和发布 本文档是关于在 Ubuntu 上面搭建 Nexus&#xff0c;以及制作 npm 包并发布到 Nexus 的流程说明。 关于 Ubuntu Ubuntu 是一个基于 Linux 的操作系统&#xff0c;通常会用在服务器或者嵌入式…

luceda ipkiss教程 71:统计线路中器件的个数

**案例分享&#xff1a;**统计线路中某一器件的个数 如&#xff0c;统计SplitterTree中mmi的个数&#xff1a; 所有代码如下&#xff1a; # Copyright (C) 2020 Luceda Photonicsfrom si_fab import all as pdk from ipkiss3 import all as i3class GeneralizedSplitterTree…

手机恢复出厂设置会怎么样?一切回到了原点?

随着智能手机的普及&#xff0c;我们每天都在与手机紧密互动&#xff0c;里边存储了大量的个人信息和应用数据。然而&#xff0c;有时候我们会遇到手机卡顿、应用崩溃或数据丢失的问题。这时&#xff0c;恢复出厂设置成为了许多人的选择。那么&#xff0c;手机恢复出厂设置会怎…

专项技能训练五《云计算网络技术与应用》实训8-1:建立基于OpenvSwitch的GRE隧道

文章目录 建立基于OpenvSwitch的GRE隧道1. 使用VMware安装2个CentOS 7虚拟机&#xff0c;安装时记得都开启CPU虚拟化&#xff0c;第一台命名为“Docker”&#xff0c;第二台命名为“KVM”。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot…

数据序列包分析

基于数据序列包分析各部分的内容及含义&#xff0c;可能会考大题 基于本例分析&#xff0c;每部分含义如下&#xff1a; 时间&#xff08;Time&#xff09;&#xff1a; 时间戳显示了数据包在网络中被捕获的具体时间。在本例中&#xff0c;如"0.000000"表示第一个数据…

Golang | Leetcode Golang题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; func sortColors(nums []int) {p0, p2 : 0, len(nums)-1for i : 0; i < p2; i {for ; i < p2 && nums[i] 2; p2-- {nums[i], nums[p2] nums[p2], nums[i]}if nums[i] 0 {nums[i], nums[p0] nums[p0], nums[i]p0}} }

共用nacos造成的开发问题记录

目录 1.需求提出 2.系统架构 3.问题抛出 4.解决办法 1.配置私有命名空间 2.给服务加后缀 1.需求提出 本地调试用到哪个服务启动哪个服务&#xff0c;其他支持服务调用测试环境上的&#xff0c;目的是避免本地启动多个服务&#xff0c;消耗电脑配置。 2.系统架构 项目是…