LM35とArduinoの温度センサー:配線、計算式、コード
LM35とArduinoの配線とピン配置、analogReadから°Cへの計算式、1.1 Vの基準電圧で0.1 °Cの分解能、平均化、ESP32とPicoのコード、LM35とDS18B20の比較を解説します。
LM35は、温度を直接摂氏の電圧に変える、安い3本足のアナログ温度センサーです。ArduinoでLM35を使うのにライブラリも複雑な通信も必要ありません。中央の足をアナログピンにつなぎ、analogRead()で読み、1行の式で温度がわかります。出力は1 °Cごとにちょうど10 mVずつ上がるので、25 °Cで250 mV、100 °Cで1 Vになります。
このガイドでは、LM35のしくみ、ピン配置とほぼ誰もが一度はやる逆接続の失敗、analogReadの値から°Cを計算する方法、Arduino Unoの1.1 Vの内部基準電圧で値を4倍以上細かくする方法、平均化でふらつく値を落ち着かせる方法を学びます。続いて、3.3 VのESP32とRaspberry Pi Picoで注意すべき点、マイナスの温度の測り方、DS18B20やDHT11ではなくLM35を選ぶべきときを紹介します。
LM35とは?そのしくみ
LM35の中には、異なる電流密度で動く2つのトランジスタがあります。両者のベース・エミッタ間電圧の差は絶対温度に正比例して変わり、この手法をデルタVBEと呼びます。内部のアンプがこの小さな差を増幅し、0 °Cで出力が0 Vになるように調整しています。そのため、LM335のようなケルビン基準のセンサーと違い、出力から大きな一定の電圧を引く必要はありません:温度(°C) = 出力電圧(mV) / 10。センサーは製造時にウェハーの段階で調整されているので、追加のキャリブレーションは不要で、出力のカーブはほぼ完全な直線です。標準的な非直線性はわずか±0.25 °Cです。
| 項目 | 値 |
|---|---|
| 出力 | 10 mV/°C、0 °Cで0 V(25 °Cで250 mV、100 °Cで1000 mV) |
| 電源電圧 | 4〜30 V |
| 消費電流 | 60 µA未満(5 Vで標準56 µA) |
| 自己発熱 | 静止した空気中で約0.08 °C |
| 非直線性 | 標準±0.25 °C |
| 出力インピーダンス | 1 mAの負荷で0.1 Ω |
| 容量性負荷 | 特別な対策なしで50 pFまで |
| パッケージ | TO-92(最も一般的)、TO-220、SOIC-8、金属のTO-46 |
LM35は1つの部品ではなく、ファミリーです。末尾の文字で測定範囲と保証される精度が決まり、最後のZはプラスチックのTO-92パッケージを表します。データシートによると、プラスチックのTO-92版はLM35C、LM35CA、LM35Dで、ホビー向けの店で「LM35」として売られている部品のほとんどは、実際にはLM35DZです。つまり、手元のセンサーは0〜100 °Cしか保証されておらず、25 °Cで最大±1.5 °Cずれる可能性があります。ただし標準的な誤差は±0.6 °C前後です。どれを持っているかは、部品の印字を読んで確かめましょう。
| 型番 | 測定範囲 | 25 °Cで保証される精度 | 範囲の端での最悪値 |
|---|---|---|---|
| LM35A | −55 … +150 °C | ±0.5 °C | ±1 °C |
| LM35 | −55 … +150 °C | ±1 °C | ±1.5 °C |
| LM35CA | −40 … +110 °C | ±0.5 °C | ±1.5 °C |
| LM35C | −40 … +110 °C | ±1 °C | ±2 °C |
| LM35D(LM35DZ) | 0 … +100 °C | ±1.5 °C | ±2 °C |
LM35のピン配置と最も多い逆接続の失敗
LM35の平らな面を手前に向け、足を下にすると、左から順に1番ピン +Vs(電源)、2番ピン Vout(出力)、3番ピン GND(グラウンド)です。データシートの図は底面から見たものなので、頭の中で裏返して逆に配線してしまう人が多くいます。小さな基板に載ったLM35のモジュールでは、ピンにふつうVCC(または+)、OUT(またはS)、GND(または−)と書かれているので、その場合は基板の表示を信じましょう。
LM35とArduinoの配線:Uno、ESP32、Pico
| LM35のピン | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| 1 · +Vs(左) | 5V | 5V / VIN(USBからの5 V) | VBUS、40番ピン(USBからの5 V) |
| 2 · Vout(中央) | A0 | GPIO 34(ADC1) | GP26 / ADC0、31番ピン |
| 3 · GND(右) | GND | GND | AGND 33番ピンまたはGND 38番ピン |
| 0.1 µFのコンデンサ | +VsとGNDの間、センサーの近く | +VsとGNDの間、センサーの近く | +VsとGNDの間、センサーの近く |
analogReadから°Cへ:LM35の計算式
Arduino Unoのアナログ・デジタル変換器(ADC)は10ビットで、0 Vから基準電圧までを1024段階に分け、0〜1023の数値を返します。基準電圧は初期設定で5 Vなので、1段階は5 / 1024 = 4.88 mVです。まず生の値を電圧に、次に電圧を温度に変換します:電圧 = 生の値 × 5.0 / 1024、温度 = 電圧 × 100。まとめると、温度 ≈ 生の値 × 0.488です。1024の代わりに1023を使う例もあります。差は1000分の1でLM35自体の誤差に比べればごくわずかですが、正しい値は1024です。ADCをもっと詳しく知りたいなら、アナログ・デジタル変換(ADC)の記事をご覧ください。
| analogReadの値 | 電圧(基準電圧5 V) | 温度 |
|---|---|---|
| 41 | 0.200 V | 20.0 °C |
| 51 | 0.249 V | 24.9 °C |
| 52 | 0.254 V | 25.4 °C |
| 61 | 0.298 V | 29.8 °C |
| 205 | 1.001 V | 100.1 °C |
表をよく見てください。室温ではADCは50前後の数値しか出さず、1段階変わるだけで温度が約0.5 °C動きます。値が24.9と25.4の間を行ったり来たりするのはそのためで、センサーの故障ではなく、単に基準電圧5 Vの分解能です。このあと内部基準電圧で解決します。
最初の測定をステップごとに
- LM35をブレッドボードに差します。平らな面を手前に向け、左の足を5Vに、右の足をGNDにつなぎます。
- 中央の足(Vout)をジャンパーワイヤーでA0につなぎます。あれば、+VsとGNDの間に0.1 µFのコンデンサを入れます。
- ArduinoをUSBでつなぎ、数秒後にセンサーに触れます。室温くらいなら問題ありません。熱ければ配線が逆です。
- 下のコードを書き込み、シリアルモニタを9600ボーで開きます。
- センサーを指でつまむと、値がゆっくり上がり、離すと下がるはずです。
1const int LM35_PIN = A0; // LM35 orta bacak (Vout) / LM35 middle leg (Vout)
2
3void setup() {
4 Serial.begin(9600);
5}
6
7void loop() {
8 int raw = analogRead(LM35_PIN); // 0–1023 ham değer / raw value 0–1023
9 float voltage = raw * 5.0 / 1024.0; // 5 V referansla volta çevir / convert to volts (5 V reference)
10 float tempC = voltage * 100.0; // 10 mV/°C: 0,25 V = 25 °C / 0.25 V = 25 °C
11
12 Serial.print(F("Ham / Raw: "));
13 Serial.print(raw);
14 Serial.print(F(" Gerilim / Voltage: "));
15 Serial.print(voltage, 3);
16 Serial.print(F(" V Sicaklik / Temp: "));
17 Serial.print(tempC, 1);
18 Serial.println(F(" C"));
19 delay(1000);
20}コードは1秒ごとにA0の生の値を読み、まず電圧に、次に温度に変換し、3つともシリアルモニタに表示します。生の値を表示しておくとデバッグにとても便利です。いつも0ならVoutから電圧が来ていません。1023に近ければアナログピンが誤って5 Vにつながっています。でたらめに飛ぶならA0が浮いています。固定の文字列をF()マクロの中に書くと、Unoの2 KBのRAMを節約できます。シリアルモニタのコツはArduinoのシリアルモニタの使い方の記事にもっとあります。
1.1 Vの内部基準電圧で分解能を上げる
基準電圧5 Vには2つの問題があります。1つ目は、先ほど見た粗い分解能です。2つ目はもっと厄介で、USBから来る5 Vは4.7〜5.1 Vのどこかになっていることが多く、コードには5.0と書いてあるため、その差がそのまま温度に入ってしまいます。たとえばボードが実際には4.8 Vで動いていると、25 °Cが26 °Cに見え、パソコンのUSBポートが負荷で電圧を下げると、温度が勝手に変わるように見えます。解決策は、Arduino UnoとNanoのATmega328Pに内蔵された1.1 Vの内部基準電圧を使うことです。analogReference(INTERNAL)のあとは、1段階が1.1 / 1024 = 1.07 mV、つまり約0.11 °Cになります。その代わり測れるのは最大1.1 V、つまり110 °Cまでですが、LM35DZの0〜100 °Cの範囲にはどのみち十分です。
| 基準電圧 | 命令 | 1段階 | 温度の1段階 | 測れる最高値 |
|---|---|---|---|---|
| 5 V(初期設定) | analogReference(DEFAULT) | 4.88 mV | 0.49 °C | 150 °C(センサーの上限) |
| 3.3 V(AREFに接続) | analogReference(EXTERNAL) | 3.22 mV | 0.32 °C | 150 °C(センサーの上限) |
| 1.1 V内部 | analogReference(INTERNAL) | 1.07 mV | 0.11 °C | 110 °C |
1.1 Vの基準電圧は、どのチップでもちょうど1.1 Vというわけではありません。ATmega328Pのデータシートによると、1.0〜1.2 Vのどこかになります。キャリブレーションしないと、最大9%の目盛りの誤差になります。直し方は簡単です。下のコードを書き込み、テスターでAREFピンとGNDの間の電圧を測り、その値をVREFの定数に書きます(例:const float VREF = 1.083;)。これはボードごとに一度やるだけで、結果はずっと有効です。このコードは、毎回の読み取りで32回のサンプルの平均も取ります。
1const int LM35_PIN = A0;
2const float VREF = 1.1; // AREF'te ölçtüğün değeri yaz (ör. 1.083) / write the voltage you measured on AREF (e.g. 1.083)
3const int SAMPLES = 32; // ortalama için ölçüm sayısı / number of samples to average
4
5void setup() {
6 Serial.begin(9600);
7 analogReference(INTERNAL); // Uno/Nano: 1,1 V dahili referans / 1.1 V internal reference
8 for (int i = 0; i < 5; i++) { // referans değişti, ilk okumaları at / discard the first readings after switching
9 analogRead(LM35_PIN);
10 delay(10);
11 }
12}
13
14float readTempC() {
15 long sum = 0;
16 for (int i = 0; i < SAMPLES; i++) {
17 sum += analogRead(LM35_PIN);
18 delay(2);
19 }
20 float raw = sum / (float)SAMPLES; // ortalama ham değer / average raw value
21 return raw * VREF / 1024.0 * 100.0; // her basamak ~0,107 °C / each step is ~0.107 °C
22}
23
24void loop() {
25 float t = readTempC();
26 Serial.print(F("Sicaklik / Temp: "));
27 Serial.print(t, 2);
28 Serial.println(F(" C"));
29 if (t > 108.0) {
30 Serial.println(F("Uyari: 1,1 V sinirina yakin / Warning: close to the 1.1 V limit"));
31 }
32 delay(1000);
33}平均化とノイズの低減
1回のanalogReadは、配線のノイズや電源のリップルのため、1〜2段階ぶれることがあります。最も簡単で効果的な対策は、何回か読んで平均を取ることです。ランダムなノイズはサンプル数の平方根に比例して小さくなるので、16回の平均でノイズは4分の1に、64回で8分の1になります。温度はゆっくり変わるので、数ミリ秒の間に何十回も読んでも損はありません。さらになめらかなカーブにするには、指数フィルタを使います:フィルタ後 = フィルタ後 + 0.1 × (新しい値 − フィルタ後)。このフィルタは新しい値の10%だけを反映し、メモリには変数を1つ持つだけです。移動平均やメディアンなどのほかの方法は、センサーデータのフィルタリングの記事で比べています。
- チャンネルを切り替えたら最初の値を捨てる:複数のアナログセンサーを読む場合、ADCのサンプリング用コンデンサが前のチャンネルの電圧を少しの間保っています。同じピンを2回読み、最初の結果は無視しましょう。
- センサーのGNDはArduinoのGNDピンへ直接つなぐ:リレー、モーター、LEDテープの電流が同じGND線を流れると、ミリボルト単位のずれが生まれます。LM35では10 mVごとに1度です。
- ケーブルは短くし、電源線から離す:長いシールドなしの線はアンテナのように働きます。必要ならツイストケーブルかシールドケーブルを使いましょう。
- センサーを熱源から離す:電圧レギュレーター、ESP32モジュール、リレーのすぐ横にあるLM35は、部屋ではなく基板の温度を測ってしまいます。
- オフセットを一度キャリブレーションする:LM35を信頼できる温度計の横に置き、一定の差をコードで引きます。
ESP32でLM35を使う:3.3 Vの電源とADCの直線性
ESP32は3.3 Vで動きますが、LM35のデータシートでは最低4 Vの電源が必要です。3.3 Vで給電したLM35は室温では動いているように見えても、精度は保証されません。正しい方法は、ボードの5Vピン(ボードによってはVIN)、つまりUSBから来る5 Vでセンサーに給電することです。これでESP32が壊れることはありません。最も熱いとき(150 °C)でもLM35の出力は1.5 Vを超えないからです。出力は必ずADC1のピン(GPIO 32〜39)につなぎます。ADC2のピンはWi-Fiがオンの間は使えないからです。ボードの詳しいピン配置はピン配置ツールで、ESP32が初めてならESP32とは?をご覧ください。
2つ目の問題は、ESP32のADCの直線性です。12ビット(0〜4095)ですが、両端では直線的でなく、100 mV未満の電圧はほとんど区別できず、ずれ方もボードごとに違います。LM35は室温で200〜300 mVしか出さないので、これは直接影響します。対策は2段階です。LM35の電圧範囲に合わせて減衰(アッテネーション)を選び、生の値の代わりに、製造時にチップに書き込まれたキャリブレーションデータを使うanalogReadMilliVolts()を使います。この関数は直接ミリボルトを返すので、結果を10で割るだけで温度になります。
| 減衰 | 正確に測れる範囲 | LM35での温度 |
|---|---|---|
| ADC_0db | 100〜950 mV | 10〜95 °C |
| ADC_2_5db | 100〜1250 mV | 10〜125 °C |
| ADC_6db | 150〜1750 mV | 15〜150 °C |
| ADC_11db(初期設定) | 150〜2450 mV | 15〜150 °C、最も粗い分解能 |
1const int LM35_PIN = 34; // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const int SAMPLES = 64; // ortalama için ölçüm sayısı / number of samples to average
3
4void setup() {
5 Serial.begin(115200);
6 analogReadResolution(12); // 0–4095
7 analogSetPinAttenuation(LM35_PIN, ADC_2_5db); // ~100–1250 mV, yani 10–125 °C / i.e. 10–125 °C
8}
9
10void loop() {
11 uint32_t sum = 0;
12 for (int i = 0; i < SAMPLES; i++) {
13 sum += analogReadMilliVolts(LM35_PIN); // kalibre edilmiş mV / calibrated millivolts
14 delay(1);
15 }
16 float mv = sum / (float)SAMPLES;
17 float tempC = mv / 10.0; // 10 mV = 1 °C
18 Serial.printf("Gerilim / Voltage: %.1f mV Sicaklik / Temp: %.2f C\n", mv, tempC);
19 delay(1000);
20}Raspberry Pi PicoとMicroPythonでLM35を使う
Picoの12ビットADCはGP26、GP27、GP28のピンにあり、基準電圧には3.3 VのラインをフィルタしたADC_VREFを使います。MicroPythonではread_u16()が結果を0〜65535に拡大するので、電圧 = 生の値 × 3.3 / 65535です。理論上の分解能は0.8 mV、つまり約0.08 °Cですが、実際にはPicoのADCは少しノイズが多く、特定の値で小さな飛びがあるので、ここでも平均化が欠かせません。LM35はUSBからの5 Vが来るVBUS(40番ピン)から給電します。PicoをUSBではなく電池で動かす場合は、VSYSの電圧が4 Vを超えていることを確かめ、そこからセンサーに給電しましょう。Picoが初めてなら、MicroPythonのセットアップはRaspberry Pi Picoとは?にあります。
1from machine import ADC, Pin
2import time
3
4# Pin(23, Pin.OUT, value=1) # yalnız Pico (W değil): regülatör PWM modu, daha az gürültü / Pico (not W) only: SMPS PWM mode, less noise
5lm35 = ADC(26) # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6VREF = 3.3 # ADC_VREF'i multimetreyle ölçüp yaz / measure ADC_VREF with a multimeter
7SAMPLES = 64 # ortalama için ölçüm sayısı / number of samples to average
8
9
10def read_temp_c():
11 total = 0
12 for _ in range(SAMPLES):
13 total += lm35.read_u16() # 0–65535, 12 bit sonuç 16 bite ölçeklenir / 12-bit result scaled to 16 bits
14 raw = total / SAMPLES
15 volts = raw * VREF / 65535
16 return volts * 100 # 10 mV/°C
17
18
19while True:
20 t = read_temp_c()
21 print("Sicaklik / Temp: {:.2f} C".format(t))
22 time.sleep(1)Picoのチップにも温度センサー(ADC(4))がありますが、測るのは部屋ではなくチップ自体の温度で、動作中はふつう数度高く出ます。室温には、LM35のような外付けのセンサーが必要です。標準のPicoでよりきれいな結果を得るには、GP23をHIGHにしてボードの電源レギュレーターをPWMモードにできます。ADC_VREFのリップルが減りますが、待機中の消費電流が少し増えます。Pico Wではこのピンが無線チップ用に予約されているので、コードではその行をコメントにしてあります。
LM35でマイナスの温度を測る
基本の回路では、LM35は2 °Cから150 °Cまでしか測れません。出力段は電流を出せても吸い込むことはほとんどできず、出力がGNDより下がれないからです。マイナスの温度については、データシートに2つの方法が載っています。1つ目は、出力を抵抗を通してマイナスの電源につなぐ方法です(R = Vs / 50 µA。−5 Vなら100 kΩ)。Arduinoのプロジェクトにはマイナスの電源がないので、あまり使われません。2つ目は単電源の方法です。直列にした2つのダイオード(例:1N4148)でLM35のGNDピンをGNDより約1 V持ち上げ、出力とGNDの間に18 kΩの抵抗をつなぎ、出力をA0で、LM35のGNDピンをA1で読みます。温度は(A0の電圧 − A1の電圧) × 100です。この回路でLM35自体のピンの間に4 V以上を確保するには、+Vsを5 VではなくVIN(例:9 VのACアダプター)から給電し、基準電圧5 Vを使います。一般的なLM35DZは0 °C未満が保証されていないことを忘れないでください。マイナスの値をよく測るなら、DS18B20のほうがずっと手間がかかりません。
LM35、DS18B20、DHT11の比較


