Arduino I2C シリアルEEPROMの利用

# 概要
ディスプレイ付きで便利なマイコン「Waveshare RP2040-LCD-0.96」ですが、ちょっとしたデータを
保存するためのEEPROMが付属していません。そこでI2CシリアルEEPROMを利用します。
いろいろ調べたところ便利そうなライブラリがありましたので活用させて頂きました。
float型やString型でも簡単なコードで書き込みができました。

![スクリーンショット 2023-05-18 131014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/c66a2287-6bc4-6e33-cee4-195a6c99769b.png)


# 環境
マイコン：Waveshare RP2040-LCD-0.96
EEPROM型番:24LC512-I/P
エディタ：VisualStudioCode（拡張機能：PlatformIO IDE）
ライブラリはPlatformIOで以下の3つをインストール
　1.　SparkFun_External_EEPROM
　2.　U8g2_for_Adafruit_GFX
　3.　Adafruit ST7735 and ST7789 Library

# 配線図
![スクリーンショット 2023-05-18 133118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/70bb62df-fb2a-5d97-0bd9-df1179b6b910.png)


# コード
``` cpp
#include <Arduino.h>
#include <Adafruit_ST7735.h>

#include <SPI.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <Wire.h>
#include "SparkFun_External_EEPROM.h"
ExternalEEPROM myMem;

//EEPROMデバイスアドレス
#define EEPROM_ADDRESS 0X50

//データ保存アドレス
#define DAT1_ADD 0
#define DAT2_ADD 20

//ディスプレイ設定
#define TFT_DC      8   // DC
#define TFT_CS      9   // CS
#define TFT_SCLK    10  // Clock
#define TFT_MOSI    11  // MOSI
#define TFT_RST     12  // Reset 
Adafruit_ST7735 tft = Adafruit_ST7735(&SPI1, TFT_CS, TFT_DC, TFT_RST);
U8G2_FOR_ADAFRUIT_GFX u8g2_for_adafruit_gfx;


//ディスプレイ表示
  void disp(int x,int y,String msg)
  {
    if((x==0) &&(y==0))
    {
      u8g2_for_adafruit_gfx.print(msg);
    }else{
      u8g2_for_adafruit_gfx.setCursor(x, y);
      u8g2_for_adafruit_gfx.print(msg);
    } 
  }

void setup() {
  //LCD初期化
    SPI1.setTX(TFT_MOSI);                       //H/W SPI 設定
    SPI1.setSCK(TFT_SCLK);
    tft.initR(INITR_GREENTAB);
    tft.initR(INITR_MINI160x80);                //Init ST7735S初期化
    tft.invertDisplay(true);
    tft.setRotation(3);
    tft.fillScreen(ST77XX_BLACK);
    u8g2_for_adafruit_gfx.begin(tft);
    u8g2_for_adafruit_gfx.setFont(u8g2_font_t0_14_me);//9 Pixel Height
    u8g2_for_adafruit_gfx.setFontMode(0);                 // use u8g2 none transparent mode
    u8g2_for_adafruit_gfx.setFontDirection(0);            // left to right (this is default)
    u8g2_for_adafruit_gfx.setForegroundColor(ST77XX_YELLOW);      // apply Adafruit GFX color

  //I2C設定
    Wire.setSDA(16);
    Wire.setSCL(17);
    Wire.begin();
    Wire.setClock(400000);

  //EEPROMライブラリ初期化
    if (myMem.begin(EEPROM_ADDRESS,Wire) == false)
    {
      disp(2,12,"No memory detected.");
      while (1);
    }
    disp(2,12,"Memory detected!");
    disp(2,24,"Mem size: ");
    disp(0,0,String(myMem.length())+"byte");

  //float形式 4byte
    float myValue3 = -3.125;
    myMem.put(DAT1_ADD, myValue3); //(location, data)
    float myRead3;
    myMem.get(DAT1_ADD, myRead3); //location to read, thing to put data into
    disp(2,36,"Value:"+String(myRead3,3));

  //Strig形式 1文字1byte
    String myString="Hello World";
    unsigned long nextEEPROMLocation = myMem.putString(DAT2_ADD, myString);
    String myRead4 = "";
    myMem.getString(DAT2_ADD, myRead4);
    disp(2,48,"String:"+myRead4);

  //次に利用可能なアドレス
    disp(2,60,"Next Add:"+String(nextEEPROMLocation));

}

void loop() {

}
```

# 参考サイト
https://github.com/sparkfun/SparkFun_External_EEPROM_Arduino_Library.git

http://zattouka.net/GarageHouse/micon/Arduino/EEPROM/EEPROM.htm