ArduinoのEEPROMの使い方【データを保存可能】

どうも、なかしーです。

僕は自動車のマイコンにプログラミングをする組み込みエンジニアとして働きつつ、YouTubeでArduinoの使い方を解説しています。

Arduino初心者
Arduino初心者

Arduinoの電源を切るとデータが消えるんだけど、保存することはできないのかなぁ?

という悩みを解決します。

プログラムで宣言した変数のデータは電源を切ると初期化されてしまいます。

電源を切る前のデータを保存したり、重要なところだけ残しておきたいといった時は変数だけで実現するのは難しいでしょう。

そこで役立つのが今回紹介するEEPROMです。

電源を切ってもEEPROMに保存しておけば、データが消えることはありません。

電源を再び入れたときにデータを読み出すことで、前回のデータを利用することができます。

ちなみに、動画でもEEPROMの使い方を解説しています!

EEPROMとは?

ROM(Read Only Memoryの略)の種類で、電源を切ってもデータを保存できる特徴があります。

反対に電源を切るとデータが消えてしまうのがRAM(Random Access Memoryの略)です。

プログラムの変数はRAMを使っているので、電源を切るとデータが消えてしまいます。

EEPROMにはアドレスが割り振ってある

アドレスは家の住所と同じ意味です。

アドレスごとにデータを保存できるんですが、ArduinoのEEPROMの場合は8ビット(1バイト)分のデータしか入りません。

8ビットのchar型やunsigned char型で宣言した場合はそのまま保存することが可能です。

しかし、16ビットのint型などで宣言をすると8ビット分はみ出すのでデータを2つに分ける必要があります。

なかしー
なかしー

データの分け方はプログラムのところで解説します!

最大保存できる容量も決まっていて、Arduino UNOの場合は1000kBとなっています。

文字を表示する時に使うアスキコードが1文字1バイトなので、1000文字分を保存することが可能です。

ArduinoでEEPROMを制御する

Arduinoには標準でEEPROM用の関数が入っています。

使う関数はこの2つです。

  • EEPROM.read(アドレス)
  • EEPROM.write(アドレス, データ)

2つの関数を使ってArduinoでデータを保存して、読み込むプログラムを作りました。

HTML
#include 

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned char data = 0;
  
  data = EEPROM.read(0);
  Serial.println(data);
  EEPROM.write(0, data + 1);
  data = EEPROM.read(0);
  Serial.println(data);
  while(1);
}

シリアルモニタを開いた状態で、プログラムを書きこんで実行すると「前回のデータ」をアドレス0から読み出し、プラス1したデータをアドレス0に書き込むようになっています。

データを分割して保存する方法

int型のように分割が必要なときはビットシフトとマスク処理を行います。

HTML
#include 

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned int data = 0x1234;

  EEPROM.write(0, (unsigned char)((data >> 8) & 0x00FF));
  EEPROM.write(1, (unsigned char)(data & 0x00FF));
  
  data = EEPROM.read(0);
  Serial.println(data,HEX);
  data = EEPROM.read(1);
  Serial.println(data,HEX);
  while(1);
}

ビットシフトは「>>」もしくは「<<」を使います。

シフトさせたいデータを左側に入力し、方向に合わせて記号を入力します。

右側にシフトさせたい数を入力します。

そうすることで16ビットのデータを8ビットのデータに分割することができます。

また、0x00FFの論理積の計算することで下位8ビットのみを有効にしています。

この計算をマスクと呼びます。

ArduinoのEEPROMの使い方|まとめ

この記事では「ArduinoのEEPROMの使い方」について解説しました。

EEPROMは変数を扱っているRAMとは違い、電源を切ってもデータを保存しておくことができます。

EEPROM用の関数は

  • EEPROM.read(アドレス)
  • EEPROM.write(アドレス, データ)

この関数を使うにはヘッダーファイルのインクルードが必要です。

EEPROMはアドレスが割りふってあって、1つのアドレスに8ビット分のデータしか入りません。

int型の変数など8ビットを超える場合はデータを分割する必要があり、分割するにはビットシフトやマスクを使うと良いでしょう。

また、共用体を使う方法もあります。

Arduino関連の人気記事

>>【Arduino入門キット】電子工作の勉強におすすめ【こんなに安くていいの?】

>>Arduinoをゼロから勉強する方法を紹介【参考書は不要】

>>Arduinoのプログラムの書き方【基本的なルールは4つある】

当ブログで人気のArduino入門キット

第1位:Arduino UNO スターターキット
Arduino UNOのスタータキットです。電子工作でよく使う部品が一式揃っており、バラバラで購入するより格段に安いです。
第2位:ELEGOO Arduino用のUNO R3 最終版スタータキット
こちらも電子工作によく使う部品が第一位のスタータキットよりたくさん入っています。とてもお買い得です。
第3位:ELEGOO Arduino MEGA 2560 R3
UNOの上位互換版MEGAのスターターキットです。これだけ入っていれば十分に電子工作の基本をマスターできることでしょう。
エンジニアが教えるArduino入門講座のまとめ【解説動画付き】