| 項目 | LM35(LM35DZ) | DS18B20 | DHT11 |
|---|---|---|---|
| 出力 | アナログ、10 mV/°C | デジタル(1-Wire) | デジタル(単線) |
| 測定範囲 | 0 … +100 °C(LM35:−55 … +150 °C) | −55 … +125 °C | 0 … +50 °C |
| 精度 | 標準±0.6 °C、25 °Cで最大±1.5 °C | ±0.5 °C(−10 … +85 °C) | ±2 °C |
| 電源 | 4〜30 V | 3.0〜5.5 V | 3〜5.5 V |
| 湿度 | なし | なし | あり |
| ライブラリ | 不要 | OneWire + DallasTemperature | DHT sensor library |
| 読み取り時間 | 即時、連続出力 | 12ビットで最大750 ms | 1秒に最大1回 |
| ESP32とPicoで | 5 Vの電源で。ADCの限界に注意 | 3.3 Vでそのまま | 3.3 Vでそのまま |
| 1本のピンに複数のセンサー | 不可、1個に1本のアナログピン | 可 | 不可 |
| 防水版 | なし、自分で防水する必要がある | ステンレスのプローブ | なし |
まとめると、すばやく反応し、ライブラリ不要で、アナログピン1本で、5 VのArduinoで動くシンプルな温度計がほしいなら、LM35が最適です。アナログの読み取りとADCの基準電圧を学ぶには、最も勉強になるセンサーでもあります。ケーブルが長い、マイナスの温度が必要、センサーを液体に入れる、ESP32やPicoのような3.3 Vのボードで使う、といった場合はDS18B20のほうが向いています。湿度もほしいなら、DHT11か、より正確な兄弟分のDHT22を使いましょう。NTCサーミスタやBME280なども含めた幅広い比較は、Arduinoの温度センサーの比較をご覧ください。
LM35を使ったプロジェクトのアイデア
LM35で最も人気のあるプロジェクトは、温度が設定値を超えるとファンを回すサーモスタットです。ポイントはヒステリシスです。30 °Cでファンをオンにし、28 °Cでオフにすれば、温度がしきい値ちょうどのあたりをうろうろしても、リレーが毎秒カチカチ切り替わることはなく、接点も傷みません。ファンはD7につないだリレーモジュールで動かせます。
1const int LM35_PIN = A0;
2const int RELAY_PIN = 7; // röle modülünün IN pini / relay module IN pin
3const float ON_TEMP = 30.0; // bu değerde fan açılır / fan turns on here
4const float OFF_TEMP = 28.0; // bu değerde fan kapanır / fan turns off here
5const float VREF = 1.1; // ölçtüğün AREF değeri / your measured AREF value
6bool fanOn = false;
7
8float readTempC() {
9 long sum = 0;
10 for (int i = 0; i < 32; i++) {
11 sum += analogRead(LM35_PIN);
12 }
13 return (sum / 32.0) * VREF / 1024.0 * 100.0;
14}
15
16void setup() {
17 Serial.begin(9600);
18 pinMode(RELAY_PIN, OUTPUT);
19 digitalWrite(RELAY_PIN, LOW);
20 analogReference(INTERNAL); // 1,1 V referans / 1.1 V reference
21 analogRead(LM35_PIN); // ilk okumayı at / discard the first reading
22 delay(10);
23}
24
25void loop() {
26 float t = readTempC();
27 if (!fanOn && t >= ON_TEMP) fanOn = true; // eşik aşıldı / threshold exceeded
28 if (fanOn && t <= OFF_TEMP) fanOn = false; // yeterince soğudu / cooled down enough
29 digitalWrite(RELAY_PIN, fanOn ? HIGH : LOW); // aktif-HIGH röle varsayıldı / assumes an active-HIGH relay
30 Serial.print(t, 1);
31 Serial.println(fanOn ? " C fan ON" : " C fan OFF");
32 delay(1000);
33}- 設定を変えられるファンのサーモスタット:上のコードをDCファンとリレーと組み合わせ、2つのボタンでしきい値を上げ下げします。
- LCD付きのデジタル温度計:I2C LCDかOLEDディスプレイに、温度とその日の最低・最高を表示します。
- 過熱アラーム:電源、電池の充電器、3Dプリンターのモーターが熱くなりすぎたら、ブザーを鳴らしてLEDを点けます。
- Wi-Fiの室温計:ESP32で測った温度を、スマートフォンで開くウェブページに表示します。
- 温室と孵卵器の制御:温度に応じてヒーターとファンを管理するシステムを作ります。詳しくはスマート温室プロジェクトの記事をご覧ください。
- 温度ロガー:1分ごとにSDカードに値を書き込み、1日の温度のカーブをExcelでグラフにします。
よくある失敗と対処法
| 症状 | 考えられる原因 | 対処法 |
|---|---|---|
| センサーが触れないほど熱くなる | +VsとGNDが入れ替わっている | すぐに電源を切る。平らな面を手前にして+Vs、Vout、GNDの順にする |
| 値がいつも0 | センサーに電源が来ていない、またはVoutがコードと違うピンにつながっている | テスターで+VsとGNDの間が5 Vか測り、VoutがA0につながっているか確認する |
| 値がでたらめに飛ぶ | A0が浮いている、またはブレッドボードの接触不良 | ジャンパーワイヤーを替え、センサーをブレッドボードの別の列に移す |
| 値が0.5 °C刻みで行ったり来たりする | 基準電圧5 Vの分解能 | analogReference(INTERNAL)を使い、平均を取る |
| リレーやモーターが切り替わると値が飛ぶ | 共通のGNDでの電圧降下とノイズ | センサーのGNDをArduinoへ直接つなぎ、0.1 µFのコンデンサを入れる |
| 実際の温度より2〜3 °C高く出る | センサーがレギュレーターやESP32モジュールの横にある | ケーブルを使ってセンサーをボードから離す |
| ほかのアナログセンサーが1023になる | INTERNALの基準電圧で、すべてのアナログ入力が1.1 Vまでになる | ほかのセンサーは基準電圧5 Vで読むか、電圧を分圧する |
| 寒いとESP32でおかしな値になる | ESP32のADCは100 mV未満を正確に測れない | 10 °C未満ではDS18B20を使う |
LM35は、アナログセンサーの読み取り、ADCの基準電圧、信号のフィルタリングを学ぶのにぴったりの最初の部品です。1つの式から始めて、正しい基準電圧、平均化、キャリブレーションで、測定を温度計と同じくらい信頼できるものにしていきます。NTCサーミスタなどのほかのアナログセンサーでも同じ考え方を使います。BlueGraysアプリには、NTCとLCDでの温度測定、DHT11での温度と湿度、LCD付きのESP32温度ステーション、温度ロガーなどのプロジェクトが、ステップごとの回路図とすぐに使えるコード付きで用意されています。
よくある質問
LM35に必要な電圧は?3.3 Vで動きますか?
LM35のデータシートでは電源は4〜30 Vと定められています。3.3 Vでも室温ならたいてい値は出ますが、精度は保証されません。ESP32とPicoでは、センサーを5 Vのピン(VINかVBUS)から給電してください。出力は1.5 Vを超えないので、3.3 Vのアナログ入力に直接つなげます。
LM35が熱くなるのはなぜですか?
通常の動作では、LM35の消費電流は約60 µAだけで、自己発熱は0.1 °C未満です。熱く感じるなら、ほぼ確実に電源とGNDのピンが逆です。平らな面を手前に向けたときの正しい順番は、左から+Vs、Vout、GNDです。すぐに電源を切りましょう。長く逆につないだままのセンサーは永久に壊れることがあります。
LM35の温度の計算式は?
基準電圧5 VのArduino Unoでは、温度(°C) = analogRead × 5.0 / 1024 × 100、つまりおよそanalogRead × 0.488です。1.1 Vの内部基準電圧では係数が1.1 / 1024 × 100 ≈ 0.107になります。ESP32では、analogReadMilliVolts()の結果を10で割るだけです。
LM35でマイナスの温度は測れますか?
基本の回路では、LM35は2 °Cから150 °Cまでしか測れません。マイナスの値には、出力を抵抗を通してマイナスの電源に引っぱるか、2つのダイオードでGNDピンを持ち上げて2つのアナログ入力で差を測る必要があります。センサーも、LM35やLM35Cのように0 °C未満に対応した版でなければなりません。実際には、氷点下の温度にはDS18B20のほうがずっと簡単です。
LM35とDS18B20はどちらがいいですか?
ケーブルの短い5 VのArduinoのプロジェクトなら、ライブラリ不要ですぐに読めるLM35はとても便利です。長いケーブル、マイナスの温度、液体の中での測定、1本のピンに複数のセンサー、3.3 Vのボードでは、デジタルのDS18B20のほうが正確で信頼できる結果になります。室温ではLM35AとDS18B20の精度は同じくらいですが、一般的なLM35DZは少し劣ります。
LM35の値が変わり続けるのはなぜですか?
基準電圧5 VではADCの1段階が約0.5 °Cに相当するので、値が2つの段階の間を行ったり来たりし、USBの電圧のリップルも結果に影響します。analogReference(INTERNAL)で1.1 Vの基準電圧に切り替え、16〜64回の平均を取り、センサーの電源ピンの間に0.1 µFのコンデンサを入れましょう。リレーやモーターがあるなら、センサーのGNDをArduinoへ直接つなぎます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
DHT11で温度と湿度を測定
部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

