Arduino UNOと温度センサーS-8120Cで温度をI2C EEPROMに出力(ソフトウェア時間関数)

目的
データをEEPROMに出力して単独使用する

EEPROM K-12061


![o_con581.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/49cec677-9f21-9dd5-5a8c-151229cb1784.jpeg)


![o_con582.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/254b546d-dbe6-68a7-8e4c-43339d6913fc.jpeg)



メインプログラム



```c++


//SER_I2C_EEPROM_TMP_UNO_1

#include <Arduino.h>
#include <Wire.h>
#include <time.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


time_t t=3600*4+60*3+2;


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

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

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

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

  //I2C EEPROMのアドレスの初期化
  init_address(); //アドレスを0にセット

  //文字列の書き込み
  eeprom_puts("\r\<START>\r\n");

  //1秒間隔のタイマー関数の初期化
  TCCR1A = 0; // 初期化
  TCCR1B = 0; // 初期化
  TCNT1 = 3036; 
  TCCR1B |= (1 << CS12); // CS12 -> 1  prescaler = 256
  TIMSK1 |= (1 << TOIE1); //TOIE -> 1


}//setup



ISR(TIMER1_OVF_vect) {
  //Serial.println(millis());
  TCNT1 = 3036;

  t++;
}



//二桁の変換
#define DIV10(n) ((n*205)>>11)
char data1[16];
char *itoa99(int n) {

  
  data1[0] = '0' + DIV10(n);                        // n / 10
  data1[1] = '0' + (  n - ((data1[0] - '0')*10) );  // n % 10
  data1[2] =  0;
  
  return(data1);

}//itoa99

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

    struct tm *tm = localtime(&t); 

    Serial.print( " 時 " );Serial.print( tm->tm_hour );
    Serial.print( " 分 " );Serial.print( tm->tm_min );
    Serial.print( " 秒 " );Serial.print( tm->tm_sec );
    Serial.println();

  //センサーの値を読み込む
  int s = analogRead(A0);   // センサーの読み取り値

  //センサーのADC値を温度に変換 温度の10倍を出力 ex 20.1 => 201
  // v = -8.2 * t + 1705  =>  t = (v - 1705.0) / -8.2;
  //  207.92 = (0    - 1705.0) / -8.2;
  // -401.82 = (5000 - 1705.0) / -8.2;
  int t = map(s,0,1024,2079,-4018);

  //温度の表示
  Serial.print(t / 10);
  Serial.print('.');
  Serial.print(t % 10);
  Serial.println();

  eeprom_puts( "時" );eeprom_puts( itoa99(tm->tm_hour) );
  eeprom_puts( "分" );eeprom_puts( itoa99(tm->tm_min)  );
  eeprom_puts( "秒" );eeprom_puts( itoa99(tm->tm_sec)  );
  eeprom_puts( " ");


  //温度の保存
  eeprom_puts( itoa99(t / 10) );
  eeprom_puts(  "." );
  eeprom_puts( itoa99(t % 10)+1 );
  eeprom_puts( "\r\n" );
  
  //1秒の待ち
  delay(1000);

}//loop






```



読み込みテスト



```c++


//SER_I2C_EEPROM_0_15_read_UNO_1

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

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

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

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

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

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

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

  }//for

}//setup

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


```