部品 · 読了まで15分

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とDS18B20は同じ黒いTO-92パッケージで、見分けるのはほぼ不可能ですが、電源ピンが逆です。DS18B20では、平らな面を手前に向けると左がGND、右がVDDです。LM35の+VsとGNDを入れ替えると、チップ内部のダイオード構造に大きな電流が流れ、センサーは数秒で指をやけどするほど熱くなり、値も意味をなさなくなります。初めて電源を入れるときはセンサーに触れて確かめ、熱くなってきたらすぐに電源を切りましょう。短時間逆につないだだけのセンサーはたいてい無事ですが、精度が損なわれていることがあります。その後の値がおかしければ交換しましょう。

LM35とArduinoの配線:Uno、ESP32、Pico

LM35のピンArduino UnoESP32Raspberry Pi Pico
1 · +Vs(左)5V5V / VIN(USBからの5 V)VBUS、40番ピン(USBからの5 V)
2 · Vout(中央)A0GPIO 34(ADC1)GP26 / ADC0、31番ピン
3 · GND(右)GNDGNDAGND 33番ピンまたはGND 38番ピン
0.1 µFのコンデンサ+VsとGNDの間、センサーの近く+VsとGNDの間、センサーの近く+VsとGNDの間、センサーの近く
ノイズの多い環境では、メーカーはセンサーのすぐ横の+VsとGNDの間に0.1 µFのセラミックコンデンサを入れるようすすめています。「104」と書かれていて、コンデンサの表記ツールで読み解けます。LM35の出力が問題なく駆動できる容量性負荷は最大50 pFです。数メートルのケーブルはこれを超えてしまい、出力が発振し始めることがあります。長いケーブルを使う場合は、出力に直列に2 kΩの抵抗を入れるか、出力とGNDの間に75 Ω + 1 µFを直列にしたRCダンパーを追加しましょう。ツイストペアケーブルも干渉をかなり減らします。

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)温度
410.200 V20.0 °C
510.249 V24.9 °C
520.254 V25.4 °C
610.298 V29.8 °C
2051.001 V100.1 °C

表をよく見てください。室温ではADCは50前後の数値しか出さず、1段階変わるだけで温度が約0.5 °C動きます。値が24.9と25.4の間を行ったり来たりするのはそのためで、センサーの故障ではなく、単に基準電圧5 Vの分解能です。このあと内部基準電圧で解決します。

最初の測定をステップごとに

  1. LM35をブレッドボードに差します。平らな面を手前に向け、左の足を5Vに、右の足をGNDにつなぎます。
  2. 中央の足(Vout)をジャンパーワイヤーでA0につなぎます。あれば、+VsとGNDの間に0.1 µFのコンデンサを入れます。
  3. ArduinoをUSBでつなぎ、数秒後にセンサーに触れます。室温くらいなら問題ありません。熱ければ配線が逆です。
  4. 下のコードを書き込み、シリアルモニタを9600ボーで開きます。
  5. センサーを指でつまむと、値がゆっくり上がり、離すと下がるはずです。
C++ (Arduino IDE)
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 mV0.49 °C150 °C(センサーの上限)
3.3 V(AREFに接続)analogReference(EXTERNAL)3.22 mV0.32 °C150 °C(センサーの上限)
1.1 V内部analogReference(INTERNAL)1.07 mV0.11 °C110 °C

1.1 Vの基準電圧は、どのチップでもちょうど1.1 Vというわけではありません。ATmega328Pのデータシートによると、1.0〜1.2 Vのどこかになります。キャリブレーションしないと、最大9%の目盛りの誤差になります。直し方は簡単です。下のコードを書き込み、テスターでAREFピンとGNDの間の電圧を測り、その値をVREFの定数に書きます(例:const float VREF = 1.083;)。これはボードごとに一度やるだけで、結果はずっと有効です。このコードは、毎回の読み取りで32回のサンプルの平均も取ります。

