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


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

x Mbed2のリビジョンは、143
x あまり正確では、ない

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

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

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

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

3300/19.5=169.2
400/19.5=20.5

(4096*1692)/4096=1692



```c++


#include "mbed.h"

//*******   ******   *****  *****  
//     *         *   *      * 
//    *         *    *****  *  ***
//  *       ****     *      *    *
//  *       *        *      *    *
//  *        *****   *****  *****

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4
AnalogIn adc_vbat(A0); //767 303

#define swclk1  PA_5    //A4
#define test01  PA_6
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3

SPI spi( D11 , D12 , D13); // mosi, miso, sclk //767
DigitalOut en( D10 ); //767

//SPI spi( swdio1 , test01, swclk1); // mosi, miso, sclk //010
//DigitalOut en(en1); //010

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'};

//7segの一文字出力 nana_seg
int ns_putc(char ch) {
    
    if(ch == ' ') {
        ch = '@'-64;
    } else if(ch == '.') {
        spi.write(0x80);en=1;en=0;
        return(0);
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0']-64;
    } else {
        ch = ch-64;
    }
    
    spi.write(seg[ch]);en=1;en=0;

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


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

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

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

    } //while

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

//メイン関数
int main() {

    //spiの初期化
    spi.format(8,0);
    spi.frequency(1000000);
    en=0;

    //ns_printf("STAR");wait_ms(1000); //debug
 
    int s;  //ADCの値
    int n0; //温度　小数点以上
    char data_read[8]; //バッファー

    //無限ループ
    while(1) {

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);

        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s*1692)>>12)-205;

        //s=0;   //0    debug
        //s=200; //20.0 debug

        //小数点以上と小数点以下を分ける
        n0=DVI10(s);    // 小数点以上
        s =(s-(n0*10)); // 小数点以下

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

    }//while
 
}//main

//容量削減
//void error(const char* format, ...){}




```


![spi_7seg_9701_767_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b5d62265-b9fb-a5ac-aa73-ac62ec69b1df.jpeg)


![h_con28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/666f1a40-ecf2-e824-ffe7-ebe021242a2b.jpeg)