前回の”(5)スピーカーに収納する“でラジオに以下の2つの機能を追加したいと思います。追加したい機能はコンパイル無しで
- WiFiルータのSSIDとPasswordの変更
- ラジオ局データの変更と追加
を行う機能です。前回までのラジオプログラムとは別にこれらの機能をコーディングし最後にラジオプログラムと合体させる予定です。
データの保存方法
データの保存方法として外部記憶機器(例えばSDカード)を使用する事も考えられますが、
- 追加のデバイス、配線が必要
- 保存するデータ量が小さい。
から、今回は自身のFlashを使用する、”SPIFFS” でデータを保存する事にします。
データの編集方法
データの編集方法は、
- ESP32でHTTPサーバーを立ち上げる。
- スマホとESP32をAP接続する。
- サーバーのHPからデータを編集する
事にします。
SPIFFSを実装する
使用したプロジェクトの構成は以下の様になっています。
先ずはパティションの設定
SPIFFSを使用するにはESP32のFlashにSPIFFSで使用する領域を設定する必要が有ります。この設定は、ルートディレクトリの下の”partitions_example.csv”で行います。
partitions_example.csvESP32のFlashの容量は4M。デフォルトでのパティションは上記5行目までとなっていて約1M使用しています。そこに今回は6行、”storage, data, spiffs, , 0xF0000,”を追加しSPIFFSで使用する領域の設定を行っています。これで約2MのFlash使用となります。
このファイルを使用してパティションを作成するには、”sdkconfig.defaults”で
sdkconfig.defaultsと設定する必要が有ります。これでパティションの設定が完了。
実際のプログラム
サンプルプログラムは、”/main/main.c”です。予めESP32に保存されたデータを読み出し画面に表示するプログラムです。
main.c- プログラムは53行から始まります。
- 59行:init_spiffs(); SPIFFSの初期設定。
- 本体は41行:void init_spiffs(void)
- 先ずコンフィグレーションを設定します。パラメータは以下の4つ
- .base_path:Mount先へのPath。今回は、rootの下に”spiffs”フォルダーと指定
- .partition_label:パティションの名前の指定。NULLを指定すると、”spiffs”となる様です。
- .max_files:一度に開けるファイル数
- .format_if_mount_failed:Mount failした時の処置の指定。trueを指定するとfailした時に フォーマットされます。
- 50行:esp_vfs_spiffs_register(&conf); この関数でSPIFFS登録とMountを行う。
- 60行:read_station(); データの読み込み
- 本体は16行:void read_station(void)
- fopen() / fclose() / fgets() / fprintf() 等一般的に関数が使用出来ます。
- ここでは、予め保存していたデータを読み込み構造体の各要素に代入しています。
- 62行以降: 読み込んだデータの表示
データを予め保存する
データを予め保存するには、先ずmainフォルダーの下の “CMakeLists.txt” で以下の指定を行います。
CMakeLists.txt4行目がそれです。ここでは予め保存するファイルの所在を指定している様です。
以下が今回保存したファイルです。”~/esp/spiffs/components/spiffs_image”の下に、”station.txt”で保存しています。
station.txt- 構造体の要素(今回は3つ)に合わせてカンマで区切り
- 構造体6個分のデータを保存しています
これで準備は完了です。次はコンパイルと実行です。プロジェクトをここに保存します。
コンパイルと実行
ESP32を使用することを前提にしています。モニターから、”idf.py -p [usb port] flash monitor” で、プログラムがコンパイル実行され、結果がモニターに表示されます。下記はモニターに表示された結果です。6個の構造体の要素が表示されている事が分かります。
Monitor次回は
これでデータをESP32のFlashに保存出来る様になりました。次回はHTTPサーバを立ち上げてこのデータをHPを使って編集する事を目指します。