C++ (Arduino IDE)
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}
analogReference(INTERNAL)はボードのすべてのアナログ入力に影響します。同じプロジェクトでポテンショメーターやLDRも読んでいるなら、1.1 Vを超える値はすべて1023になります。内部基準電圧を選んでいる間は、AREFピンに外部の電圧を決して加えないでください。AREFに3.3 Vをつなぎたい場合は、最初のanalogReadの前にanalogReference(EXTERNAL)を呼ぶ必要があります。そうしないと内部基準電圧と外部の電源がショートし、マイコンが壊れることがあります。Arduino Megaではこの設定はINTERNAL1V1という名前で、LeonardoとMicroではINTERNALが2.56 V、Uno R4ではanalogReference(AR_INTERNAL)が1.5 Vです。

平均化とノイズの低減

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_0db100〜950 mV10〜95 °C
ADC_2_5db100〜1250 mV10〜125 °C
ADC_6db150〜1750 mV15〜150 °C
ADC_11db(初期設定)150〜2450 mV15〜150 °C、最も粗い分解能
C++ (Arduino IDE)
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}
ESP32はどの減衰を選んでも100 mV未満を確実に測れないので、ESP32での10 °C未満のLM35の値は正しくありません。寒い部屋、屋外、冷蔵庫にはDS18B20を使いましょう。3.3 Vしかない回路でアナログセンサーを使いたいなら、TMP36がよい代わりになります。2.7〜5.5 Vで動き、0 °Cで500 mVを出力します。ピン配置はLM35と同じで、式は温度 = (mV − 500) / 10です。

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とは?にあります。

MicroPython
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の比較

DS18B20
DS18B20
DHT11
DHT11
項目LM35(LM35DZ)DS18B20DHT11
出力アナログ、10 mV/°Cデジタル(1-Wire)デジタル(単線)
測定範囲0 … +100 °C(LM35:−55 … +150 °C)−55 … +125 °C0 … +50 °C
精度標準±0.6 °C、25 °Cで最大±1.5 °C±0.5 °C(−10 … +85 °C)±2 °C
電源4〜30 V3.0〜5.5 V3〜5.5 V
湿度なしなしあり
ライブラリ不要OneWire + DallasTemperatureDHT sensor library
読み取り時間即時、連続出力12ビットで最大750 ms1秒に最大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につないだリレーモジュールで動かせます。

C++ (Arduino IDE)
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の精度を簡単に確かめるには、信頼できる温度計の横に数分置いてみましょう。差が一定(例:いつも0.8 °C高い)なら、コードでオフセットとして引きます。表面の温度を測る場合は、センサーと足をエポキシの小さな玉で表面に接着します。メーカーによると、こうするとLM35は表面の温度にとてもよく追従します。センサーを液体に入れる場合は、必ず足を絶縁してください。濡れた足の間の漏れ電流で値がずれていくからです。

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で温度と湿度を測定
#55中級

DHT11で温度と湿度を測定

部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

4.7(47)
73
LDRで光の強さを測定
#11初級

LDRで光の強さを測定

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

4.6(81)
139
ESP32とLDRモジュールで光の強さを読み取る
#113初級

ESP32とLDRモジュールで光の強さを読み取る

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

4.6(36)
55
NTCと2x16 LCDディスプレイで温度を測定
#44初級
プレミアム

NTCと2x16 LCDディスプレイで温度を測定

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

4.5(33)
44
LCDディスプレイ付きデジタル電圧計
#56中級
プレミアム

LCDディスプレイ付きデジタル電圧計

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

4.5(27)
36
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

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

4.8(38)
56
ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
#144上級
プレミアム

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)

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

4.7(7)
12
I2CでLCDディスプレイを使う
#32初級
プレミアム

I2CでLCDディスプレイを使う

Arduinoにディスプレイを接続し、最初のメッセージを表示します。2行のLCDディスプレイは数本の配線だけで接続できます。まず上の行にあいさつを表示し、次に下の行にもう1つのメッセージを表示します。その後、表示を消去して最初から繰り返します。温度や時刻、スコアを表示するプロジェクトは、すべてこのステップから始まります。

4.8(53)
70