0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32學(xué)習(xí)筆記:NVS分區(qū)永久保存數(shù)據(jù)

CHANBAEK ? 來(lái)源:跳動(dòng)的字節(jié) ? 作者:曉宇 ? 2023-07-15 16:14 ? 次閱讀

今天我們來(lái)說說ESP32 for Arduino NVS分區(qū)永久保存數(shù)據(jù)。

ESP32 for Arduino NVS分區(qū)

上一節(jié)我們講了整個(gè)ESP32的存儲(chǔ)分布,其中有一個(gè)NVS分區(qū),這個(gè)分區(qū)專門用來(lái)存儲(chǔ)數(shù)據(jù)的,系統(tǒng)在復(fù)位或斷電后數(shù)據(jù)仍然存在,我們可以使用Preferences庫(kù)保存網(wǎng)絡(luò)SSID,密碼,一些閾值或者IO的最后狀態(tài)等。

在保存數(shù)據(jù)的時(shí)候,我們推薦使用Preferences庫(kù),不推薦使用EEPROM庫(kù)。

使用Preferences庫(kù)保存的數(shù)據(jù)結(jié)構(gòu)如下,也叫鍵值對(duì):

namespace {
  key:value
}

一個(gè)命名空間中也可以有不同的鍵:

namespace {
  key1: value1
  key2: value2
}

實(shí)際使用中,我們可以用來(lái)保存網(wǎng)絡(luò)憑證:

credentials {
  ssid: "your_ssid"
  pass: "your_pass"
}

也可以有多個(gè)具有相同鍵的命名空間(但每個(gè)鍵都有其值):

namespace1{
  key:value1
}
namespace2{
  key:value2
}

使用Preferences庫(kù)時(shí),應(yīng)該定義要保存的數(shù)據(jù)類型。如果想讀取該數(shù)據(jù),則必須知道保存的數(shù)據(jù)類型,也就是說,寫入和讀取的數(shù)據(jù)類型應(yīng)該相同。

支持以下數(shù)據(jù)類型的保存:char、char、short、Ushort、int、Uint、long、Ulong、long64、Ulong64、float、double、bool、字符串和字節(jié)。

Preferences庫(kù)函數(shù)說明

首先包含頭文件

Preferences 庫(kù)

然后定義一個(gè)實(shí)例

Preferences preferences;

打開一個(gè)命名空間

begin方法打開一個(gè)帶有定義命名空間的“儲(chǔ)存空間”,參數(shù)為false代表我們?cè)谧x/寫模式下使用,為true代表以只讀的方式打開或創(chuàng)建命令空間,命名空間名稱最多為15個(gè)字符。

preferences.begin("my-app", false);

清除preferences

從打開的命名空間中刪除一個(gè)鍵。

preferences.remove(key);

關(guān)閉preferences

使用end方法在打開的命名空間下關(guān)閉preferences

preferences.end();

放置一個(gè)k-v

圖片

獲取一個(gè)k-v

圖片

刪除命名空間

在Preferences 庫(kù)中,并沒有完全刪除命令空間的方法,我們存儲(chǔ)很多數(shù)據(jù)之后,nvs分區(qū)可能就滿了,所以我們想要完全擦除nvs分區(qū),可以使用以下程序運(yùn)行一次:

#include < nvs_flash.h >

void setup() {
  nvs_flash_erase(); // 擦除NVS分區(qū)
  nvs_flash_init();  // 初始化NVS分區(qū)
  while(true);
}

void loop() {

}

程序示例

我們直接打開Example中的例子,StartCounter

/*
 ESP32 startup counter example with Preferences library.

 This simple example demonstrates using the Preferences library to store how many times the ESP32 module has booted. 
 The Preferences library is a wrapper around the Non-volatile storage on ESP32 processor.

 created for arduino-esp32 09 Feb 2017 by Martin Sloup (Arcao)
 
 Complete project details at https://RandomNerdTutorials.com/esp32-save-data-permanently-preferences/
*/

#include < Preferences.h >

Preferences preferences;

void setup() {
  Serial.begin(115200);
  Serial.println();

  // Open Preferences with my-app namespace. Each application module, library, etc
  // has to use a namespace name to prevent key name collisions. We will open storage in
  // RW-mode (second parameter has to be false).
  // Note: Namespace name is limited to 15 chars.
  preferences.begin("my-app", false);

  // Remove all preferences under the opened namespace
  //preferences.clear();

  // Or remove the counter key only
  //preferences.remove("counter");

  // Get the counter value, if the key does not exist, return a default value of 0
  // Note: Key name is limited to 15 chars.
  unsigned int counter = preferences.getUInt("counter", 0);

  // Increase counter by 1
  counter++;

  // Print the counter to Serial Monitor
  Serial.printf("Current counter value: %un", counter);

  // Store the counter to the Preferences
  preferences.putUInt("counter", counter);

  // Close the Preferences
  preferences.end();

  // Wait 10 seconds
  Serial.println("Restarting in 10 seconds...");
  delay(10000);

  // Restart ESP
  ESP.restart();
}

void loop() {

}

這個(gè)例子增加了一個(gè)counter鍵,每次運(yùn)行都加一,我們?cè)诎聪聫?fù)位鍵之后,可以看到下面你的現(xiàn)象,數(shù)據(jù)保存起來(lái)了。

圖片

Preferences庫(kù)很方便保存鍵:值對(duì)。即使在重置 ESP32 或斷電后,閃存中保存的數(shù)據(jù)仍然存在。

