Arduino-EEPROMライブラリの使い方
当記事では、ArduinoのEEPROMライブラリの使い方について詳しく解説します。
Arduinoボードには、電源を切った後でもデータを保持できる不揮発性メモリ「EEPROM」が実装されており、EEPROMライブラリを使うことで、EEPROMにデータを読み出し/書き込みなどをすることができます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
EEPROMライブラリ
関数 | 引数 | 戻り値 | 説明 |
---|---|---|---|
byte Read(int address) | int address:アドレス | 1byteデータ | EEPROMの指定したアドレスから1byteデータを取得 |
void Write(int address, byte value) | int address:アドレス byte value:1byteデータ | なし | EEPROMの指定したアドレスに1byteデータを保存 |
int length(void) | なし | EEPROMメモリ容量 | EEPROMメモリ容量を取得 |
void Get(int address, T & data) | int address:アドレス T &data:2byte以上のデータ | なし | EEPROMの指定したアドレスから2byte以上のデータを取得 |
void Put(int address, const T & data) | int address:アドレス T &data:2byte以上のデータ | なし | EEPROMの指定したアドレスに2byte以上のデータを保存 |
void Update(int address, byte value) | int address:アドレス byte value:1byteデータ | なし | EEPROMの指定したアドレスに1byteデータを保存、元データと書き込みデータが同じ場合、保存しない |
byte EEPROM[int address] | int address:アドレス | 1byteデータ | EEPROMの指定したアドレスから1byteデータを取得、 EEPROMの指定したアドレスに1byteデータを保存 |
Read()/EEPROM読み出し
- 関数:byte Read(int address)
- 引数:int address⇒アドレス
- 戻り値:1byteデータ
Read()関数は、引数で指定したEEPROMのアドレスからの1byteデータを戻り値で返します。
Write()/EEPROM書き込み
- 関数:void Write(int address, byte value)
- 引数:int address⇒アドレス
- :byte value⇒1byteデータ
- 戻り値:なし
Write()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した1byteデータを保存します。
length()/EEPROMメモリ容量取得
- 関数:int length(void)
- 引数:なし
- 戻り値:EEPROMメモリ容量
length()関数は、EEPROMのメモリ容量を戻り値で返します。
Get()/EEPROM読み出し2バイト以上
- 関数:void Get(int address, T &data)
- 引数:int address⇒アドレス
- :T & data⇒2byte以上のデータ
- 戻り値:なし
Get()関数は、引数で指定したEEPROMのアドレスから2byte以上のデータを戻り値で返します。
Put()/EEPROM書き込み2バイト以上
- 関数:void Put(int address, const T &data)
- 引数:int address⇒アドレス
- :T & data⇒2byte以上のデータ
- 戻り値:なし
Put()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した2byte以上のデータを保存します。
Update()/EEPROM更新
- 関数:void Update(int address, byte value)
- 引数:int address⇒アドレス
- :byte value⇒1byteデータ
- 戻り値:なし
Update()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した1byteデータを保存します。Write()関数と違い、元のデータが書き込みデータと同じ場合は保存しません。
EEPROM[]/EEPROM読み出し・書き込み
- 関数:byte EEPROM[int address]
- 引数:int address⇒アドレス
- 戻り値:1byteデータ
EEPROM[]は、EEPROMの指定したアドレスに対して1byteデータを取得または保存することができます。Read()関数とWrite()関数を組み合わせた機能を持っています。
サンプルプログラム(サンプルスケッチ)
- Arduino Uno
- USBケーブル
- PC(プログラム書き込み・シリアルモニタ表示)
Read()/EEPROM読み出し
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value;
value = EEPROM.read(0x000);//アドレス「0x000」のデータを読み込み、「value」に代入
Serial.print("アドレス0x000:");//文字列「アドレス0x000:」をシリアルモニタに送信
Serial.println(value);//「value」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000:255
サンプルプログラムでは、EEPROMのアドレス「0x000」のデータを読み込み、シリアルモニタにデータを表示させます。
Write()/EEPROM書き込み
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value;
EEPROM.write(0x000, 59);//アドレス「0x000」にデータ「59」を書き込み
value = EEPROM.read(0x000);//アドレス「0x000」のデータを読み込み、「value」に代入
Serial.print("アドレス0x000:");//文字列「アドレス0x000:」をシリアルモニタに送信
Serial.println(value);//「value」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000:59
サンプルプログラムでは、EEPROMのアドレス「0x000」にデータ「59」を書き込んだ後、EEPROMのアドレス「0x000」のデータを読み込み、シリアルモニタにデータを表示させます。
length()/EEPROMメモリ容量取得
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int size;
size = EEPROM.length();//EEPROMのメモリ容量を取得、「size」に代入
Serial.print("EEPROMメモリ容量:");//文字列「EEPROMのメモリ容量:」をシリアルモニタに送信
Serial.print(size);//「size」をシリアルモニタに送信
Serial.println("Byte");//文字列「Byte」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
EEPROMメモリ容量:1024Byte
サンプルプログラムでは、EEPROMのメモリ容量を取得してシリアルモニタに表示させます。
Get()/EEPROM読み出し2バイト以上
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value;
EEPROM.put(0x000, 511);//アドレス「0x000」からデータ「511」を書き込み
EEPROM.get(0x000, value);//アドレス「0x000」のデータを読み込み、「value」に代入
Serial.print("アドレス0x000-0x001:");//文字列「アドレス0x000-0x001:」をシリアルモニタに送信
Serial.println(value);//「value」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000-0x001:511
サンプルプログラムでは、put()関数で、EEPROMのアドレス「0x000」に2バイト以上のデータ「511」を書き込んだ後、get()関数で、EEPROMのアドレス「0x000」の2バイト以上のデータ「511」を読み込み、シリアルモニタにデータを表示させます。
Put()/EEPROM書き込み2バイト以上
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value_1, value_2;
EEPROM.put(0x000, 511);//アドレス「0x000」からデータ「511」を書き込み
value_1 = EEPROM.read(0x000);//アドレス「0x000」のデータを読み込み、「value_1」に代入
value_2 = EEPROM.read(0x001);//アドレス「0x001」のデータを読み込み、「value_2」に代入
Serial.print("アドレス0x000:");//文字列「アドレス0x000:」をシリアルモニタに送信
Serial.println(value_1);//「value_1」をシリアルモニタに送信、改行
Serial.print("アドレス0x001:");//文字列「アドレス0x001:」をシリアルモニタに送信
Serial.println(value_2);//「value_2」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000:255
アドレス0x001:1
サンプルプログラムでは、put()関数で、EEPROMのアドレス「0x000」に2バイト以上のデータ「511」を書き込んだ後、read()関数で、EEPROMのアドレス「0x000」と「0x001」のデータを読み込み、シリアルモニタにデータを表示させます。
put()関数で書き込んだデータは2バイトのデータとなるので、アドレス「0x000」と「0x001」に書き込まれることになります。
そのため、read()関数で読み込んでみると、アドレス「0x000」に下位データの255(0xFF)、アドレス「0x01」に上位データの1(0x01)が保存されており、2つのデータを結合させると、511(0x01FF)になることがわかります。
Update()/EEPROM更新
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value;
EEPROM.update(0x000, 59);//アドレス「0x000」にデータ「59」を書き込み、元のデータが「59」の場合、書き込みしない
value = EEPROM.read(0x000);//アドレス「0x000」のデータを読み込み、「value」に代入
Serial.print("アドレス0x000:");//文字列「アドレス0x000:」をシリアルモニタに送信
Serial.println(value);//「value」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000:59
サンプルプログラムでは、EEPROMのアドレス「0x000」にデータ「59」を書き込んだ後、EEPROMのアドレス「0x000」のデータを読み込み、シリアルモニタにデータを表示させます。
update()関数とWrite()関数の違いは、元のデータが書き込みデータと同じ場合は保存しません。このサンプルプログラムの場合は、すでに書き込まれているデータが「59」の場合は、新たに書き込みはしないことになります。
EEPROM[]/EEPROM読み出し・書き込み
#include <EEPROM.h>
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int value;
EEPROM[0x000] = 59;//アドレス「0x000」にデータ「59」を書き込み
value = EEPROM[0x000];//アドレス「0x000」のデータを読み込み、「value」に代入
Serial.print("アドレス0x000:");//文字列「アドレス0x000:」をシリアルモニタに送信
Serial.println(value);//「value」をシリアルモニタに送信、改行
while(1);//無限ループ・プログラム停止
}
アドレス0x000:59
サンプルプログラムでは、EEPROMのアドレス「0x000」にデータ「59」を書き込んだ後、EEPROMのアドレス「0x000」のデータを読み込み、シリアルモニタにデータを表示させます。
EEPROM[]は、Read()関数とWrite()関数の両方を組み合わせた機能を持っており、より簡潔にプログラムが作成できるので使い勝手が良いです。
おすすめのArduinoボードはどれ?
当記事『Arduino-EEPROMライブラリの使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。