Сравнение датчиков температуры: DHT11, DHT22, LM35, DS18B20, BME280 и BMP180
Содержание
Для быстрого сравнения датчиков мы составили следующую таблицу, в которой представлена наиболее важная информация для выбора датчика температуры, а именно: протокол связи, напряжение питания, диапазон температур и точность.
Примечание: таблица прокручивается по горизонтали как на настольном компьютере, так и на планшете и мобильном устройстве.
![]() | ![]() | ![]() | ![]() | |||
| Sensor | DHT11 | DHT22 (AM2302) | LM35 | DS18B20 | BME280 | BMP180 |
| Measures | Temperature Humidity | Temperature Humidity | Temperature | Temperature | Temperature Humidity Pressure | Temperature Pressure |
| Communication protocol | One-wire | One-wire | Analog | One-wire | I2C SPI | I2C |
| Supply voltage | 3 to 5.5V DC | 3 to 6V DC | 4 to 30 V DC | 3 to 5.5V DC | 1.7 to 3.6V (for the chip) 3.3 to 5V for the board | 1.8 to 3.6V (for the chip) 3.3 to 5V for the board |
| Temperature range | 0 to 50ºC | -40 to 80ºC | -55 to 150ºC | -55 to 125ºC | -40 to 85ºC | 0 to 65ºC |
| Accuracy | ± 2ºC (at 0 to 50ºC) | ± 0.5ºC (at -40 to 80ºC) | ±0.5ºC (at 25ºC) | ±0.5ºC (at -10 to 85ºC) | ±0.5ºC (at 25ºC) | ±0.5ºC (at 25ºC) |
| Support (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 module (included in MicroPython firmware) | dht module (included in MicroPython firmware) | from machine import ADC ADC().read | ds18b20 module (included in MicroPython firmware) | BME280 Adafruit Library | BMP180 module |
| Where to buy? | Check prices | Check prices | Check prices | Check prices Check prices (waterproof) | Check prices | Check prices |
DHT11 vs DHT22 (AM2302)

DHT11 и DHT22 (AM2302) — это цифровые датчики температуры, которые измеряют температуру и влажность. Они выглядят очень похоже и работают одинаково, но имеют разные технические характеристики.
Оба датчика могут питаться от 3,3 В или 5 В. Таким образом, вы можете легко использовать их в своих проектах на Arduino или ESP.
Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и вы можете запрашивать показания только с интервалом в 2 секунды.
DHT11 немного дешевле, имеет меньший диапазон и менее точен. Но вы можете получать показания датчика каждую секунду.
Несмотря на различия, они работают одинаково, и вы можете использовать один и тот же код для считывания температуры и влажности. Вам просто нужно выбрать в коде тип датчика, который вы используете.
Таким образом, если вы готовы потратить немного больше, мы рекомендуем DHT22 вместо DHT11.
LM35, LM335 and LM34

LM35, LM335 и LM34 — это линейные датчики температуры, которые выдают напряжение, пропорциональное значению температуры. LM35 калиброван в градусах Цельсия, LM335 — в градусах Кельвина, а LM34 — в градусах Фаренгейта. Таким образом, в зависимости от единиц измерения температуры, которые вы будете использовать в своем проекте, один из этих датчиков может оказаться более практичным, чем другой.
Мы рекомендуем использовать LM35 или LM34 вместо LM335, поскольку вычитание большого числа из измерений LM335 для преобразования температуры из Кельвина может снизить точность результатов.
Согласно техническому описанию, датчики LM35 и LM34 требуют очень мало тока для работы, около 60 мкА. Это приводит к очень низкому самонагреву (около 0,08 °C в неподвижном воздухе), что означает, что на измерения температуры не будет влиять сам датчик.
Чтобы считывать температуру с этих датчиков, вам просто нужно считывать выходное напряжение датчика с помощью аналогового вывода. Если вы используете Arduino, вам нужно просто воспользоваться функцией analogRead(), и вы получите показания температуры с двумя десятичными знаками.
Таким образом, если вам нужен недорогой и простой в использовании датчик для контроля температуры, LM35 может быть хорошим выбором. Кроме того, поскольку он потребляет очень мало энергии, он отлично подходит для портативных проектов, где требуется низкое энергопотребление.
DS18B20 Temperature Sensor

The DS18B20 temperature sensor is a one-wire digital temperature sensor. This means that it just requires one data line (and GND) to communicate with your microcontrollers.
It can be powered by an external power supply or it can derive power from the data line (called “parasite mode”), which eliminates the need for an external power supply.
Each DS18B20 temperature sensor has a unique 64-bit serial code. This allows you to wire multiple sensors to the same data wire. So, you can get temperature from multiple sensors using a single GPIO.
Additionally, the resolution of the temperature sensor can be set to 9, 10, 11, or 12 bits which corresponds to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively. The default resolution at power-up is 12-bit.
The DS18B20 temperature sensor is also available in waterproof version, ideal for outdoor projects or to measure liquid temperature.

BME280 vs BMP180
BME280 и BMP180 — это барометрические датчики, то есть они измеряют атмосферное давление. BME280 также оснащен датчиком температуры и влажности, а BMP180 — датчиком температуры. Поскольку давление изменяется с высотой, эти датчики можно также использовать для оценки высоты.
Что касается диапазона температур, BME280 имеет более широкий диапазон измерения: от -40 до 85 °C, в то время как BMP180 измеряет только от 0 до 65 °C. Следует иметь в виду, что модуль BME280 немного нагревается, поэтому измерения температуры могут быть на 1 или 2 градуса выше реального значения температуры.
BME280 может использовать протокол связи I2C или SPI, в то время как BMP180 может использовать только связь I2C.
Датчик BME280 стоит дороже, но имеет больше функций. Например, с помощью только этого датчика можно создать метеостанцию. Но если вам не нужно измерять давление или влажность, можно приобрести более дешевый датчик температуры.
Подключение этих датчиков к Arduino, ESP8266 и ESP32 очень простое благодаря библиотекам Adafruit.
Проверка всех датчиков температуры

Мы подключили все следующие датчики температуры к Arduino Mega:
DHT11
DHT22
LM35
2x DS18B20 в одной шине данных
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: вывод 51 (MOSI), вывод 50 (MISO), вывод 52 (SCK), вывод 53 (CS).
Это код, выполняемый в 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 card const 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); }
Результаты: сравнение показаний температуры
Примерно через 36 часов мы извлекли карту microSD и скопировали результаты в электронную таблицу. Мы построили график всех показаний, чтобы лучше сравнить измерения, полученные с помощью разных датчиков температуры.


