Arduino UNOでI2C EEPROで遊ぶ3(ライブラリもどき)


目的
I2C EEPROMのテスト

秋月で売っているEEPROM 通販コード　K-12061

![o_con576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5b90202f-ca9f-0d2b-b0df-b3db61beaba0.jpeg)



![o_con578.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/38b19340-7594-1b8f-1118-99fe2715656f.jpeg)



```c++

//SER_I2C_EEPROM_lib_test1_UNO_1

#include <Arduino.h>
#include <Wire.h>


//eepromのアドレス
unsigned int eerpom_address = 0;

//アドレスを0にする
void init_address() {
  eerpom_address = 0;
}

//アドレスに値をセットする
void set_address(unsigned int ad1) {
  eerpom_address = ad1;
}

//アドレスの値を読み出す
unsigned int read_address() {
  return (eerpom_address);
}

//アドレスの値に1つインクリメントする
void inc_address() {
  eerpom_address++;
}



//一文字の読み出し
unsigned char eeprom_char() {

  unsigned char ad_h = (read_address() >> 8) & 0xff;
  unsigned char ad_l =  read_address()       & 0xff;
  inc_address();//アドレスを1つ進める

  Wire.beginTransmission(0x50);
  //アドレス
  Wire.write(ad_h);    // H
  Wire.write(ad_l);    // L
  Wire.endTransmission();

  //データ
  Wire.requestFrom(0x50, 1);
  while (Wire.available() == 0 ) {}

  return (Wire.read());

}//eeprom_char

//連続読み セグメントを跨がない事?
void eeprom_read(unsigned char *str1, unsigned int len1) {

  unsigned char ad_h = (read_address() >> 8) & 0xff;
  unsigned char ad_l =  read_address()       & 0xff;

  //読み込みアドレスの設定
  //ダミー書き込み
  Wire.beginTransmission(0x50);
  //アドレス
  Wire.write(ad_h);     //H
  Wire.write(ad_l);     //L
  //データ
  Wire.endTransmission();
  //delay(1);

  //バイト連続読み
  unsigned int ii = 0;
  unsigned char s[32 + 1];
  if (len1 >= 32) {
    len1 = 32;
  }
  Wire.requestFrom(0x50, len1);
  //データが続くだけ読む
  while (Wire.available())  {      // 要求より短いデータが来る可能性あり
    str1[ii++] = (int)Wire.read(); // 1バイトを受信
    inc_address();//アドレスを1つ進める
  }//while

}//eeprom_read

void eeprom_write(unsigned char ch1) {

  unsigned char ad_h = (read_address() >> 8) & 0xff;
  unsigned char ad_l =  read_address()       & 0xff;

  Wire.beginTransmission(0x50);
  //アドレス
  Wire.write(ad_h);     //H
  Wire.write(ad_l);     //L
  //データ
  Wire.write(ch1);
  Wire.endTransmission();
  delay(5);

  //アドレスを1つ進める
  inc_address();

}//eeprom_write

void eeprom_puts(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    eeprom_write(*str1 ++);

  } //while

}//eeprom_puts

void eeprom_write_s(unsigned char *str1, unsigned int len1) {

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    eeprom_write(*str1 ++);

  }//for

}//eeprom_write_s





//初期化処理
void setup() {

  //シリアルの初期化
  Serial.begin(9600);

  Serial.println("\r\n<START>\r\n");

  //I2Cの初期化
  Wire.begin();

  //一文字書き込みテスト
  init_address(); //アドレスを0にセット
  eeprom_write( (unsigned char)'@' );

  Serial.println(" '@' Eeprom Write OK!!");

  //一文字の読み込みテスト
  init_address(); //アドレスを0にセット
  Serial.println(    (char)eeprom_char() );

  //文字列の書き込みテスト
  init_address(); //アドレスを0にセット
  eeprom_puts("Hello world!!\r\n       ");

  Serial.println(" 'Hello world!!' Eeprom Write OK!!");

  //文字列の読み込みテスト
  init_address(); //アドレスを0にセット
  unsigned char str[32+1];
  eeprom_read(str,16);str[16]=0;
  Serial.println( (char *)str );

}//setup

//メインループ
void loop()
{
}//loop





```


https://paiza.io/ja/projects/new


テストプログラム


