Arduino-EEPROMライブラリの使い方

  • URLをコピーしました!

当記事では、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読み出し

Read()/EEPROM読み出し
  • 関数:byte Read(int address)
  • 引数:int address⇒アドレス
  • 戻り値:1byteデータ

Read()関数は、引数で指定したEEPROMのアドレスからの1byteデータを戻り値で返します。

Write()/EEPROM書き込み

Write()/EEPROM書き込み
  • 関数:void Write(int address, byte value)
  • 引数:int address⇒アドレス
  •   :byte value⇒1byteデータ
  • 戻り値:なし

Write()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した1byteデータを保存します。

length()/EEPROMメモリ容量取得

length()/EEPROMメモリ容量取得
  • 関数:int length(void)
  • 引数:なし
  • 戻り値:EEPROMメモリ容量

length()関数は、EEPROMのメモリ容量を戻り値で返します。

Get()/EEPROM読み出し2バイト以上

Get()/EEPROM読み出し2バイト以上
  • 関数:void Get(int address, T &data)
  • 引数:int address⇒アドレス
  •   :T & data⇒2byte以上のデータ
  • 戻り値:なし

Get()関数は、引数で指定したEEPROMのアドレスから2byte以上のデータを戻り値で返します。

Put()/EEPROM書き込み2バイト以上

Put()/EEPROM書き込み2バイト以上
  • 関数:void Put(int address, const T &data)
  • 引数:int address⇒アドレス
  •   :T & data⇒2byte以上のデータ
  • 戻り値:なし

Put()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した2byte以上のデータを保存します。

Update()/EEPROM更新

Update()/EEPROM更新
  • 関数:void Update(int address, byte value)
  • 引数:int address⇒アドレス
  •   :byte value⇒1byteデータ
  • 戻り値:なし

Update()関数は、引数で指定したEEPROMのアドレスに、同様に引数で指定した1byteデータを保存します。Write()関数と違い、元のデータが書き込みデータと同じ場合は保存しません。

EEPROM[]/EEPROM読み出し・書き込み

EEPROM/EEPROM読み出し・書き込み
  • 関数:byte EEPROM[int address]
  • 引数:int address⇒アドレス
  • 戻り値:1byteデータ

EEPROM[]は、EEPROMの指定したアドレスに対して1byteデータを取得または保存することができます。Read()関数とWrite()関数を組み合わせた機能を持っています。

サンプルプログラム(サンプルスケッチ)

用意するもの
  1. Arduino Uno
  2. USBケーブル
  3. 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を実現したい方におすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次