ArduinoUNOとDS1307で時計 秋月シリアル7セグに出力 (SPI)(Arduino)


x時間合わせは、別
x Arduino_SPI

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![spi_7seg_ds1307_uno_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5bd587f0-739b-22c6-6144-c3e2b79e2885.jpeg)

時間合わせ

H 0-23>15
M 0-59>49
15:49:00
15:49:01
15:49:02
15:49:03
15:49:04
15:49:05





```c++

#include <SPI.h>  //SPI library
#include <Wire.h> //I2C library

//ds1307のアドレス
#define ADDR    0x68  // 2進数 1101000

char seg[32] = {
   0x00 , //0 @ -> ' '
   0x77 , //1 A  o
   0x7c , //2 B     　combined use "6"
   0x39 , //3 C
   0x5e , //4 D
   0x79 , //5 E  o
   0x71 , //6 F
   0x3d , //7 G

   0x76 , //8 H  o
   0x06 , //9 I    　combined use "1"
   0x1e , //10 J
   0x75 , //11 K 
   0x38 , //12 L  o
   0x15 , //13 M
   0x37 , //14 N  o
   0x3f , //15 O  o　combined use "0"

   0x73  , //16 P
   0x67  , //17 Q　combined use "9"
   0x50  , //18 R
   0x6d  , //19 S　combined use "5"
   0x78  , //20 T
   0x3e  , //21 U
   0x1c  , //22 V
   0x2a  , //23 W  o
   0x64  , //24 X

   0x6e  , //25 Y
   0x5b  , //26 Z　combined use "2"
   0x4f  , //27 [  --> "3"
   0x66  , //28 \  --> "4"
   0x27  , //29 ]  --> "7"
   0x7f  , //26 ^  --> "8"
   0x08    //31 _
};

char nn[]={'O','I','Z','[','\\','S','B', ']','^','Q'};

#define DW    digitalWrite

int comma1=0; // コンマ(小数点)の有効フラグ　1で有効　0無効

//7segの一文字出力 nana_seg
int ns_putc(char ch) {

    if(ch == ' ') {
        ch = '@'-64;
    } else if(ch == '.') {
        return(0);
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0']-64;
    } else {
        ch = ch-64;
    }

    if( comma1 != 0 ) { comma1 = (0x80); }
    SPI.transfer(seg[ch] | comma1  );DW(SS,HIGH);DW(SS,LOW);
    comma1 = 0;

    //戻り値
    return(0);
}//ns_putc

//文字列の表示 nana_seg
int ns_printf(char *str1) {

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

        //コンマの処理
        comma1=0;
        if( (*(str1+1) ) == '.' ) { comma1=1; }

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

    } //while

    //戻り値
    return(0);
}//ns_printf

void setup() {

  // SPIの初期化
  SPI.begin(); // 11 12 13
  DW(SS, LOW); // 10
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 2Mhz

  //i2cの初期化
  Wire.begin(); //uno

  //Serial.begin( 9600 );//debug

} //setup

int  ii;           //ループカウンター
char data_read[8]; //バッファー
char h,m;          //時分

void loop() {

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();
  delay(2);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }//for

  //Serial.println(data_read[2],HEX); //h debug
  //Serial.println(data_read[1],HEX); //m debug
  //Serial.println(data_read[0],HEX); //s debug
    
  //data_read[2]=0x12; //debug
  //data_read[1]=0x34; //debug

  h = data_read[2]; //時
  m = data_read[1]; //分

  //画面に表示
  data_read[0] = '0' + (h >> 4);
  data_read[1] = '0' + (h & 0xf);
  data_read[2] = '.';
  data_read[3] = '0' + (m >> 4);
  data_read[4] = '0' + (m & 0xf);
  data_read[5] = 0;
  ns_printf(data_read);

  delay(1000); //1秒待つ

} //loop



```

時間合わせ

```c++

#include <Wire.h>

// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000

int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while(!Serial.available()) {}       // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む
  
  return(u_key);
}

int  ch_i;      //文字列のループカウンター
char ch_b[8+1]; //文字列のバッファー
int  ch_y;      //一文字分の一時バッファー

void ch_input()
{
    ch_i=0;
    while(1) {
        ch_y = ch_in_key();
        if(ch_y == 13){ch_b[ch_i]=0;Serial.println();break;}
        ch_b[ch_i]=ch_y;ch_i++;
        Serial.write( ch_y );
        if(ch_i >= 8){ch_b[ch_i]=0;Serial.println();break;}     
    } //while
} //ch_input

char ch_hex_b[3];
char *ch_hex(int l_num)
{
    ch_hex_b[0] = '0' + (l_num >> 4);
    ch_hex_b[1] = '0' + (l_num & 0xf);
    ch_hex_b[2] = 0;
    return(ch_hex_b);
}

void setup() {
  Serial.begin( 9600 );     // シリアル通信を初期化する。通信速度は9600bps

  // マスタとしてI2Cバスに接続する
  Wire.begin();

}

int h;
int m;
int a;
int b;

int p_val;
char data_read[16];
char cmd[2]={0,0};
int ii;     //ループカウンタ

void loop() {

///*INIT start *********  

    Serial.println( "" );  //改行

    Serial.print("H 0-23>");
    ch_input();         //文字列の入力
    h=atoi(ch_b);

    Serial.print("M 0-59>");
    ch_input();         //文字列の入力
    m=atoi(ch_b);

    a=(m/10)*16+(m%10);
    b=(h/10)*16+(h%10);

      // I2Cスレーブに対して送信処理を開始する
  Wire.beginTransmission(ADDR);
 
    // レジスタのアドレスを指定する(0-63の内、先頭から)
    Wire.write(0x00);
  
    // ---------------------------------
    //  タイマーキーパーレジスタ
    // ---------------------------------
    // 2進化10進数(BCD)で指定します。(03以外)
  
    // [00]Seconds(45秒)
    Wire.write(0);
    // [01]Minutes(59分)
    Wire.write(a);
    // [02]Hours(23時)
    Wire.write(b);
    // [03]Day(月)
    // 1:日 2:月 3:火 4:水 5:木 6:金 7:土
    Wire.write(3);
    // [04]Date(31日)
    Wire.write(1);
    // [05]Month(12月)
    Wire.write(1);
    // [06]Years(2017年)
    Wire.write(0x20);
 
  // I2Cスレーブへの送信完了
  Wire.endTransmission();

//*/  //INIT end *********

while(1){

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);
 
  // 8byteのデータを取得する
  for (ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }


        ii=2;
        while(1){
            Serial.print(ch_hex(data_read[ii]));
            ii--;
            if(ii==-1){break;}else{Serial.print(":");}
        }
        Serial.println("");

 
  delay(1000);

}//while

} //loop


```




![h_con28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cdfe0fb0-f3e4-9214-bfba-57b9346dd0ca.jpeg)