Arduino、ESP32、ESP8266などの開発ボードに対応した温度センサーは多種多様です。 そのため、プロジェクトに最適なセンサをピックアップするのは難しいかもしれません。 今回は、広く使われている6つの温度センサを比較してみましょう。 DHT11、DHT22、LM35、DS18B20、BME280、BMP180です。
通信プロトコル、温度範囲、精度、使い勝手などに関して、各センサーを比較します。
また、すべての温度センサーを使用して、同じ環境の温度を経時的に測定するという簡単な実験も行いました。 この実験では、温度変化に対するセンサーの反応を見ることができました。 この実験は約 36 時間行い、結果はこの記事の後半で紹介します。
Recommended reading: 9 Arduino Compatible Temperature Sensors for Your Electronics Projects
Comparing Temperature Sensors: DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180
センサーを簡単に比較するために、温度センサーを選択する際に最も重要な情報、すなわち通信プロトコル、電源電圧、温度範囲および精度を示す次の表をまとめました。
Sensor | DHT11 | DHT22 (AM2302) | LM35 | DS18B20 | BME280 | BMP180 | ||||||||
Measures | Temperature Humidity |
温度 Humidity 温度 |
温度 湿度 圧力 |
温度 圧力 |
||||||||||
通信 プロトコル |
One-> | One-> | One-> | One-> | 通信 プロトコル |
One-> | One-> | One-> | One-> | One-> Oneワイヤ | ワンワイヤ | アナログ | ワンワイヤ | I2C SPI |
電源 電圧 |
3~5.5V DC | 3~6V DC | 4~30V DC | 3~5.5V DC | 1.8~3.6V (チップに対して)基板用 3.3~5V(基板用) | |||||||||
温度範囲 | -40~80℃ | -55~150℃ | – | -55~150℃ | -55~150℃ | -40~85℃ | ||||||||
精度 | +0.5℃(0~50℃)。5ºC (-40~80ºC) | +/-0.5ºC (25ºC) | +/-0.5ºC (-10~85ºC) | +/-0.5ºC (25ºC) | +/-0.5ºC (25ºC)5ºC (at 25ºC) | |||||||||
サポート (Arduino IDE) |
Adafruit DHT Library Adafruit Unified Sensor Library |
Adafruit DHT Library Adafruit Unified Sensor Library |
analogRead() | DallasTemperature OneWire |
Adafruit BME280を使用する。 library Adafruit Unified Sensor Library |
Adafruit BME085 Adafruit Unified Sensor Library |
||||||||
Support (MicroPython)です。 |
dhtモジュール(MicroPythonファームウェアに含まれる) | from machine import ADC ADC().Dht().Dht().Dht().Dht().Dht().read |
ds18b20 モジュール (MicroPython ファームウェアに含まれる) | BME280 Adafruit Library | BMP180 モジュール | |||||||||
どこで購入する? | 価格確認 | 価格確認 | 価格確認 価格確認(防水) |
価格確認 |
DHT11の価格確認 vs DHT22 (AM2302)
DHT11とDHT22(AM2302)は、温度および湿度を測定するデジタル温度センサーです。 見た目は非常によく似ており、動作も同じですが、仕様が異なります。
どちらのセンサも3.3Vまたは5Vで電源を供給することができます。 そのため、Arduino または ESP プロジェクトで簡単に使用できます。
DHT22センサーは、より良い分解能とより広い温度および湿度測定範囲を備えています。 しかし、少し高価で、2秒間隔の読み取りしか要求できません。
DHT11は少し安価で、範囲が狭く、精度が低いです。
その違いにもかかわらず、これらは同様の方法で動作し、温度と湿度を読み取るために同じコードを使用することができます。 使用するセンサーの種類をコードで選択するだけです。
ですから、1 ドル余分に使ってもよいのであれば、DHT11 よりも DHT22 をお勧めします。
DHT11およびDHT22センサーの使用方法については、いくつかのガイドを用意しています。
- ESP32 (Arduino IDE) DHT11/DHT22 温度および湿度センサー
- ESP8266 (Arduino IDE) DHT11/DHT22 温度および湿度ウェブセンサー (英語) サーバー
- Arduino DHT11/DHT22湿度・温度センサー付き
- ESP32/ESP8266 (MicroPython) DHT11/DHT22 Webサーバー付き
LM35, LM35、LM335、LM34
LM35, LM335, LM34は、温度値に比例して電圧を出力するリニア温度センサです。 LM35は摂氏で、LM335はケルビンで、LM34は華氏で校正されています。
温度をケルビンから変換するためにLM335の測定値に大きな数値を差し引くと、結果の精度が損なわれることがあるので、LM335ではなく、LM35またはLM34を使用することをお勧めします。
これらのセンサから温度を読み取るには、アナログピンを使用してセンサの出力電圧を読み取るだけでよいのです。 Arduino を使用する場合は、analogRead() 関数を使用するだけで、小数点以下 2 桁の温度測定値が得られます。
したがって、温度を監視するための安価で使いやすいセンサーが必要な場合、LM35 は良い選択肢となりえます。 また、消費電力が非常に少ないので、低消費電力が求められるポータブル・プロジェクトに最適です。
ArduinoでLM35、LM335、LM34温度センサを使用する方法:
- Guide for LM35, LM335 and LM34 Temperature Sensors with Arduino
DS18B20 Temperature Sensor
DS18B20 temperature sensor is a one-wire digital temperature sensor.
外部電源から電力を供給するか、またはデータ・ライン(「パラサイト・モード」と呼ばれる)から電力を得て、外部電源の必要性を排除することが可能です。 これにより、複数のセンサを同じデータ・ワイヤに配線することができます。 そのため、1つのGPIOを使用して複数のセンサから温度を取得することができます。
さらに、温度センサーの分解能を9、10、11、または12ビットに設定でき、それぞれ0.5℃、0.25℃、0.125℃、0.0625℃の増分に相当します。 電源投入時のデフォルトの分解能は12ビットです。
DS18B20温度センサーは、防水バージョンもあり、屋外プロジェクトや液体温度の測定に最適です。
当社のガイドに従って、Arduino IDE または MicroPython を使用して ESP32、ESP8266 および Arduino で DS18B20 温度センサーの使用方法を学ぶことができます。
- ESP32 (Arduino IDE) DS18B20 Temperature Sensor (Single, Multiple, Web Server)
- ESP8266 (Arduino IDE) DS18B20 Temperature Sensor (Single, Multiple.Web Server)
- ESP8266 (Arduino IDE) DS18B20 Temperature Sensor (Single, Multiple, Webサーバ)
- ESP32 と ESP8266 (MicroPython) with DS18B20 Temperature Sensor
- Arduino with DS18B20 Temperature Sensor
BME280 vs BMP180
BME280とBMP180は気圧センサーで、これは大気圧を読み取ることを意味します。 また、BME280には温度と湿度センサーが、BMP180には温度センサーが搭載されています。 気圧は高度によって変化するため、これらのセンサーを使用して高度を推定することもできます。
温度範囲については、BME280は-40~85℃、BMP180は0~65℃と広い範囲を測定することができます。
BME280はI2CまたはSPI通信プロトコルを使用でき、BMP180はI2C通信のみを使用できます。 例えば、このセンサだけでウェザーステーションのプロジェクトを作ることができます。
これらのセンサーとArduino、ESP826、ESP32との連携は、Adafruitのライブラリのおかげで非常に簡単です。
これらのセンサーの使用方法については、当社のガイドを参照してください:
- BMP180:
- ArduinoとBMP180気圧センサー
- ESP32 (Arduino IDE) とBMP180気圧センサー
- BME280.BMP180:BMP180
これらのセンサーの使用方法は、当社のガイドで学ぶことができます。
- ESP32 (Arduino IDE) with BME280 Sensor (Pressure, Temperature, Humidity)
- ESP8266 (Arduino IDE) with BME280 Sensor (Pressure, Temperature, Humidity)
- Arduino with BME280 Sensor (Pressure, Temperature, Humidity)
その他BME280を用いたプロジェクトもございますので、お好きなプロジェクトはこちら。
- ESP8266とBME280とMicroPythonを使用した低消費電力ウェザーステーションデータロガー
- ESP32 Web Server with BME280 – Mini Weather Station
- ESP32/ESP8266 Isert Data into MySQL Database using PHP and Arduino IDE
Testing All Temperature Sensors
This experiment logged temperature reading from different temperature sensors over time in same conditions.The experiment is not permitted to write a long time.
Arduino Megaに以下の温度センサをすべて配線しました。
- DHT11
- DHT22
- LM35
- 2x DS18B20 in the same data bus
- BME280
- BMP180
データはmicroSDカードモジュールでmicroSDカードに収録されました。 実験は約36時間行い、温度測定値は5分ごとに記録しました。
温度センサーのデータピンをArduino Megaの以下のピンに配線しました:
- DHT11: ピン11
- DHT22: ピン12
- DS18B20: ピン14
- LM35: ピンA0
- BME280: これらのピンでソフトウェアSPIを使用しました。 ピン4(MISO)、ピン5(CS)、ピン6(SCK)、ピン7(MOSI)
- BMP180: 20ピン(SDA)、21ピン(CSL)
microSDカードモジュールは、ハードウェアSPIで接続しました。
これは、Arduino Mega で実行されているコードです。
/* * Rui Santos * Complete Project Details https://RandomNerdTutorials.com */#include "DHT.h"#include <OneWire.h>#include <DallasTemperature.h>#include <Wire.h>#include <SPI.h>#include <Adafruit_Sensor.h>#include <Adafruit_BME280.h>#include <Wire.h>#include <Adafruit_BMP085.h>#include <SD.h> // for the SD cardconst int DHT11sensorPin = 11; const int DHT22sensorPin = 12; DHT dht11(DHT11sensorPin, DHT11);DHT dht22(DHT22sensorPin, DHT22);float DHT11temperature;float DHT22temperature;const int DS18B20sensorPin = 14;OneWire oneWire(DS18B20sensorPin);DallasTemperature ds18b20(&oneWire);float DS18B20temperature1;float DS18B20temperature2;const int BME_SCK = 6;const int BME_MISO = 4;const int BME_MOSI = 7;const int BME_CS = 5;Adafruit_BME280 bme280(BME_CS, BME_MOSI, BME_MISO, BME_SCK);Adafruit_BMP085 bmp180; const int LM35sensorPin = A0; float LM35sensorValue;float LM35voltageOut;float LM35temperature;const int chipSelectSDCard = 53; File myFile;void setup() { Serial.begin(9600); dht11.begin(); delay(2000); dht22.begin(); ds18b20.begin(); bme280.begin(); bmp180.begin(); pinMode(LM35sensorPin, INPUT); if(!SD.begin(chipSelectSDCard)) { Serial.println("SD card initialization failed!"); return; } Serial.println("SD card initialization done."); myFile=SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("File opened ok"); // print the headings for our data myFile.println("DHT11,DHT22,DS18B20-1,DS18B20-2,BME280,BMP180,LM35"); } myFile.close(); }void loop() { /*-------------------------------------------------------*/ //DHT11 DHT11temperature = dht11.readTemperature(); if (isnan(DHT11temperature)) { Serial.println("Failed to read from DHT11 sensor!"); return; } Serial.print("Temperature DHT11(ºC): "); Serial.println(DHT11temperature); /*-------------------------------------------------------*/ //DHT22 DHT22temperature = dht22.readTemperature(); if (isnan(DHT22temperature)) { Serial.println("Failed to read from DHT22 sensor!"); return; } Serial.print("Temperature DHT22(ºC): "); Serial.println(DHT22temperature);/*-------------------------------------------------*/ //DS18B20 ds18b20.requestTemperatures(); DS18B20temperature1 = ds18b20.getTempCByIndex(0); DS18B20temperature2 = ds18b20.getTempCByIndex(1); Serial.print("Temperature DS18B20-1(ºC): "); Serial.println(DS18B20temperature1); Serial.print("Temperature DS18B20-2(ºC): "); Serial.println(DS18B20temperature2);/*-------------------------------------------------*///BME280 Serial.print("Temperature BME280(ºC): "); Serial.println(bme280.readTemperature());/*-------------------------------------------------*///BMP180 Serial.print("Temperature BMP180(ºC): "); Serial.println(bmp180.readTemperature());/*-------------------------------------------------*/ //LM35 SENSOR LM35sensorValue = analogRead(LM35sensorPin); LM35voltageOut = (LM35sensorValue * 5000) / 1024; // calculate temperature for LM35 (LM35DZ) LM35temperature = LM35voltageOut / 10; Serial.print("Temperature LM35(ºC): "); Serial.println(LM35temperature); Serial.println(""); myFile = SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("File open with success"); myFile.print(DHT11temperature); myFile.print(","); myFile.print(DHT22temperature); myFile.print(","); myFile.print(DS18B20temperature1); myFile.print(","); myFile.print(DS18B20temperature2); myFile.print(","); myFile.print(bme280.readTemperature()); myFile.print(","); myFile.print(bmp180.readTemperature()); myFile.print(","); myFile.print(LM35temperature); myFile.println(","); } myFile.close(); delay(6000);}
生のコードを見る
注意: このコードをコンパイルして実行するには、Arduino IDE にこの記事の最初の比較表で言及したすべてのセンサー ライブラリをインストールする必要があります。 温度測定値の比較
約 36 時間後、microSD カードを取り出して、結果をスプレッドシートにコピーしました。 異なる温度センサーからの測定値をよりよく比較するために、すべての測定値をプロットしました。
このチャートには対照群がありません(校正された温度センサを使用していません)。 しかし、このセンサーがどのような挙動を示すのか、見当はついています。
チャートをよく見てみると、BME280は他の温度センサーよりもわずかに高い値を測定しています。 この動作は正常であり、これはデータシートに記載されています。 モジュールは少し自己発熱し、温度測定値は実際の温度値より1~2度高くなることがあります。
しかし、BME280は、測定値間の多くの振動がなく、より安定した温度測定値を示した温度センサーでもあります。 これは、センサーの分解能に関係しています。
温度センサーDS18B20の場合、読み取り値の間に振動が見られ、分解能がBME280ほど良くないことも目立ちます。 さらに、DS18B20温度センサーのみ、実験を通していくつかの「ヌル」な読み取り値を示しました。 同じデータラインで 2 つの DS18B20 温度センサーを測定しましたが、一方のセンサーは実験中 (36 時間中) 6 回温度を読み取れませんでした。
DHT22 と BMP180 は振動が少なく、非常によく似た挙動を示しました。 DHT11は分解能が1℃なので、小さな温度変化を検出できませんでした。
最後に、LM35温度センサーは24℃から26℃の温度変化を検出しましたが、測定間で多くの振動がありました。
異なる温度センサーを比較したこのチャートには、それぞれのセンサーが他のものとどう違うかが明確に示されています。
まとめ
この記事では、ESP32、ESP8266、Arduino、その他の開発ボードで使用できるいくつかの温度センサーを比較しました。 これらのセンサはすべて温度を測定しますが、同じ環境で同時にテストにかけると、それぞれ異なる挙動を示します。
この記事が気に入ったら、こちらもチェック!
- 9 Arduino Compatible Temperature Sensors for Your Electronics Projects
- ESP32/ESP8266 Plot Sensor Readings in Real Time Chart
- Enroll on our electronics Courses and eBook