DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180

Существует огромное количество датчиков температуры, совместимых с Arduino, ESP32, ESP8266 и другими платами разработки. Поэтому бывает сложно выбрать наиболее подходящий датчик для вашего проекта. В этой статье мы сравним 6 широко используемых датчиков температуры: DHT11, DHT22, LM35, DS18B20, BME280 и BMP180.

DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180 — датчики температуры

Мы сравним датчики по протоколу связи, диапазону измерения температуры, точности, простоте использования и многому другому.

Также мы провели простой эксперимент, в котором измеряли температуру в одной и той же среде с помощью всех датчиков температуры в течение определённого времени. С помощью этого эксперимента мы смогли увидеть, как датчики реагируют на изменения температуры. Мы проводили этот эксперимент примерно 36 часов и покажем вам результаты далее в этой статье.

Рекомендуемое чтение: 9 совместимых с Arduino датчиков температуры для ваших электронных проектов

Сравнение датчиков температуры: DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180

Для быстрого сравнения датчиков мы составили следующую таблицу, которая показывает наиболее важную информацию при выборе датчика температуры, а именно: протокол связи, напряжение питания, диапазон температур и точность.

Примечание: таблица прокручивается горизонтально как на настольном компьютере, так и на планшете и мобильном устройстве.

DHT11

DHT22 (AM2302)

LM35

DS18B20

BME280

BMP180

Измеряет

Температура, Влажность

Температура, Влажность

Температура

Температура

Температура, Влажность, Давление

Температура, Давление

Протокол связи

One-wire

One-wire

Аналоговый

One-wire

I2C, SPI

I2C

Напряжение питания

3 – 5,5 В DC

3 – 6 В DC

4 – 30 В DC

3 – 5,5 В DC

1,7 – 3,6 В (чип); 3,3 – 5 В (модуль)

1,8 – 3,6 В (чип); 3,3 – 5 В (модуль)

Диапазон температур

0 – 50 °C

-40 – 80 °C

-55 – 150 °C

-55 – 125 °C

-40 – 85 °C

0 – 65 °C

Точность

+/- 2 °C (при 0 – 50 °C)

+/- 0,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)

