ESP32でSPIFFSを使ってスケッチからファイルを読み書きしてみる | そう備忘録

ESP32でSPIFFSを使ってスケッチからファイルを読み書きしてみる

SPIFFS

ESP32-WROOM-32 にて設定ファイルを保存してスケッチプログラムから読み込みたい事があった。

調べてみると SPIFFS(SPI Flash File System)が使えそうだったので試した時の備忘録。

保存したファイルは ESP32 のフラッシュメモリのユーザ領域に保存される。

環境

試した環境は以下の通り。

OS

Windows 10 Home(64 Bit)

Arduino IDE

1.8.13

モジュール

ESP32-WROOM-32

ESP32にWi-Fi、Bluetoothが一つのモジュールに収まっている

アップローダーのインストール

Arduino IDE にアップローダーをインストールする。

ダウンロード

こちらのサイトにアクセスして下にスクロールして、Download the tool archive from releases page.の “releases page” をクリックする。

spiffs アップローダーのダウンロード

ESP32FS-1.0.zip をダウンロードする。

ESP32FS-1.0.zipのダウンロード

解凍

ダウンロードしたファイルを解凍すると以下のフォルダー構成となっている。

├─ESP32FS-1.0
│  │      
│  ├─ESP32FS
│  │  │
│  │  ├──tool
│  │  │  esp32fs.jar
│  │  │
zipファイルの解凍

Arduino IDE環境確認

Arduino IDEを起動してスケッチプログラムの保存場所を確認する。

ファイルー>環境設定を選択する。

環境設定

スケッチブックの保存場所を確認する。

デフォルトだと C:¥Users¥ユーザ名¥Documents¥Arduino になっていた。

スケッチブックの保存場所の確認

tools

上記のフォルダ配下に “tools” フォルダーを作成して、解凍した ESP32FS 配下のフォルダーとファイルをコピーする。

toolsフォルダー配下にコピーする

確認

Arduino IDE を終了して起動するとツールメニューに ESP32 Sketch Data Upload が追加されている。

このメニューを利用してファイルを ESP32 のフラッシュメモリに書き込むことが出来る。

ESP32 Sketch Data Upload

Partition Scheme

尚、SPIFFS が存在する Partition Scheme 選択する事。

SPIFFS が無い Partition Scheme(例えば Default 4MB with ffat(1.2MB APP/1.5MB FATTS)など)を選択して Upload を行うと、”SPIFFS Error: partition size could not be found!” で書き込めない。

Partition Scheme

アップロード

ファイルを手動でアップロードしてスケッチから読み込んでみる。

ファイルの用意

スケッチが保存されているフォルダー配下に “data” フォルダーを作成してコピーしたいファイル(config.ini)を格納する。

どうやらこの data フォルダー名は”決め打ち”の名前のようだ。

dataフォルダーはいかにconfig.iniファイル

config.ini の中身

client_id=SKSPI0001
flg1=1
flg2=0
flg3=0

upload

ツールー>ESP32 Sketch Data Upload を選択すると “SPIFFS image Uploaded” メッセージが表示されて data フォルダー配下の config.ini ファイルが ESP32 に書き込まれる。

SPIFFS image Uploaded

メッセージは以下の通り。

data フォルダー配下の config.sys と desktop.ini(Windowsが自動で作成するデスクトップの表示情報を保存するファイル)と spiffs.spiffs.bin ファイルが書き込まれた事が分かる。

[SPIFFS] data   : D:\GoogleDriveD\M2B\Program\ArduinoProgram\spiffs\data
[SPIFFS] start  : 2686976
[SPIFFS] size   : 1472
[SPIFFS] page   : 256
[SPIFFS] block  : 4096
/config.ini
/desktop.ini
[SPIFFS] upload : C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_23315/spiffs.spiffs.bin
[SPIFFS] address: 2686976
[SPIFFS] port   : COM7
[SPIFFS] speed  : 921600
[SPIFFS] mode   : dio
[SPIFFS] freq   : 80m

esptool.py v3.0-dev
Serial port COM7
Connecting.....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: f0:08:d1:d2:7b:20
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1507328 bytes to 3025...
Writing at 0x00290000... (100 %)
Wrote 1507328 bytes (3025 compressed) at 0x00290000 in 0.0 seconds (effective 262144.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

スケッチ

読み込み

data フォルダー配下の config.ini ファイルを読み込んで表示するスケッチ。

spiffs.ino

/*
 * SPIFFS Test Scketch
 *  
 */
#include "SPIFFS.h"

void setup() {
    Serial.begin(115200);
    SPIFFS.begin(); // SPIFFS config.iniファイルの読み込み
    File fr = SPIFFS.open("/config.ini", "r");
    while(fr.available()){
        String readStr = fr.readStringUntil('\n'); // 改行まで1行読み出し
        Serial.println(readStr);
    }
    fr.close();
}

void loop() {
}

実行結果

シリアルモニターの実行結果は以下の通り。

行ごとに読み込まれた。

実行結果

削除

手動アップロード時に一緒にアップロードされてしまった不要な desktop.ini を削除するスケッチ。

/*
 * SPIFFS Test Scketch
 *  
 */
#include "FS.h"
#include "SPIFFS.h"

void setup() {
    Serial.begin(115200);
    SPIFFS.begin();
    fs::FS fs = SPIFFS;
    fs.remove("/desktop.ini");
}

void loop() {
}

書き込み

ファイルを書き込んで読み直すスケッチ。

/*
 * SPIFFS Test Scketch
 *  
 */
#include "SPIFFS.h"

void setup() {
    Serial.begin(115200);
    SPIFFS.begin();
    File fr = SPIFFS.open("/config2.ini", "w"); // 書き込みモード
    fr.println("confing2 test line1"); // 2行書き込む
    fr.println("confing2 test line2");
    fr.close();
    
    File frr = SPIFFS.open("/config2.ini", "r"); // 読み込みモード 
    while(frr.available()){
        String readStr = frr.readStringUntil('\n'); // 改行まで1行読み出し
        Serial.println(readStr);
    }
    frr.close();
}

void loop() {
}

実行結果

書き込まれた2行が表示されている。

ファイル書き込みスケッチ実行結果

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。