#include // LCD #define CLK 0 #define DAT 1 #define WAIT 30 volatile uint16_t adin; float temp, volt; char str[10]; ISR(ADC_vect) { adin = ADCL; adin |= ADCH << 8; } void setup() { DDRB = 0b00000011; PORTB = 0b00000011; // 省エネ設定 ACSR |= _BV(ACD); // アナログ比較器電力削減 DIDR0 |= _BV(ADC3D); // ADC3(PB3)デジタル入力禁止 // AD変換 ADMUX |= _BV(REFS1) | _BV(MUX1) | _BV(MUX0); // 内部1.1V基準電圧 ADC3(PB3) //ADMUX |= _BV(REFS2) | _BV(REFS1) | _BV(MUX1) | _BV(MUX0); // 内部2.56V基準電圧 ADC3(PB3) ADCSRA |= _BV(ADEN) | _BV(ADIE) | _BV(ADPS1) | _BV(ADPS0); // 動作クロック1MHz 分周値1/8 125kHz // スリープ設定 set_sleep_mode(SLEEP_MODE_ADC); // A/D変換雑音低減動作 sleep_enable(); // スリープ許可 delay(200); // LCD準備待ち sei(); // 割り込み許可 } void loop() { ADCSRA |= _BV(ADSC); // A/D変換開始 sleep_mode(); // 0℃のとき500mV 温度係数10.0mV/℃ // A/D入力値を電圧に変換 電圧 = A/D入力値 * 1.1V / 1024 // 電圧を温度に変換 温度 = (電圧 - 500mA) / 10mA volt = adin * 1.1 / 1024.0; // デジタル値を電圧に変換 temp = (volt - 0.5) / 0.01; // 電圧を温度に変換 dtostrf(temp, 4, 1, str); sendChar(0x80); // カーソル先頭へ(独自コマンド) sendStr(str); delay(500); } void sendChar(uint8_t chr) { for(int n = 0; n < 8; n++) { digitalWrite(DAT, (chr >> n) & 1); delayMicroseconds(WAIT); digitalWrite(CLK, LOW); delayMicroseconds(WAIT); digitalWrite(CLK, HIGH); } } void sendStr(char* str) { char* p; p = str; while(*p != 0) { sendChar(*(p++)); } }