Поддержка (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 BMP085, Adafruit Unified Sensor Library

Поддержка (MicroPython)

модуль dht (встроен в прошивку MicroPython)

модуль dht (встроен в прошивку MicroPython)

from machine import ADC; ADC().read

модуль ds18b20 (встроен в прошивку MicroPython)

BME280 Adafruit Library

BMP180 module

Где купить?

Проверить цены

Проверить цены

Проверить цены

Проверить цены, Проверить цены (водонепроницаемый)

Проверить цены

Проверить цены

DHT11 vs DHT22 (AM2302)

DHT11 vs DHT22 — датчик температуры и влажности

DHT11 и DHT22 (AM2302) — это цифровые датчики температуры, которые измеряют температуру и влажность. Они выглядят очень похоже и работают одинаково, но имеют разные характеристики.

Оба датчика могут питаться от 3,3 В или 5 В. Поэтому вы можете легко использовать их в ваших проектах на Arduino или ESP.

Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и вы можете запрашивать показания только с интервалом в 2 секунды.

DHT11 немного дешевле, имеет меньший диапазон и менее точен. Но вы можете получать показания датчика каждую секунду.

Несмотря на различия, они работают аналогичным образом, и вы можете использовать один и тот же код для считывания температуры и влажности. Вам нужно лишь выбрать в коде тип используемого датчика.

Итак, если вы готовы потратить лишний доллар, мы рекомендуем DHT22 вместо DHT11.

У нас есть несколько руководств по использованию датчиков DHT11 и DHT22:

LM35, LM335 и LM34

Аналоговый датчик температуры LM35, LM335 и LM34

LM35, LM335 и LM34 — это линейные датчики температуры, которые выдают напряжение, пропорциональное значению температуры. LM35 откалиброван в градусах Цельсия, LM335 — в Кельвинах, а LM34 — в градусах Фаренгейта. Поэтому, в зависимости от единиц измерения температуры, которые вы будете использовать в своём проекте, один из этих датчиков может быть практичнее другого.

Мы рекомендуем использовать LM35 или LM34 вместо LM335, поскольку вычитание большого числа из показаний LM335 для преобразования температуры из Кельвинов может снизить точность результатов.

Согласно даташиту, датчики LM35 и LM34 потребляют очень мало тока — около 60 мкА. Это приводит к очень низкому самонагреву (около 0,08 °C в неподвижном воздухе), что означает, что измерения температуры не будут зависеть от самого датчика.

Для считывания температуры с этих датчиков нужно лишь прочитать выходное напряжение датчика с помощью аналогового вывода. При использовании Arduino достаточно вызвать функцию analogRead(), и вы получите показания температуры с двумя десятичными знаками.

Итак, если вам нужен недорогой и простой в использовании датчик для мониторинга температуры, LM35 может быть хорошим вариантом. Кроме того, благодаря очень низкому энергопотреблению, он отлично подходит для портативных проектов, где требуется низкое энергопотребление.

Узнайте, как использовать датчики температуры LM35, LM335 и LM34 с Arduino:

Датчик температуры DS18B20

Датчик температуры DS18B20

Датчик температуры DS18B20 — это цифровой датчик температуры с интерфейсом one-wire. Это означает, что для связи с вашими микроконтроллерами ему требуется только одна линия данных (и GND).

Он может питаться от внешнего источника питания или получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.

Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одной шине данных. Таким образом, вы можете получать температуру от нескольких датчиков, используя один GPIO.

Кроме того, разрешение датчика температуры может быть установлено на 9, 10, 11 или 12 бит, что соответствует приращениям 0,5 °C, 0,25 °C, 0,125 °C и 0,0625 °C соответственно. Разрешение по умолчанию при включении питания составляет 12 бит.

Датчик температуры DS18B20 также доступен в водонепроницаемом исполнении, идеально подходящем для проектов на открытом воздухе или для измерения температуры жидкости.

Водонепроницаемый датчик температуры DS18B20

Вы можете воспользоваться нашими руководствами, чтобы узнать, как использовать датчик температуры DS18B20 с ESP32, ESP8266 и Arduino, используя Arduino IDE или MicroPython:

BME280 vs BMP180

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.

Вы можете использовать наши руководства, чтобы узнать, как работать с этими датчиками:

Также у нас есть другие проекты с BME280, которые могут вам понравиться:

Тестирование всех датчиков температуры

В этом эксперименте мы регистрировали показания температуры от разных датчиков в течение определённого времени в одинаковых условиях.

Тестирование всех датчиков температуры DHT11 DHT22 LM35 DS18B20 BME280 BMP180 с Arduino

Мы подключили все следующие датчики температуры к Arduino Mega:

Данные записывались на карту microSD с помощью модуля microSD-карты. Эксперимент длился примерно 36 часов, и показания температуры записывались каждые 5 минут.

Мы подключили выводы данных датчиков температуры к следующим пинам Arduino Mega:

  • DHT11: Pin 11

  • DHT22: Pin 12

  • DS18B20: Pin 14

  • LM35: Pin A0

  • BME280: программный SPI на пинах: Pin 4 (MISO), Pin 5 (CS), Pin 6 (SCK), Pin 7 (MOSI)

  • BMP180: Pin 20 (SDA) и Pin 21 (SCL)

Модуль microSD-карты был подключён через аппаратный SPI: Pin 51 (MOSI), Pin 50 (MISO), Pin 52 (SCK), Pin 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);
}

Посмотреть исходный код

Примечание: для компиляции и запуска этого кода вы должны установить в Arduino IDE все библиотеки датчиков, упомянутые в сравнительной таблице в начале этой статьи.

Результаты: сравнение показаний температуры

Примерно через 36 часов мы извлекли карту microSD и скопировали результаты в электронную таблицу. Мы построили графики всех показаний, чтобы лучше сравнить измерения от различных датчиков температуры.

Результаты в градусах Цельсия — датчики температуры DHT11 DHT22 LM35 DS18B20 BME280 BMP180 с Arduino

Температура в градусах Цельсия (°C)

Результаты в градусах Фаренгейта — датчики температуры DHT11 DHT22 LM35 DS18B20 BME280 BMP180 с Arduino

Температура в градусах Фаренгейта (°F)

На этом графике нет контрольной группы (мы не использовали калиброванный датчик температуры), но мы получили представление о том, как ведут себя эти датчики.

Если вы внимательно посмотрите на графики, 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 и другими платами разработки. Все эти датчики измеряют температуру, но они ведут себя по-разному, когда их тестируют в одной и той же среде в одно и то же время.

Мы надеемся, что эта статья была для вас полезной и поможет вам выбрать лучший датчик температуры для требований вашего проекта.

Вам также может быть интересно почитать:

Если есть какой-либо другой датчик, который вы хотели бы увидеть в этом сравнении, оставьте комментарий ниже.

Спасибо за чтение.