S-8100Bというセイコーエプソンの温度計がある。出力インピーダンスが高いので出力を1MΩでプルアップせよとあるが、オープンコレクタ出力なのだろうか。1MΩでプルアップしないと直接マイコン端子に接続ではうまく温度測定できなかった。
小数点表示はおいといて、ダイナミック点灯で表示できるところまではいった。
校正してないが、28.7℃ほどの気温のようだ。あつい。
ノイズが大きいのかADCの読み取り値が大きく変動するので、平均化をガッツリしてみた。15000回ほど・・・
150回のADC変換で0.99倍しながらADCの値を加算するので、150x100=15000回平均値となる。
Arduinoで作ったProMicroのコードをメモがてら載せておく。
======以下コード======
//使うデジタルピンの番号を入れておく。
//DDRx, PINx, PORTxレジスタで操作したかったが、ピン足りなかった
uint8_t Channels[]={2,3,4,5,6,7,8}; //ドットは別で定義しておこう
// /-a-/
// f b
// /-g-/0
// e c
// /-d-/ .
//Channels 23456789
//7segment abcdefg.
// 0 11111100
// 1 01100000
// 2 11011010
// 3 11110010
// 4 01100110
// 5 10110110
// 6 10111110
// 7 11100100
// 8 11111110
// 9 11110110
//7セグの配列を入れてある
uint8_t SegmentArray[10][7]=
{
{1,1,1,1,1,1,0},
{0,1,1,0,0,0,0},
{1,1,0,1,1,0,1},
{1,1,1,1,0,0,1},
{0,1,1,0,0,1,1},
{1,0,1,1,0,1,1},
{1,0,1,1,1,1,1},
{1,1,1,0,0,1,0},
{1,1,1,1,1,1,1},
{1,1,1,1,0,1,1},
};
// 0を表示したい場合、次のように値を入れるのがいいだろう
// for(i=0,i<8,i++){
// digitalWrite(Channels[i],Segment[0][i]);
// }
long ADCValue;
long LN2;
long tempVal;
uint8_t A;
uint8_t B;
uint8_t C;
void ShowNone(){
//7セグLED消灯
for(uint8_t i=0;i<sizeof(Channels);i++){
digitalWrite(Channels[i],0);
}
}
void ShowNum(uint8_t X) {
if(X>9){
ShowNone();
}
else{
//7セグLEDに数字を表示する
for(uint8_t i=0;i<sizeof(Channels);i++){
digitalWrite(Channels[i],SegmentArray[X][i]);
}
}
}
void setup() {
// put your setup code here, to run once:
// Serial port setting
Serial.begin(9600);
//pinMode Setting for a to g LEDs
for(unsigned char i=0;i<sizeof(Channels);i++){
pinMode(Channels[i],OUTPUT);
}
//Digit Position
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(16,OUTPUT);
// 7セグLEDの点灯テスト
for(unsigned char i=0;i<sizeof(Channels);i++){
digitalWrite(Channels[i],HIGH);
delay(100);
Serial.println(Channels[i]);
digitalWrite(Channels[i],LOW);
}
//0から9までの数字表示の確認をする
for(uint8_t j=0;j<10;j++){
ShowNum(j);
delay(100);
}
ShowNone();
ADCValue=0;
for(int i=0;i<15000;i++){
ADCValue += analogRead(A0);
}
}
void loop() {
// put your main code here, to run repeatedly:
//ADCで電圧を読んでくる
// 1V-5Vを0-99%に割り付けた値をXとする(100%表示はしない)
// Xを10で割った商Aが10の位、余りBが1の位になる。
// Aを表示,Bを表示,ブランク表示を繰り返す。
LN2 = map(ADCValue,3363900,5861400,800,-200); //1-5Vを0-99に割付
A = LN2 / 100; //10の位
tempVal = LN2 % 100; //1の位
B = tempVal /10;
C = tempVal % 10;
//シリアル通信で計算している中身を送信
// Serial.print(millis());
Serial.print("ADC Value:");
Serial.print(ADCValue);
Serial.print(",AR:");
Serial.println(analogRead(A0));
// Serial.print(",ABC:");
// Serial.print(A);
// Serial.print(",");
// Serial.print(B);
// Serial.print(",");
// Serial.println(C);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(16,HIGH);
if(A>0){
ShowNum(A); //100の位を表示
}
else{
ShowNone();
}
digitalWrite(9,LOW);
ADCValue=ADCValue-ADCValue/100;
//delayの代わりにADC変換する
for(uint8_t i=0;i<50;i++){
ADCValue += analogRead(A0);
}
digitalWrite(9,HIGH);
ShowNum(B); //10の位を表示
digitalWrite(10,LOW); //点灯
//delayの代わりにADC変換する
for(uint8_t i=0;i<50;i++){
ADCValue += analogRead(A0);
}
digitalWrite(10,HIGH);
ShowNum(C);
digitalWrite(16,LOW);
//delayの代わりにADC変換する
for(uint8_t i=0;i<50;i++){
ADCValue += analogRead(A0);
}
digitalWrite(16,HIGH);
}