温度ロガーを作成しました

3Dプリンタ用保温ボックスを作って、ABSでの出力がうまく行くようになったのはいいのですが、ボックス内がかなり高温になっている(あたりまえですが・・・)のが気になります。

実際どのくらいなのか、手持ちの部品で温度を測ってみることにしました。

PCへの取り込みはシリアルで、秋月で以前購入したFTDI USBシリアル変換ケーブル(5V)を使いました。マイコンはPIC12F1822、温度センサーはLM35DZを使っています。最初はESP8266かESP32でAmbientに直接送信させようかとも思ったのですが、今回は測定気温が80℃を超えているかもしれませんし、場合によっては100℃を超えているかもしれません。なので、自己発熱が少なく(=消費電力を抑えることができる)壊れてもすぐ交換可能なPICとデータシート上150℃まで動作可能なLM35を使用することにしました。

ソフトはMPLAB Code Configuratorで以下のように設定しました。

  • CPUの動作周波数は初期設定の内部クロック500kHz
  • RA4/RA5にEUSARTを割付け、通信パラメータは初期設定の9600bpsのままで、Enable EUSART Interrupts で割り込みを許可。送受信バッファは各16バイト(受信は機能として使ってませんが)
  • TMR1はプリスケーラを1:2に設定変更して、Timer Periodを1秒に設定、Enable Timer Interrupt でタイマ割り込みを発生させます。
  • FVRで1.024VのADC用の基準電圧を発生させます。
  • ADCはPositive ReferenceをFVRにして、基準電圧を1.024Vにします。これで10bit分解能なので、入力電圧換算で10mVの分解能となります。LM35DZは100mV/1℃なので、0.1℃単位でAD変換できることになります。Result Alignmentはrightに変更して、読んだ値を1/10すれば温度直読になるようにします。
  • ピンマネージャでADCはAN2を設定、EUSARTはRX/TXをRA5/RA4に割り付けます。

これでMPLAB Code Configuratorにソースを吐かせて、main.cを作成しました。

#include "mcc_generated_files/mcc.h"
#include <stdlib.h>

bool exec=false;
unsigned long int time=0;
void TMR1int(void){
    exec = true;
    time++;
}

/*
                         Main application
 */
inline void EUSART_putchar(unsigned char ch){
    EUSART_Write(ch);
}

void EUSART_puts(char *str){
    uint16_t p=0;
    while(str[p]!=0) EUSART_putchar(str[p++]);    // Write data
}

void EUSART_putdec(unsigned long int num){
    char buf[10];
    unsigned long int t,u;
    int8_t i=0;

    while(1){
        buf[i]=(num % 10)+'0';
        num = num / 10;
        if(num == 0)break;
        i++;
    }
    while(i>=0){
        EUSART_putchar(buf[i]);
        i--;
    }
}

void EUSART_putLM35(unsigned long int num){
    char buf[10];
    unsigned long int t,u;
    int8_t i=0;

    while(1){
        buf[i]=(num % 10)+'0';
        num = num / 10;
        if(num == 0)break;
        i++;
    }
    while(i>=0){
        if(i==0) EUSART_putchar('.');
        EUSART_putchar(buf[i]);
        i--;
    }
}

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

//    EUSART_Initialize();
    TMR1_SetInterruptHandler(TMR1int);
    exec = false;
    time=0;
    
    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    while (1)
    {
        if(exec){
            // Read LM35DZ
            uint16_t convertedValue;
            ADC_Initialize();
            convertedValue = ADC_GetConversion(channel_AN2);
            // Send to HOST
            EUSART_putdec(time);
            EUSART_putchar(' ');
            EUSART_putLM35((unsigned long int)convertedValue);
            EUSART_putchar(0x0d);
            EUSART_putchar(0x0a);
            exec = false;
        }
        // Add your application code
    }
}

ビルドして、PICkit3で書き込みます。書き込む際はICクリップを使うことで、基板上の書き込みに関する信号の配線作業を省略しています。DIPパッケージで20ピンまでの8bitのPICは電源/GNDを含めて1ピン側の8ピンに書き込みに必要な信号が共通で出ています。ですので、この8ピンのICクリップは20ピンまでの8ビットのPICで共通に使用することができます。(例外はあるかもしれませんが・・・)

実行すると1秒単位に電源投入からの経過秒数と温度を出力します。

 :
 :
898 29.7
899 29.8
900 29.6
901 29.7
902 29.6
903 29.7
904 29.6
905 29.8
906 29.7

測定したら、そのテキストファイルをLibre Officeに読み込ませてグラフ化させるつもりです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)