2019/05/26
Raspberry Pi Zeroをアクセスポイントとして使う(3)
今回は、ESP8266のSPIFFS(SPI Flash File System)についてお話しします。ESP8266には1MBのArduinoスケッチ領域と3MBのファイルシステム(SPIFFS)領域があります。詳細はこのサイトに詳しく説明されています。また、ESP8266のメモリの情報は、このサイトの以下のプログラムで確認できます。#include <ESP8266WiFi.h>結果は以下の通りで、実装メモリが4MBであることが確認できました。
void setup(void) {
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.println("-----ESP-WROOM-02 ( ESP8266 ) Chip Infomation -----");
Serial.println();
Serial.print("Core Version = ");
Serial.println(ESP.getCoreVersion());
Serial.print("CPU Frequency = ");
Serial.print(ESP.getCpuFreqMHz());
Serial.println(" MHz");
Serial.print("ChipID = ");
Serial.println(ESP.getChipId(), HEX); //MACアドレスの下位3バイト
Serial.print("Flash ID = ");
Serial.println(ESP.getFlashChipId(), HEX);
Serial.print("SDK version = ");
Serial.println(ESP.getSdkVersion());
Serial.print("Boot version = ");
Serial.println(ESP.getBootVersion());
Serial.print("Boot Mode = ");
Serial.println(ESP.getBootMode());
Serial.print("Flash Chip IDE Size = ");
Serial.print(ESP.getFlashChipSize()); //Arduino IDE 設定の Flash Size になる
Serial.println(" byte");
Serial.print("Flash Chip Real Size = ");
Serial.print(ESP.getFlashChipRealSize()); //ESP-WROOM-32 内蔵最大 Flash Size になる
Serial.println(" byte");
Serial.print("Flash Frequency = ");
Serial.print(ESP.getFlashChipSpeed());
Serial.println(" Hz");
String mode_str;
switch( ESP.getFlashChipMode() ){
case 0: mode_str = "QIO"; break;
case 1: mode_str = "QOUT"; break;
case 2: mode_str = "DIO"; break;
case 3: mode_str = "DOUT"; break;
case 4: mode_str = "Unknown"; break;
default: break;
}
Serial.println("Flash Chip Mode = " + mode_str);
Serial.print("Free Heap Size = ");
Serial.println(ESP.getFreeHeap());
Serial.print("Free Sketch Size = ");
Serial.println(ESP.getFreeSketchSpace());
Serial.print("Sketch Size = ");
Serial.println(ESP.getSketchSize());
Serial.println();
uint8_t mac0[6];
WiFi.macAddress(mac0);
Serial.printf("WiFi StationAP Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac0[0], mac0[1], mac0[2], mac0[3], mac0[4], mac0[5]);
uint8_t mac1[6];
WiFi.softAPmacAddress(mac1);
Serial.printf("WiFi SoftAP Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac1[0], mac1[1], mac1[2], mac1[3], mac1[4], mac1[5]);
}
void loop() {
}

1回目に温湿度、気圧を計測できるセンサ(BME280)をつないだESP8266からWi-FiでデータをRaspberry Pi Zero(アクセスポイント)に自動で飛ばすシステムを構築するとお話ししましたが、このデータの一時保存としてSPIFFSを利用しようと考えました。早速、このサイトを参考にファイルシステムを利用できる環境を整えました。
このサイトのreleases pageをクリックし、



ファイルシステムが利用できるようになりましたので、以下のファイル(index.html)を作成し、SPIFFSに書き込んでみました。
<html>作成スケッチのフォルダ内にdataフォルダを作成し、その中にファイルを保存し、
<body>
<h1>SPIFFS test</h1>
</body>
</html>


次に、ファイルが確実に書き込まれているかを確認するために、SPIFFS内の情報を以下のプログラムで確認しました。
#include <FS.h>実行結果は以下の通りで、正しくフラッシュメモリ上に書き込まれていることが分かりました。
String filename;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("");
SPIFFS.begin();
Dir dir = SPIFFS.openDir("/");
while (dir.next()) {
filename = dir.fileName();
Serial.println("File Name: "+dir.fileName());
File f = dir.openFile("r");
Serial.println(String(" ") + f.size());
Serial.println(f.readStringUntil('¥n'));
Serial.println(f.readString());
}
}
void loop() {
}

次に、書き込まれたindex.htmlをWebページとして表示させるために、以下のプログラムを作成し、実行しました。ESP8266をアクセスポイントとして利用します。
#include <ESP8266WiFi.h>最後にネットワークをESP8266のアクセスポイント(ESP8266ーIoT)に切り替え、
#include <ESP8266WebServer.h>
#include <FS.h>
#define WIFI_SSID "ESP8266-IoT"
#define WIFI_PWD "drbobt123"
ESP8266WebServer server( 80 );
IPAddress ip( 192, 168, 5, 1);
IPAddress subnet( 255, 255, 255, 0 );
void setup() {
SPIFFS.begin();
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(ip, ip, subnet);
WiFi.softAP(WIFI_SSID, WIFI_PWD);
server.begin();
server.on("/",[]() {
String tmp;
File index = SPIFFS.open("/index.html", "r"); //index.html Open
if(!index)
Serial.println("file open failed");
else{
Serial.println("file open succeeded");
tmp = index.readString(); //Read index.html by string
index.close(); //close file
}
server.send(200, "text/html", tmp);} );
}
void loop() {
server.handleClient();
}


簡便にESP8266のフラッシュメモリ内にファイルを保存できるので、様々な用途に利用できそうです。次回は、ESP8266からRaspberry Pi ZeroへのFTP通信のお話をします。