感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4227

    瀏覽量

    85580
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7486

    瀏覽量

    88543
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1008

    瀏覽量

    81336
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40074
  • ESP32
    +關(guān)注

    關(guān)注

    17

    文章

    951

    瀏覽量

    16992
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問esp32s3如何保存突然停電時(shí)的數(shù)據(jù)?

    描述:我們?cè)O(shè)計(jì)的一塊板子,電源處有一塊小電容,在斷電前,還能運(yùn)行1段時(shí)間(時(shí)間很短,比如2s) 需求:我們想在這2s時(shí)間內(nèi),保存一些緊急數(shù)據(jù)nvs中(數(shù)據(jù)不會(huì)很多),請(qǐng)問是否可以實(shí)現(xiàn)
    發(fā)表于 06-06 07:38

    ESP32-S3-WROMM-1U同時(shí)讀取nvs和寫ota分區(qū)會(huì)造成系統(tǒng)異常嗎?

    ESP32-S3-WROMM-1U 同時(shí)讀取nvs和寫ota分區(qū),造成系統(tǒng)異常?
    發(fā)表于 06-07 07:48

    ESP32-S3無(wú)法使用NVS分區(qū)是怎么回事?

    用的ESP32-S3-DevKitC-1 N16R8開發(fā)板,使用官方示例程測(cè)試也無(wú)法寫入NVS,使用的版本是IDF4.4,
    發(fā)表于 06-18 08:13

    基于PlatfromIO-Arduino的ESP32-Flash分區(qū)

    ESP32-Flash分區(qū),基于PlatfromIO-Arduino在PlatformIO中添加分區(qū)表在工程根目錄下新建partition.csv文件在工程下的platformio.ini文件中添加
    發(fā)表于 01-26 08:00

    ESP32ESP-IDF學(xué)習(xí)筆記

    ESP32ESP-IDF 學(xué)習(xí)筆記(六)【I2C數(shù)據(jù)總線(I2C)】文章目錄ESP32
    發(fā)表于 02-22 07:30

    使用ESP32-S3無(wú)法使用NVS分區(qū)是為什么?

    用的ESP32-S3-DevKitC-1 N16R8開發(fā)板,使用官方示例程測(cè)試也無(wú)法寫入NVS,使用的版本是IDF4.4,
    發(fā)表于 02-15 06:21

    如何將ESP-IDF引導(dǎo)加載程序與用于NVSESP32-Arduino代碼一起使用?

    的 Arduino 代碼并將其閃存Stage 2 - ESP32-Arduino 代碼我當(dāng)前的問題是無(wú)論 NVS 是否已加密,我都無(wú)法從 NVS 分區(qū)寫入/讀取,我什至嘗試禁用閃存加密
    發(fā)表于 04-13 08:11

    ESP32 開發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X

    ESP32 開發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
    發(fā)表于 11-14 09:06 ?6次下載
    <b class='flag-5'>ESP32</b> 開發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X

    ESP32驅(qū)動(dòng)AD7705

    wifi配置信息保存nvs_flash,實(shí)現(xiàn)掉電重新啟動(dòng)直接連入wifi(已完成)3、idf v4.0 調(diào)試esp-aliyun-master 生成對(duì)應(yīng)的 NVS
    發(fā)表于 11-23 17:51 ?15次下載
    <b class='flag-5'>ESP32</b>驅(qū)動(dòng)AD7705

    ESP32-Flash分區(qū),基于PlatfromIO-Arduino

    ESP32-Flash分區(qū),基于PlatfromIO-Arduino在PlatformIO中添加分區(qū)表在工程根目錄下新建partition.csv文件在工程下的platformio.ini文件中添加
    發(fā)表于 12-02 12:21 ?13次下載
    <b class='flag-5'>ESP32</b>-Flash<b class='flag-5'>分區(qū)</b>,基于PlatfromIO-Arduino

    [ESP8266學(xué)習(xí)筆記]components_nvs 非易失性存儲(chǔ) Non-Volatile Storage(NVS),保存數(shù)據(jù)到flash

    [ESP8266學(xué)習(xí)筆記]components_nvs 非易失性存儲(chǔ) Non-Volatile Storage(NVS),
    發(fā)表于 12-02 12:51 ?11次下載
    [<b class='flag-5'>ESP</b>8266<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>]components_<b class='flag-5'>nvs</b> 非易失性存儲(chǔ) Non-Volatile Storage(<b class='flag-5'>NVS</b>),<b class='flag-5'>保存</b><b class='flag-5'>數(shù)據(jù)</b>到flash

    [ESP32]學(xué)習(xí)筆記02

    [ESP32學(xué)習(xí)筆記02]使用ViusalStudio2017開發(fā)ESP32、按鍵輸入檢測(cè)前言一、安裝Visual Studio 2017二、配置開發(fā)環(huán)境1.安裝ViusalGDB2.
    發(fā)表于 12-03 17:36 ?23次下載
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02

    [ESP32]學(xué)習(xí)筆記04

    Analog-to-Digital Converter(模數(shù)轉(zhuǎn)換器)的使用今天我們學(xué)習(xí)ESP32提供的ADC外設(shè)的使用,ESP32的每個(gè)ADC單元都支持兩種模式,單次讀取和連續(xù)讀取(DMA),本次
    發(fā)表于 12-22 19:02 ?9次下載
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04

    SPI主線協(xié)議——ESP32學(xué)習(xí)筆記

    目錄SPI主線協(xié)議——ESP32學(xué)習(xí)筆記零、前言一、什么是SPI?二、通信過程?三、極性和相位四、總結(jié)SPI主線協(xié)議——ESP32學(xué)習(xí)
    發(fā)表于 12-22 19:23 ?18次下載
    SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    ESP32學(xué)習(xí)筆記:WiFi

    今天我們來(lái)說說ESP32 的WiFi。
    的頭像 發(fā)表于 07-15 16:20 ?3685次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>:WiFi