どうも、なかしーです。
僕は自動車のマイコンにプログラミングをする組み込みエンジニアとして働きつつ、YouTubeで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でデータを保存して、読み込むプログラムを作りました。
#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型のように分割が必要なときはビットシフトとマスク処理を行います。
#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入門キット