www.switch-science.com
には4MBの不揮発フラッシュメモリが搭載されています。
ちょっとしたデータロガーを作ろうとSDカードモジュール引っ張り出したのですが
短い稼働時間なら十分かなと思い、このフラッシュメモリを使ってみることに。
実際のところ
Atom LiteはESP32 Pico系なので同型のサンプルを漁ってみたらESP32のサンプルのなかに”eeprom_write.ino”というのが。
EEPROMライブラリ自体はArduino IDEにもとからあるもので、開始アドレス等々の設定値がボード毎に違う様子。
/* EEPROM Write Stores random values into the EEPROM. These values will stay in the EEPROM when the board is turned off and may be retrieved later by another sketch. */ #include "EEPROM.h" // the current address in the EEPROM (i.e. which byte // we're going to write to next) int addr = 0; #define EEPROM_SIZE 64 void setup() { Serial.begin(115200); Serial.println("start..."); if (!EEPROM.begin(EEPROM_SIZE)) { Serial.println("failed to initialise EEPROM"); delay(1000000); } Serial.println(" bytes read from Flash . Values are:"); for (int i = 0; i < EEPROM_SIZE; i++) { Serial.print(byte(EEPROM.read(i))); Serial.print(" "); } Serial.println(); Serial.println("writing random n. in memory"); } void loop() { // need to divide by 4 because analog inputs range from // 0 to 1023 and each byte of the EEPROM can only hold a // value from 0 to 255. // int val = analogRead(10) / 4; int val = byte(random(10020)); // write the value to the appropriate byte of the EEPROM. // these values will remain there when the board is // turned off. EEPROM.write(addr, val); Serial.print(val); Serial.print(" "); // advance to the next address. there are 512 bytes in // the EEPROM, so go back to 0 when we hit 512. // save all changes to the flash. addr = addr + 1; if (addr == EEPROM_SIZE) { Serial.println(); addr = 0; EEPROM.commit(); Serial.print(EEPROM_SIZE); Serial.println(" bytes written on Flash . Values are:"); for (int i = 0; i < EEPROM_SIZE; i++) { Serial.print(byte(EEPROM.read(i))); Serial.print(" "); } Serial.println(); Serial.println("----------------------------------"); } delay(100); }
こいつをもとに、少し改造してみます。
メーカーの発表によると、こいつの石はesp32-pico-d4だそう。
仕様PDFをみると
ボードの方はリセットボタンをおした時に返ってくる反応が
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:8896 load:0x40080400,len:5816 entry 0x400806ac start...
開始アドレスはライブラリの方でよろしくやってくれる様子。
不揮発領域にちゃんと保存するにはcommit()
公式サンプルをそのまんま実行すると、リセットの度にEEPROMにwriteしたはずの値が吹き飛びます。
beginが悪いのか等々調べて回りましたが……なんと公式リファレンスにも書いてない穴が。
不揮発領域に保存するためにはwriteやputをやったあとにcommitを実行しないと不揮発領域に書き込まれません。
試しに
ESP32版の版Githubのコードを見に行くと、
writeは内部メモリに確保され、クラスが閉じるか、明示的にcommitするとEEPROMを読み出しに行くようになっています。
寿命が限られるEEPROMのためを思っての実装なんでしょうが、せめて公式ドキュメントに残すくらいの気心はあってもよかった気が……。
参考もと
ESP32 - AtomLiteのフラッシュメモリへのセンサー値の格納方法について|teratail
ESP32 Modules and Boards - ESP32 - — ESP-IDF Programming Guide latest documentation
https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf(PDF ハードウェアの方)
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf(PDF ソフトウェアの方)
Arduino - EEPROM
neko-memo.com