LDRで光の強さを測定
部屋の明るさを数値で見てみませんか?光に反応する小さな部品、LDRで周囲の光を測定し、Arduinoが0.5秒ごとにその値をコンピューターの画面に表示します。手で覆うと数値が変わる様子を確認できます。自動で点灯する常夜灯などのプロジェクトへの第一歩です。

ESP32とLDRモジュールで光の強さを読み取る
LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

NTCと2x16 LCDディスプレイで温度を測定
小さなビーズのようなセンサーで周囲の温度を測ります。NTCというこの部品は、温まるほど電気が流れやすくなります。Arduinoがその変化を読み取り、数式で摂氏温度に変換して、2行のLCDディスプレイに0.5秒ごとに表示します。手のひらでセンサーを温めて、数値が上がる様子を見るのも楽しみの1つです。

LCDディスプレイ付きデジタル電圧計
自作の測定器で、電池や電源アダプターが出力する電圧を調べます。2つの抵抗で作る分圧回路が、高い電圧をボードで読み取れるレベルまで下げます。Arduinoが元の電圧を計算し、2行のLCDディスプレイにボルト単位で表示します。この回路では約55ボルトまでの直流電圧を測定できます。コンセントの商用電源には絶対に接続しないでください。

ESP32 DHT22温湿度計(LCDディスプレイ付き)
DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。

I2CでLCDディスプレイを使う
Arduinoにディスプレイを接続し、最初のメッセージを表示します。2行のLCDディスプレイは数本の配線だけで接続できます。まず上の行にあいさつを表示し、次に下の行にもう1つのメッセージを表示します。その後、表示を消去して最初から繰り返します。温度や時刻、スコアを表示するプロジェクトは、すべてこのステップから始まります。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

