ESP32でWebデータをFlashから読み出し
概要
ESP-WROOM-32のFlashにはFilesystem領域と呼ばれるスペースが確保されており、そこにファイルを保存することが出来ます。
今回はsoftAPモードでWebサーバーを起動し、Flashから読み込んだWebデータをブラウザに表示させます。
また、今回は標準のライブラリではなく「ESPAsyncWebServer」ライブラリでWebサーバーを構築しています。
これはESP32で非同期なサーバーを実現できるライブラリです。非同期なのでプログラム上では常にclientを監視しなくてもよくなり、loop内でLチカ等の他のプログラムを動かしながらサーバーも動かせます。
実行環境
MCU:ESP32-Devkit-C(ESP-WROOM-32)
IDE:PlatformIO(Core 6.1.7·Home 3.4.4) ※Arduinoでも可(なはず)
参考サイト
ライブラリのインストール
まずWebサーバー機能を実装するのに使うライブラリを「ESPAsyncWebServer」をインストールします。
次にESPAsyncWebServerの動作に必要なライブラリ「AsyncTCP」をインストールします。
フラッシュ書き込み用ツールのインストール(PlatformIOでは不要)
画面表示に必要なhtmlファイルやCSSファイルはESP32内蔵Flashに書き込むため、書き込みツール「ESP32FS」が必要になります。
まずESP32FSをGithubのリリースページからダウンロードします。
ダウンロードしたものを解凍し、Arduinoフォルダのtoolsフォルダに保存します。
例)C:\Users\USER\Documents\Arduino\tools\ESP32FS
Arduino IDE を起動し、「ツール」メニューに「ESP32 Sketch Data Upload」という項目が作られていればインストール完了です。
サンプルコード
ESP32をsoftAPモードに設定し、Flashに保存された「index.html」と「style.css」をポート80で公開するプログラムです。
プロジェクトの作成と書き込みの手順は省略します。
#include <WiFi.h> #include "ESPAsyncWebServer.h" #include "SPIFFS.h" const char ssid[] = "ESP32AP-TEST"; const char pass[] = "12345678"; // パスワードは8文字以上にする const IPAddress ip(192,168,123,45); // ESP32のIPアドレス const IPAddress subnet(255,255,255,0); // サブネットマスク AsyncWebServer server(80); // ポート設定 void setup() { Serial.begin(115200); // SPIFFSのセットアップ if(!SPIFFS.begin(true)){ Serial.println("An Error has occurred while mounting SPIFFS"); return; } WiFi.softAP(ssid, pass); // SSIDとパスの設定 delay(100); // このdelayを入れないと失敗する場合がある WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定 IPAddress myIP = WiFi.softAPIP(); // WiFi.softAPIP()でWiFi起動 // 各種情報を表示 Serial.print("SSID: "); Serial.println(ssid); Serial.print("AP IP address: "); Serial.println(myIP); // GETリクエストに対するハンドラーを登録 // rootにアクセスされた時のレスポンス server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(SPIFFS, "/index.html"); }); // style.cssにアクセスされた時のレスポンス server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(SPIFFS, "/style.css", "text/css"); }); // サーバースタート server.begin(); Serial.println("Server start!"); } void loop() {}
Webページの作成
Webページの保存用フォルダの作成
まずは保存用フォルダを作成します。
PlatformIO
プロジェクトフォルダのルートに「data」フォルダを作成します。
Arduino
.inoと同じフォルダに「data」フォルダを作成します。
Webページの作成
「data」フォルダの中にWebページのデータを保存します。
index.html
<!DOCTYPE html> <html> <head> <title>ESP32 Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="data:,"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1>ESP32 Web Server</h1> <p>GPIO state: <strong> %STATE%</strong></p> <p><a href="/on"><button class="button">On</button></a></p> <p><a href="/off"><button class="button button2">Off</button></a></p> </body> </html>
style.css
html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center; } h1{ color: #0F3376; padding: 2vh; } p{ font-size: 1.5rem; } .button { display: inline-block; background-color: #008CBA; border: none; border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer; } .button2 { background-color: #f44336;
WebページをFlashに書き込む
Arduino
「ツール」メニューから「ESP32 Sketch Data Upload」を実行すると、「data」フォルダに保存されているファイルがFlashに書き込まれます。
PlatformIO
「PROJECT TASK」→「esp32dev」→「Platform」にある「Upload Filesystem Image」を実行することで、「data」フォルダに保存されているファイルがFlashに書き込まれます。
実行
Arduino IDEから「シリアルモニタ」を起動し、ESP32のリセットボタンを押して起動時のログを確認します。
その中からSSIDとIPアドレスが表示されていれば、ESP32がアクセスポイントモードで起動しています。
PCやスマホ等をESP32のアクセスポイントに接続し、設定したIPアドレス(例: 192.168.123.45)にブラウザでアクセスします。
これまでの手順に問題がなければ以下の画面が表示されます。
ディスカッション
コメント一覧
まだ、コメントがありません