ARDUINOだけで温度と電源電圧を測定する
 
ARDUINOのA0~A5を使用しないで
電源電圧の測定とCPU温度を取得する方法があるようなのでテストして記録しておきたい。
 
■回路図
 
internalの基準電圧1.1Vを使用するので
AREFにはコンデンサ0.1μFを接続するのが味噌です。
(味噌って表現わかる?)
 
 

 

■プログラム

 

温度取得する時に- 329.0を減算していますが、

これは調整する必要があります。

もし、サーバーに送るのならサーバー側で調整値持った方が楽かもです。

 

void setup()
{
  delay(1000);
  Serial.begin(9600); 
}
 
void loop()
{
  float temp, vcc;
  temp = cpuTemp();  // CPU温度測定
  vcc  = cpuVcc();   // 電源電圧測定

  char str[30];

  sprintf(str, "temp=%d.%d, vcc=%d.%d", int(temp), int(temp*10)%10, int(vcc), int(vcc*10)%10);
  Serial.println(str);

  delay(500);
}
 
float cpuTemp()
{
  long sum=0;
  adcSetup(0xC8);                    // 基準電圧をinternal(1.1V)にして 温度センサーの電圧を読む
  for(int n=0; n < 1000; n++){
    sum = sum + adc();               // adcの値を読んで積分
  }
  return (sum * 1.1/1024)- 329.0;   // 個体差が多きいので-329.0は要調整
                                    // 温度を計算
}
 
float cpuVcc()
{
  long sum=0;
  adcSetup(0x4E);                    // 基準電圧をinternal(1.1V)にして Vccの電圧を読む
  for(int n=0; n < 10; n++){
    sum = sum + adc();               // adcの値を読んで積分
  }
  return (1.1 * 10240.0)/ sum;       // 電圧を計算
}
 
void adcSetup(byte data)
{
  //ADMUX                       
  
  // 入力電圧 選択 下位bit
  //  0bxxxx0000 A0
  //  0bxxxx0001 A1
  //  0bxxxx0010 A2
  //  0bxxxx0011 A3
  //  0bxxxx0100 A4
  //  0bxxxx0101 A5
  //  0bxxxx1000 Temp Sensor  CPU内蔵温度センサー  
  //  0bxxxx1110 1.1V Vref    internal基準電圧1.1V
  
  // 基準電圧 選択 上位2bit
  // 0b00xxxxxx Ext
  // 0b01xxxxxx AVcc
  // 0b10xxxxxx Reserve
  // 0b11xxxxxx Internal 1.1V
  
  //
  ADMUX = data;                      // 上記ビットで選択
  
  ADCSRA |= ( 1 << ADEN);            // ADC Enable
  
  ADCSRA |= 0x07;                    // AD変換クロック CK/128
  
  delay(20);                         // 少し待つ
}
 
unsigned int adc()
{
  unsigned int L, H;
  ADCSRA |= ( 1 << ADSC);            // AD変換
  while(ADCSRA & ( 1 << ADSC) );     // 完了待ち
  
  L = ADCL;                         // LSB
  H = ADCH;                         // MSB
  
  return L | (H << 8);              // 合成
}