① 今日の目標
TMP36センサーで温度を読み取れる
アナログ値→電圧→温度の変換ができる
LCDに温度をリアルタイムで表示できる
センサーとディスプレイを組み合わせられる
② 必要なもの
Arduino Uno
マイコンボード本体
TMP36温度センサー
気温をアナログ電圧で出力
I2C LCD(16×2)
アドレス 0x27 または 0x3F
ブレッドボード+ジャンパー線
部品をつなぐ
③ しくみを学ぼう
🌡️ TMP36センサーの仕組み
TMP36は温度によって出力する電圧が変わるセンサーです。
- 0℃のとき → 0.5V を出力
- 25℃のとき → 0.75V を出力(0.5 + 25×0.01)
- 1℃上がるごとに 0.01V(10mV)増える
電圧から温度を計算する式はこれ!
voltage = reading × 5.0 / 1024.0
temp = (voltage − 0.5) × 100.0
🔢 ADC変換(アナログ→デジタル)
analogRead() は 0〜5V の電圧を 0〜1023 の整数値に変換します。
1
analogRead(A0)
センサーの出力を 0〜1023 の値で読む
センサーの出力を 0〜1023 の値で読む
2
電圧に変換
reading × 5.0 / 1024.0 で 0〜5V に
3
温度に変換
(voltage − 0.5) × 100 で ℃ に
4
LCDに表示
lcd.print(temp, 1) で小数1桁
📺 ちらつかないLCD更新のコツ
温度を連続更新するとき、lcd.clear() を使うと画面がちらつきます。
❌ ちらつく方法
lcd.clear(); // 一瞬消える!
lcd.print(temp);
✅ スムーズな方法
lcd.setCursor(0, 1);
lcd.print(temp, 1);
lcd.print((char)223); // °
lcd.print("C "); // スペースで上書き
💡 (char)223 は「°」記号のASCIIコードです!
④ Arduinoコード
lcd_thermometer.ino
// 必要なライブラリを読み込む
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCDオブジェクト(アドレス0x27、16列×2行)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// TMP36センサーのピン
const int TEMP_PIN = A0;
void setup() {
// LCDを初期化
lcd.begin();
lcd.backlight();
// タイトルを表示
lcd.setCursor(0, 0);
lcd.print("LCD Thermometer");
lcd.setCursor(0, 1);
lcd.print("Starting...");
delay(2000);
// 表示をクリア
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(0, 1);
lcd.print("EngiKids v1.0");
}
void loop() {
// TMP36の値を読む(0〜1023)
int reading = analogRead(TEMP_PIN);
// アナログ値 → 電圧 → 温度に変換
float voltage = reading * 5.0 / 1024.0;
float temp = (voltage - 0.5) * 100.0;
// 1行目に温度を表示(ちらつかないように上書き)
lcd.setCursor(6, 0); // "Temp:" の後ろ
lcd.print(temp, 1); // 小数点1桁
lcd.print((char)223); // ° 記号
lcd.print("C "); // 余白で古い文字を消す
delay(500); // 0.5秒ごとに更新
}
float 型を使う理由
温度は小数になる(例:25.3℃)。
温度は小数になる(例:25.3℃)。
intだと小数が切り捨てられるので float を使います。
(char)223 で°記号
LCDは特殊文字を番号で管理しています。223番が「°」記号です。
LCDは特殊文字を番号で管理しています。223番が「°」記号です。
delay(500)の意味
0.5秒ごとに温度を更新。速すぎると目に優しくないし、遅すぎると変化が分かりにくい。
0.5秒ごとに温度を更新。速すぎると目に優しくないし、遅すぎると変化が分かりにくい。
"C " の余分なスペース
例えば「12.3°C」→「9.8°C」に変わったとき、桁が減った分の文字を消すためにスペースで上書きします。
例えば「12.3°C」→「9.8°C」に変わったとき、桁が減った分の文字を消すためにスペースで上書きします。
⑤ 配線図
⚠️ TMP36の向きに注意!
TMP36の平らな面を手前にして差し込みます。
左から → VCC(5V)・OUT(A0)・GND
TMP36の平らな面を手前にして差し込みます。
左から → VCC(5V)・OUT(A0)・GND
⑥ チェックリスト
⑦ チャレンジクイズ!
⑧ 🌡️ LCD温度計シミュレーター
スライダーで温度を変えると、バーチャルLCDの表示が変わるよ!
50℃
40℃
30℃
20℃
10℃
0℃
🌡️
25.0
°C
analogRead: 614
reading: 614
voltage: 3.00V
temp: 25.0°C
int reading = analogRead(A0); // → 614
float voltage = reading * 5.0 / 1024.0; // → 3.00V
float temp = (voltage - 0.5) * 100.0; // → 25.0℃
lcd.setCursor(6, 0);
lcd.print(temp, 1); // "25.0"
float voltage = reading * 5.0 / 1024.0; // → 3.00V
float temp = (voltage - 0.5) * 100.0; // → 25.0℃
lcd.setCursor(6, 0);
lcd.print(temp, 1); // "25.0"
⑨ まとめ
TMP36の変換式
voltage = reading × 5.0 / 1024.0
temp = (voltage − 0.5) × 100
voltage = reading × 5.0 / 1024.0
temp = (voltage − 0.5) × 100
ちらつきなし更新
lcd.clear()より
setCursor()で上書きが◎
lcd.clear()より
setCursor()で上書きが◎
lcd.print(temp, 1)
小数点以下の桁数を
第2引数で指定できる
小数点以下の桁数を
第2引数で指定できる
センサー+ディスプレイ
部品を組み合わせることで
本格的な計測器が作れる!
部品を組み合わせることで
本格的な計測器が作れる!