· 

12.温度センサープロジェクト(2)ーRaspberry Pi Pico WindowsC言語入門

13.2.アナログ温度センサーによる温度計測

プロジェクト名:TempLM35DZ

プロジェクト概要

Texas Instruments社の代表的なアナログ温度センサLM35DZ、またはLM61BIZを使用した温度計測プロジェクトです。LM35DZLM61BIZとの違いは動作温度範囲、動作電圧、精度です。LM61BIZはマイナス温度が計測可能です。以下、基本仕様です。

                               LM35DZ                               LM61BIZ

動作温度範囲        0100℃                              -25+85℃

動作電圧                430 V                                 2.710 V

出力電圧                10.0 mV/℃                           10.0 mV/℃

精度                        ±0.75℃(室温±0.25℃    ±3℃(室温±2℃

 

今回はLM35DZを使用しました。回路図、プログラムはLM35DZです。

LM35DZは動作電圧4V以上なので、電源は5Vに接続します。また

最大範囲は0100℃で、出力電圧は01Vになり、ADCの入力範囲内になります。

LM35DZ(TO-92)は品番刻印側を正面に見て、左から1pin-5V 2pin-VOUT 3pin-GNDです。接続は以下です。

                                                     Pico                                     LM35DZ

                                                     VSYS(5V)                             1pin  5V

                                                     ADC0(GPIO26)                2pin      VOUT

                                                     GND                                     3pin  GND

温度の求め方はまず、バイナリ12bitADデータを電圧に変換します。

const float ConversionFactor = 3.3f / (1 << 12);

    float adVolt = (float)adc_read() * ConversionFactor;

1℃が10mVなので、以下で温度に変換します。

    float ctemp = adVolt/0.01f;

 

部品リスト

LM35DZ 温度センサIC                            1            アマゾン

GROVE16 x 2 LCD                                         スイッチサイエンス

 

 

配線図

ソースリスト

float ReadLmTemperature()

{

    adc_select_input(0);

    float adVolt = (float)adc_read() * ConversionFactor;

    float ctemp = adVolt/0.01f;

    return ctemp;

}

int main()

{

    stdio_init_all();

 

    gpio_init(LED_PIN);

    gpio_set_dir(LED_PIN, GPIO_OUT);

    gpio_put(LED_PIN, 0);

   

    i2c_init(I2C_PORT, 400*1000);

    gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);

    gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);

    gpio_pull_up(I2C_SDA);

    gpio_pull_up(I2C_SCL);

 

    WaitTerminalStartup(30*1000);

    printf("\nTerminal connected\n");

    ScanI2CBus();   

    printf("I2C Scan completed\n");

 

    lcd_init();

    InitAdc();

    InitRtc();

    char buf[128];

    datetime_t nowdt;

    int presec = -1;

    while (1) {

        rtc_get_datetime(&nowdt);

        if(presec != nowdt.sec)

        {

            sprintf(buf, "%02d/%02d %02d:%02d:%02d", nowdt.month, nowdt.day, nowdt.hour,nowdt.min, nowdt.sec);

            lcd_set_cursor(0, 0);

            lcd_string(buf);

 

            float btemp = ReadOnBoardTemperature();

            float ttemp = ReadLmTemperature();

            sprintf(buf, "LM:%4.1f ADC:%4.1f", ttemp, btemp);

            lcd_set_cursor(1, 0);

            lcd_string(buf);

 

            printf("%4d/%02d/%02d %02d:%02d:%02d  Lm:%4.1f onborad:%4.1f\n",  nowdt.year, nowdt.month, nowdt.day,

                                                               nowdt.hour,nowdt.min, nowdt.sec, ttemp, btemp);

        }

        presec = nowdt.sec;

        sleep_ms(200);

   }

    return 0;

}

 

ソースリストは前章13.1のサーミスタとほぼ同じです。ReadLmTemperature()関数が追加され、mainReadThermistorTemperature関数の代わりに呼び出されています。

上記画面にみるように、オンボード温度センサーと比較すると8℃程度高く、また変動も大きいです。これは12bit フルスケール3.3Vのところ0-1Vで取り込んでおり、精度が悪くなっています。対策としてLM35DZからPicoへの間にOPアンプ等でのレンジ変換、ノイズ対策の回路が必要になります。