SPIFFS檔案系統

ESP32及ESP8266都有內建快閃記憶體,容量要看不同的晶片用不同的容量,普遍來說應該有4MB,這些記憶體可用來儲存APP,剩下的空間則可用來當做檔案儲存的空間(不太大,要善用),這些空間內部的資料不會因為沒有電而消失,所以有一些檔案可以考慮儲存到這個地方。SPIFFS則是用來管理這個空間的檔案系統,透過SPIFFS的函式,我們可以掛載這個檔案系統、格式化、建立資料夾或檔案、儲存檔案、刪除資料夾或檔案。ESP32及ESP8266雖然都能夠連接網路,將資料儲存到雲端,但是還有很多地方是網路的死角,在沒有網路的地方要儲存資料,解決方法就是加個記憶卡,真的沒有記憶卡的話,另一個解決方案便是儲存到SPIFFS了。關於記憶卡的儲存積木,可以參考我以前寫的這篇「SD記憶卡積木」,這篇則是如何使用積木進行SPIFFS的檔案操作,積木位於「吉哥積木」→「ESP32」→「SPIFFS檔案系統內,ESP32以及ESP8266都可以使用。

範例一:

程式分主要分三個部份,掛載SPIFFS,嘗試寫入檔案,並將它讀出顯示在OLED

一、掛載SPIFFS

  1. 初始化時「SPIFFS初始化」積木會嘗試將SPIFFS掛載,如果是第一次掛載,系統會嘗試將SPIFFS格式化,會花比較久的時間。

  2. 判斷是否掛載成功,如果沒有掛載成功,再一次嘗試將SPIFFS格式化。

  3. 宣告一個myFile的檔案變數,用來開啟及寫入檔案用的。

二、重複執行積木先寫入檔案

  1. 先判斷SPIFFS是否掛載成功,有掛載才功才寫入檔案

  2. 設定myFile檔案物件,以「覆寫」的模式開啟「/rec.txt」這個檔案,檔案若不在會自動建立一個;如果檔案已在SPIFFS,則裡面的內容會被新的內容蓋住,因為是以覆寫」的模式開啟。請注意,檔案名稱須包含路徑,例如rec.txt是放在根目錄的話,要設定成「/rec.txt」,前面要加上根目錄的斜線。開啟檔案除了「覆寫」之外,還有「唯讀」和「接續寫入檔案之後」,「接續寫入檔案之後」模式,代表會將現在寫入的資料,接在原本的檔案後面繼續寫入,所以原本的檔案內容不會被蓋掉。

  3. 判斷myFile是否開啟檔案成功,成功的話才開始寫入資料,用一個迴圈在檔案內寫入三行文字。寫入文字檔案內容有二種模式,在這裡使用的是「寫入一行文字」,表示寫入文字的最後面會有個換行符號。如果是使用「寫入文字」模式,則所有內容會連接成同一行。

  4. 寫完檔案之後,記得要使用關閉檔案積木,將檔案正常關閉。

三、重複執行積木的後半段,將檔案讀出來,並顯示在OLED上

  1. 設定myFile檔案物件,以「唯讀」的模式開啟「/rec.txt」這個檔案。

  2. 判斷myFile是否開啟檔案成功,成功的話才開始讀取資料。

  3. 藉由一個「重覆」迴圈,條件為「SPIFFS檔案物件尚未讀取到檔尾」的積木,便可以將檔案從頭讀到尾。

  4. 迴圈內藉由「SPIFFS 讀取一行文字」積木,將檔案內容一行一行讀取出來,顯示在OLED上。

  5. 讀完檔案記得要將檔案正常關閉。

感測資料的儲存與讀取

範例二:將感測資料存到SPIFFS檔案系統

在沒有網路的環境要記錄感測資料,沒有雲端可儲存,又沒有SD記憶卡,這時SPIFFS便可以發揮很大的作用。但是要注意,不要存了太多資料而讓SPIFFS爆了,在專案結束之後也要記得要檔案刪除。

一、程式初始化的時候

  1. 因為要記錄感測資料的時間,所以先在初始化的時候,手動設定ESP32的RTC時間(模擬沒有網路,所以不透過網路校正時間)。

  2. SPIFFS掛載後,開啟「/temperature.txt」,模式選擇「接續寫入檔案之後,檔案不存在則自動建立檔案」。

  3. 檔案的第一行寫入「時間,溫度,濕度」這個字串,可以日後匯入試算表時當做標題,這一段如果不想做也可以不用。

二、重複執行時

  1. 用二個變數記錄溫濕度資料。

  2. 將「RTC時間,偵測到的溫度,偵測到的濕度」組合成的一行文字寫入「/temperature.txt」檔案中。

  3. 變數sum用來記錄現在已經儲存多少筆資料,並將偵測到的溫濕度顯示在OLED上。


程式結果:

範例三:將範例二儲存的檔案透過序列埠讀取出來

程式初始化時,便開始讀取檔案「/temperature.txt」,記得,如果專案結束時,要將SPIFFS裡的檔案刪除,才不會佔用空間。

  1. 設定SPIFFS、OLED、序列埠初始化

  2. 判斷SPIFFS掛載成功,便讓myFile檔案物件以唯讀的方式開啟「/temperature.txt」

  3. 藉由一個「重覆」迴圈,條件為「SPIFFS檔案物件尚未讀取到檔尾」的積木,便可以將檔案從頭讀到尾。

  4. 將檔案中每一行讀到的資料以序列埠傳送到電腦透過putty讀取出來。


程式結果:

開啟BlocklyDuino的putty程式,讓putty接收來自序列埠傳來的檔案資料,將其拷貝到試算表內

範例四:刪除檔案以及格式化SPIFFS

SPIFFS的儲存空間有限,所以不要塞太多資料在這裡,偶爾要對SPIFFS內部刪除不必要的檔案,若是懶得一個一個刪檔案,直接對SPIFFS格式化也可以,以下的範例,按下A鍵刪除/test1.txt;按下B鍵,刪除/www/test2.txt,請記住,檔名一定要加上絕對路徑,根目錄底下的檔案,前面一定要加上代表根目錄的「/」符號。按下「A+B」的按鈕,則會將SPIFFS格式化,格式化大約會花10到30秒的時間。