自分で覚えておく方法(Arduino詳解)

Arduino詳解その23です。前回の記事はこちらです。
hirocom777.hatenadiary.org

設定を覚えておく

 ちょっとしたガジェットをArduinoで作るとして、設定を変えるごとにスケッチを書き直して書き込むのはちょっとめんどくさい。自分自身で設定を書き込んで電源を一度切っても設定を覚えておくようにしたい、って思うことがあります。そしてArduinoUNOには、この要求を実現する機能があります。

f:id:HiroCom777:20201023225903j:plain
 ArduinoUNOで使用されているCPU(ATmega328)にはEEPROMという機能が搭載されています。EEPROMとは電気的に書き換え可能な不揮発性(電源を切っても書き込んだ内容が消えない)メモリのことです。そしてArduinoには、EEPROMをかんたんに利用するライブラリが標準で提供されています。

EEPROMの使用例

 それでは、EEPROMを使用したスケッチ例をご紹介します。

#include <EEPROM.h>

byte byteValue;
int intValue;
long longValue;
float floatValue;

int eepAddress = 0;

void setup() {
  Serial.begin(9600);
  byteValue = EEPROM.read(eepAddress);
  Serial.println(byteValue);
  EEPROM.get(eepAddress + 1, intValue );
  Serial.println(intValue);
  EEPROM.get(eepAddress + 3, longValue );
  Serial.println(longValue);
  EEPROM.get(eepAddress + 7, floatValue );
  Serial.println(floatValue, 7);
}

void loop() {
  if (Serial.available()) {
    byte inputNumber = Serial.parseInt();
    byteValue = inputNumber;
    intValue = byteValue * 256;
    longValue = intValue * 65536;
   floatValue = float(intValue)/13;

    EEPROM.write(eepAddress, byteValue);
    Serial.println(byteValue);
    EEPROM.put(eepAddress + 1, intValue );
    Serial.println(intValue);
    EEPROM.put(eepAddress + 3, longValue );
    Serial.println(longValue);
    EEPROM.put(eepAddress + 7, floatValue );
    Serial.println(floatValue, 7);
  }
}

 このスケッチは、ArduinoUNOをリセットするとEEPROMのアドレス0から格納されている値を読みだしてシリアルモニターに表示する動作をします。アドレス0にはバイト型データ。アドレス1からは整数型データ。アドレス3からは長整数型データ。アドレス7からは浮動小数点型データを読み出します。それぞれの変数型のバイト数だけアドレスが飛んでいます。(一番最初は浮動小数点型データだけは"nan"と返ってくるかもしれません。これは数値化できないデータが入っていたという意味です。)

この状態でシリアルモニターの一番上の送信欄に0~255の数字を入力を入力してみてください。すると、異なる値が表示されました。例えば"3"と入力すると、以下の様に表示されたと思います。

3
768
50331648
59.0769233

上から、入力された値、256倍した整数値、256倍した値をさらに65536倍した長整数値、256倍した値を13で割った浮動小数点値となり、それぞれをアドレス0、1、3、7に書き込んでいます。この状態でArduinoUNOをリセットすると、今度は上で書き込んだ値が返ってくるはずです。一度電源を切っても記録した内容は消えません。

EEPROMの使い方

 使い方について説明します。EEPROMを使う場合はスケッチの先頭に #include <EEPROM.h> と記述してEEPROMのライブラリを使用する宣言をします。以降、以下の関数が使用できます。

EEPROM.read()

 カッコの中にEEPROMのアドレス(ArduinoUNOの場合0~1023)を指定して1バイトのデータを読み取って返します。以下のように記述します。

 EEPROM.read(アドレス)

EEPROM.write()

 指定されたアドレスに1バイトのデータを書き込みます。以下のように記述します。

 EEPROM.write(アドレス、データ(1バイト))

EEPROM.get()

 指定されたアドレスからデータを読み取って変数に入力します。読み取るバイト数は指定された変数の型によります。(バイト型:1、整数型:2、長整数型:4、浮動小数点型:4)以下のように記述します。

 EEPROM.get(アドレス、変数)

EEPROM.put()

 指定されたアドレスに変数の内容を書き込みます。書き込むバイト数は指定された変数の型によります。以下のように記述します。

 EEPROM.put(アドレス、変数)

ちょっと本格的になったかな?

 いかがでしょうか。設定を記憶できるようになると、本格的なガシェットに近づいた感がありますよね。次回もEEPROMについてご紹介します。お楽しみに!!
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!