とうふ荘の手記てき!

プログラムとか

M5StickCのNVS領域(Preferencesクラス)に書き込んだデータを削除する

以前、書き込んだM5StickC用の駆動時間測定用のスケッチですが、NVS(Non-Voltage Storage)と呼ばれる不揮発性メモリにPreferencesクラスを用いて、書き込んでいました。

tofu-so.hatenablog.jp

しかし、NVS領域は電源断だけではなく、スケッチを書き込んでもデータが残り続けるため、あまりに多くのデータが残ると書き込みに支障が生じる可能性がありますし、NVS領域の使用例として、WiFiのアクセスポイントやパスワードを書き込む例も見られ、それらが残り続けることはあまり気持ちの良いものではありません。

そこで、NVS領域をクリアするスケッチを実行するスケッチになります。NVS領域に残っているデータはすべて削除されるため気を付けてください。

使用方法

以下のスケッチを実行後、Aボタン(M5StickCの場合は、大きくM5と刻印されたボタン)を押して消去処理が行えます。

(ただし、NVS領域に記録されているデータはすべて削除されてしまいます!)

Bボタン(MStickCの場合は、やや上方の側面についているボタン)でキャンセルです。

#include <M5StickC.h>
#include <Preferences.h>

Preferences preferences; // Preferencesクラス
int cursor_line = 0;     // 現在描画中の行

void screen_set();
void screen_nextline();
int nvs_clear_asking();

void setup()
{
    M5.begin();
    M5.Lcd.setRotation(1);
    screen_set();
    if (nvs_clear_asking())
    {
        screen_nextline();
        M5.Lcd.printf("Now cleaning...");
        preferences.begin("test", false); // NVS領域を適当なキーで開始する

        if (preferences.clear())
        {
            screen_nextline();
            M5.Lcd.printf("NVS Clear");
        }
        else
        {
            screen_nextline();
            M5.Lcd.printf("NVS cleaning was failed.");
        }

        preferences.end(); // 消去完了
    }
    else
    {
        screen_nextline();
        M5.Lcd.printf("NVS Not Clear");
    }
}

void loop()
{
}

// NVS領域をクリアするか聞く
int nvs_clear_asking()
{
    int ans = 0;

    screen_nextline();
    M5.Lcd.printf("NVS Clear?");
    screen_nextline();
    M5.Lcd.printf("A)Yes B)No");

    while (1)
    {
        M5.update();
        if (M5.BtnA.isPressed())
        {
            ans = 1;
            break;
        }
        else if (M5.BtnB.isPressed())
        {
            ans == 0;
            break;
        }
        delay(100);
    }

    return ans;
}

// ディスプレイ
void screen_set()
{
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextSize(1);
    M5.Lcd.setCursor(40, cursor_line);
    M5.Lcd.printf("M5 NVS Clear");
}

void screen_nextline()
{
    cursor_line += 15;
    if (cursor_line >= M5.Lcd.height())
        cursor_line = 1;
    M5.Lcd.setCursor(1, cursor_line);
}

NVS(Preferencesクラス)領域のクリアにおける注意点

NVS領域をクリアする場合、Preferencesクラスのオブジェクトを作成し、clear()関数を実行させれば良いのですが、その際必ず適当なキーでbegin(const char *, bool)を行う必要があるようです。(そうでないとclear()関数は失敗します。おそらくremove関数も失敗します。) そして消去後は、end()関数を実行すれば良いようです。