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に読み込ませてグラフ化させるつもりです。


