/* CPU内部温度センサーと電源電圧の読み出し、I2C OLED(128x32)に表示 2019/11/19 ラジオペンチ http://radiopench.blog96.fc2.com/ */ #include // 128x32 OLED #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); analogReference(INTERNAL); // ADCは内部refを使用(フルスケール=1.1V) pinMode(13, OUTPUT); oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // OLED初期化 oled.clearDisplay(); oled.setTextSize(2); // 2倍角で表示 oled.setTextColor(WHITE); // 白文字で表示 } void loop() { float temp, Vcc; digitalWrite(13, HIGH); temp = cpuTemp(); // CPU温度測定 Vcc = cpuVcc(); // 電源電圧測定 digitalWrite(13, LOW); Serial.print("Temp= "); // シリアルに温度を出力 Serial.print(temp, 1); Serial.print(", Vcc= "); // シリアルにVccを出力 Serial.println(Vcc, 2); oled.clearDisplay(); // OLEDに表示 oled.setCursor(0, 0); oled.print("Tmp:"); oled.print(temp, 1); // 温度、小数点以下1桁表示 oled.print("C"); // 単位表示 oled.setCursor(0, 16); oled.print("Vcc:"); // Vcc oled.print(Vcc, 2); oled.print("V"); // ゴミ消し oled.display(); // 実際に表示 delay(500); } // 流用する場合は以下を全てコピーする float cpuTemp() { // CPU温度測定関数 long sum = 0; adcSetup(0xC8); // Vref=1.1V, input=ch8 for (int n = 0; n < 100; n++) { sum = sum + adc(); // adcの値を読んで積分 } return (sum * 1.1 / 102.4) - 312.9; // 温度を計算(312.9は要調整) } float cpuVcc() { // 電源電圧(AVCC)測定関数 long sum = 0; adcSetup(0x4E); // Vref=AVcc, input=internal1.1V for (int n = 0; n < 10; n++) { sum = sum + adc(); // adcの値を読んで積分 } return (1.1 * 10240.0) / sum; // 電圧を計算して戻り値にする } void adcSetup(byte data) { // ADコンバーターの設定 ADMUX = data; // ADC Multiplexer Select Reg. ADCSRA |= ( 1 << ADEN); // ADC イネーブル ADCSRA |= 0x07; // AD変換クロック CK/128 delay(10); // 安定するまで待つ } unsigned int adc() { // ADCの値を読む unsigned int dL, dH; ADCSRA |= ( 1 << ADSC); // AD変換開始 while (ADCSRA & ( 1 << ADSC) ) { // 変換完了待ち } dL = ADCL; // LSB側読み出し dH = ADCH; // MSB側 return dL | (dH << 8); // 10ビットに合成した値を返す }