```c++


#include <iostream>
using namespace std;

//クラスの定義
struct _Wire {
    void          beginTransmission(int add);    //メソッドの宣言
    void          endTransmission();             //メソッドの宣言
    void          requestFrom(int add,int ln);   //メソッドの宣言
    void          write(unsigned char ch);       //メソッドの宣言
    unsigned char read();                        //メソッドの宣言
    int           available();          //メソッドの宣言

};

//メソッドの定義
void _Wire::beginTransmission(int add)
{

    printf("[beginTransmission] %x\r\n",add);

}//begin

//メソッドの定義
void _Wire::endTransmission()
{

    printf("[endTransmission]\r\n");

}//begin

int p_ln=0;

//メソッドの定義
void _Wire::requestFrom(int add,int ln)
{

    p_ln = ln;
    printf("[requestFrom]\r\n");

}//begin

//メソッドの定義
void _Wire::write(unsigned char ch)
{

    printf("[write] %x\r\n",ch);

}//begin


//メソッドの定義
unsigned char _Wire::read()
{

    printf("[read]\r\n");
    
    
   return( (unsigned char)'#' );
}//begin

//メソッドの定義
int _Wire::available()
{

   int re;
   if(p_ln <= 0) {  re = 0;         } 
   else {           re = 1;  p_ln--;}

    printf("[available]\r\n");
    
    return(re); 
   
}//begin

//実体の作成
_Wire Wire;


void delay(int a) {
    
 printf("[delay] %d\r\n",a);
    
}

//eepromのアドレス
unsigned int eerpom_address = 0;

//アドレスを0にする
void init_address() {
  eerpom_address = 0;
}

//アドレスに値をセットする
void set_address(unsigned int ad1) {
  eerpom_address = ad1;
}

//アドレスの値を読み出す
unsigned int read_address() {
  return(eerpom_address);
}

//アドレスの値に1つインクリメントする
void inc_address() {
  eerpom_address++;
}



//一文字の読み出し
unsigned char eeprom_char(){

    unsigned char ad_h = (read_address() >> 8) & 0xff;
    unsigned char ad_l =  read_address()       & 0xff;
    inc_address();//アドレスを1つ進める

    Wire.beginTransmission(0x50);
    //アドレス
    Wire.write(ad_h);    // H
    Wire.write(ad_l);    // L
    Wire.endTransmission();

    //データ
    Wire.requestFrom(0x50, 1);
    while (Wire.available() == 0 ) {}        

    return(Wire.read());

}//eeprom_char

//連続読み セグメントを跨がない事?
void eeprom_read(unsigned char *str1,unsigned int len1) {

   unsigned char ad_h = (read_address() >> 8) & 0xff;
   unsigned char ad_l =  read_address()       & 0xff;

  //読み込みアドレスの設定
  //ダミー書き込み
  Wire.beginTransmission(0x50);
  //アドレス
  Wire.write(ad_h);     //H
  Wire.write(ad_l);     //L
  //データ
  Wire.endTransmission();
  //delay(1);

  //バイト連続読み
  unsigned int ii=0;
  unsigned char s[32+1];
  if(len1 >= 32) { len1 = 32; }
  Wire.requestFrom(0x50, len1);
  //データが続くだけ読む
  while(Wire.available())  {       // 要求より短いデータが来る可能性あり
    str1[ii++] = (int)Wire.read(); // 1バイトを受信
    inc_address();//アドレスを1つ進める
  }//while

}//eeprom_read

void eeprom_write(unsigned char ch1) {

    unsigned char ad_h = (read_address() >> 8) & 0xff;
    unsigned char ad_l =  read_address()       & 0xff;
    
    Wire.beginTransmission(0x50);
    //アドレス
    Wire.write(ad_h);     //H
    Wire.write(ad_l);     //L
    //データ
    Wire.write(ch1);
    Wire.endTransmission();
    delay(5);

    //アドレスを1つ進める
    inc_address();

}//eeprom_write

void eeprom_puts(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    eeprom_write(*str1 ++);

  } //while

}//eeprom_puts

void eeprom_write_s(unsigned char *str1,unsigned int len1) {

  for(int ii=0;ii<len1;ii++){

    //一文字出力
    eeprom_write(*str1 ++);

  }//for

}//eeprom_write_s



int main(void){
    // Your code here!
    
    //Wire.beginTransmission(0x50);
    //Wire.endTransmission();
    //Wire.requestFrom(0x50,16);
    //Wire.write( (unsigned char)'@' );
    //int a = Wire.read();
    //int b = Wire.available();
    
    //eeprom_write( (unsigned char)'0' );
    //eeprom_write( (unsigned char)'1' );
    //char str[3] = {'0','1',0};
    //eeprom_puts("01");
    //unsigned char str[3] = {'0','1',0};
    //eeprom_write_s(str,2);
    //printf("%c \r\n",eeprom_char() );
    unsigned char str[32+1];
    eeprom_read(str,16);
    printf("%s",str);
    
}




```