В этом графике нет контрольной группы (мы не использовали откалиброванный датчик температуры), но мы имеем представление о том, как ведут себя эти датчики.
Если внимательно посмотреть на графики, то BME280 измерял немного более высокие значения, чем другие датчики температуры. Такое поведение является нормальным и описано в техническом паспорте. Модуль немного нагревается, и измерения температуры могут быть на 1 или 2 градуса выше реального значения температуры.
Однако BME280 также является датчиком температуры, который дает более стабильные показания температуры без больших колебаний между измерениями. Это связано с разрешением датчика. Он может обнаруживать изменения до 0,01 °C.
В случае датчиков температуры DS18B20 мы наблюдаем некоторые колебания между показаниями, а также заметно, что разрешение не так хорошее, как у BME280. Кроме того, датчик температуры DS18B20 был единственным, который давал некоторые «нулевые» показания на протяжении всего эксперимента. Мы измерили два датчика температуры DS18B20 в одной и той же линии данных, и один из датчиков не смог считывать температуру 6 раз в течение всего эксперимента (в течение 36 часов).
DHT22 и BMP180 ведут себя очень похоже, с небольшими колебаниями. DHT11 не смог обнаружить небольшие изменения температуры, поскольку его разрешение составляет 1ºC.
Наконец, датчик температуры LM35 обнаружил изменения температуры между 24ºC и 26ºC, но с большими колебаниями между измерениями.
Этот график, сравнивающий различные датчики температуры, ясно показывает, чем каждый датчик отличается от других. Так легче понять, как они работают и подходят ли они для проектов, которые вы хотите реализовать.
Подведение итогов
В этой статье мы сравнили несколько датчиков температуры, которые можно использовать с ESP32, ESP8266, Arduino и другими платами разработчика. Все эти датчики измеряют температуру, но ведут себя по-разному, когда их тестируют в одной и той же среде в одно и то же время.
Мы надеемся, что эта статья оказалась вам полезной и поможет выбрать лучший датчик температуры для вашего проекта.

































