ArduinoUNOとMCP9701で温度を秋月シリアル7セグに出力 (SPI)(Arduino)


x MCP9701-E/TO 販売コード 103199

x あまり正確では、ない
x Arduino_SPI

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199
赤色７セグメントＬＥＤシリアルドライバキット K-10360

説明
MCP9701は、
0℃の時、400mV
1℃あたり19.5mV
精度は、±4℃
電線が引き出しやすい位置のA0をアナログ入力にする
計算には、容量削減の為に浮動小数点となるべく割り算は、使わない
MCP9700は、ファミリー、オフセット500mV、10mV/1℃ 今回は、使わない

19.5は、1℃あたりの電圧
3300は、ADCの電圧
400は、0℃



![spi_7seg_9701_uno_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/26ae8f43-8ec9-b14d-d164-280a310d2d50.jpeg)





コンマ処理の変更

```c++


#include <SPI.h>

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

} //setup

int s;  //ADCの値
int n0; //温度　小数点以上
char data_read[8]; //バッファー
int nt[] = {0,2,5,7}; //温度

void loop() {

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

  //s=20<<2; //0    debug
  //s=40<<2; //20.0 debug

  //小数点以上と小数点以下を分ける
  n0  = (s >> 2) - 20;   // 小数点以上
  s   = nt[s & 0x3];     // 小数点以下

  //温度の表示
  data_read[0] = ' ';
  data_read[1] = '0' + n0/10;
  data_read[2] = '0' + (  n0-(  (n0/10)  *10)  );
  data_read[3] = '.';
  data_read[4] = '0' + s;
  data_read[5] = 0;
  ns_printf(data_read);

  delay(1000); //1秒待つ

} //loop




```


コンマ処理の変更前

```c++


#include <SPI.h>

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

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

    if(ch == ' ') {
        ch = '@'-64;
    } else if(ch == '.') {
        SPI.transfer(0x80);DW(SS,HIGH);DW(SS,LOW);

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

    SPI.transfer(seg[ch]);DW(SS,HIGH);DW(SS,LOW);

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

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

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

        //一文字出力
        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

} //setup

int s;  //ADCの値
int n0; //温度　小数点以上
char data_read[8]; //バッファー
int nt[] = {0,2,5,7}; //温度
 
void loop() {

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

  //s=20<<2; //0    debug
  //s=40<<2; //20.0 debug

  //小数点以上と小数点以下を分ける
  n0  = (s >> 2) - 20;   // 小数点以上
  s   = nt[s & 0x3];     // 小数点以下

  //温度の表示
  data_read[0] = '0' + n0/10;
  data_read[1] = '0' + (  n0-(  (n0/10)  *10)  );
  data_read[2] = '.';
  data_read[3] = '0' + s;
  data_read[4] = 0;
  ns_printf(data_read);

  delay(1000); //1秒待つ

} //loop


```

![spi_7seg_9701_UNO_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d62c2a56-8c83-d7e6-3681-a9da6c43a9a8.jpeg)


![h_con28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8f9964b7-9502-d02e-c4b0-363a52a1909c.jpeg)