2021年5月26日 星期三

DHT11,DHT22,LM35,DS18B20,BME280和BMP180

有各種各樣的溫度傳感器與Arduino的,ESP32,ESP8266和其他開發板兼容。因此,可能很難為您的項目選擇最合適的傳感器在本文中,我們將比較6種廣泛使用的溫度傳感器:DHT11, DHT22,LM35,DS18B20,BME280和BMP180。

DHT11,DHT22,LM35,DS18B20,BME280,BMP180溫度傳感器

在通訊協議,溫度範圍,精度,易用性等方面,我們將對傳感器進行比較。

我們還運行了一個簡單的實驗,其中我們隨時間間隔使用所有溫度傳感器測量了同一環境中的溫度。通過該實驗,我們可以看到傳感器如何對溫度變化做出反應。我們已經進行了大約36個小時的實驗,然後在此處後面將向您展示的結果。

推薦讀物: 9個適用於您的電子項目的Arduino兼容溫度傳感器

比較溫度傳感器:DHT11,DHT22,LM35,DS18B20,BME280和BMP180

為了快速比較傳感器,我們匯總了更好,該表列出了選擇溫度傳感器時最重要的信息:通信協議,電源電壓,溫度範圍和精度。

注意:表格在台式機,平板電腦和移動設備上均水平滾動。

傳感器DHT11DHT22(AM2302)LM35DS18B20BME280BMP180
措施
濕度

濕度
溫度溫度
濕度
壓力
溫度
壓力
通訊
協議
單線單線模擬量單線I2C
SPI
I2C
電源
電壓
3至5.5V DC3至6V DC4至30 V直流3至5.5V DC1.7至3.6V(用於芯片)板至3.3至5V1.8至3.6V(用於芯片)3.3至5V用於板
溫度
範圍
0至50ºC-40至80ºC-55至150ºC-55至125ºC-40至85ºC0至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庫

Adafruit統一傳感器庫
Adafruit DHT庫

Adafruit統一傳感器庫
AnalogRead()達拉斯溫度OneWireAdafruit BME280庫

Adafruit統一傳感器庫
Adafruit BME085

Adafruit統一傳感器庫
支持
(MicroPython)
dht模塊(包含在MicroPython固件中)dht模塊(包含在MicroPython固件中)從機器引入ADC
ADC()。閱讀
DS18B20模塊(包括在MicroPython固件)BME280 Adafruit庫BMP180模塊
去哪買?查看價格查看價格查看價格查看價格
查看價格(防水)
查看價格查看價格

DHT11和DHT22(AM2302)

DHT11與DHT22溫濕度傳感器

DHT11DHT22(AM2302)是數字溫度傳感器這一措施的溫度和濕度。它們看起來非常相似,並且工作方式相同,但是規格不同。

兩個傳感器均可採用3.3V或5V供電,因此,您可以輕鬆地在Arduino的或ESP項目中使用它們。

DHT22傳感器具有更好的分辨率以及更寬的溫度和濕度測量範圍。但是,它有點貴,您只能以2秒的間隔請求讀數。

DHT11稍微便宜一點,範圍更小,精確也可以。但是您可以每秒獲取傳感器讀數。

儘管它們本身有所不同,但它們的工作方式相似,您可以使用相同的代碼讀取溫度和濕度。您只需要在代碼中選擇要使用的傳感器類型。

因此,如果您願意多花一美元,我們建議使用DHT22而不是DHT11。

我們有一些有關如何使用DHT11和DHT22傳感器的指南:

LM35,LM335和LM34

LM35 LM335和LM34模擬溫度傳感器

LM35LM335LM34是線性溫度傳感器,其輸出與溫度成比例的值的電壓LM35的校準單位為攝氏度,LM335的單位為開爾文,而LM34的單位為華氏度。因此,根據您將在項目中使用的溫度單位,這些傳感器中的一個可能比另一個更實用。

我們建議使用LM35LM34而不是LM335,因為從開爾文中稱為大量的LM335測量值以轉換溫度會損害結果的準確性。

根據數據表,LM35和LM34傳感器只需要很少的電流即可工作,大約60uA。這會導致極低的自發熱(在靜止空氣中大約0.08ºC),這意味著溫度測量將沒有傳感器本身的影響。

要從這些傳感器讀取溫度,您只需要使用模擬串行讀取傳感器的輸出電壓即可。如果使用Arduino,則只需要使用AnalogRead()功能,您將獲得兩個兩個小數點的溫度讀數。

因此,如果您需要便宜且易於使用的傳感器來監控溫度,則LM35是一個不錯的選擇。另外,由於它只消耗了很少的能量,因此非常適合要求低功耗的便攜式項目。

了解如何在Arduino上使用LM35,LM335和LM34溫度傳感器:

DS18B20溫度傳感器

DS18B20溫度傳感器

所述DS18B20溫度傳感器 是一導線 數字溫度傳感器。這意味著只需要一條數據線(和GND)即可與您的微控制器通信。

它可以由外部電源供電,也可以從數據線供電(稱為“寄生模式”),從而無需外部電源。

每個DS18B20溫度傳感器都有一個唯一的64位串行代碼。這使您可以將多個傳感器連接到同一條數據線上。因此,您可以使用單個GPIO從多個傳感器獲取溫度。

此外,溫度傳感器的分辨率可以設置為9、10、11或12位,分別對應於0.5°C,0.25°C,0.125°C和0.0625°C的增量。上電時的默認分辨率為12位。

DS18B20溫度傳感器還提供防水版本,非常適合戶外項目或測量液體溫度。

DS18B20防水溫度傳感器

您可以按照我們的指南學習如何使用Arduino IDE或MicroPython將DS18B20溫度傳感器與ESP32,ESP8266和Arduino結合使用:

BME280和BMP180

BME280與BMP180氣壓傳感器:溫度,濕度和壓力

BME280BMP180是氣壓傳感器,這意味著它們讀大氣壓。BME280還配備了溫度和濕度傳感器,而BMP180還配備了溫度傳感器。由於壓力隨高度變化,因此這些傳感器也可以用於估計高度。

關於溫度範圍,BME280的測量範圍更廣:-40至85ºC,而BMP180的測量範圍僅為0至65ºC。您應該記住,BME280模塊會自發熱一點,因此溫度測量值可能比實際溫度值高1 ou 2度。

BME280可以使用I2C或SPI通信協議,而BMP180僅可以使用I2C通信。

BME280傳感器價格更高,但功能更多。例如,您可以僅使用此傳感器來構建氣象站項目。但是,如果您對測量壓力或濕度不感興趣,可以購買便宜的溫度傳感器。

得益於Adafruit庫,這些傳感器與Arduino,ESP8266和ESP32的接口非常容易。

您可以使用我們的指南來學習如何使用這些傳感器:

您可能還會喜歡BME280的其他項目:

測試所有溫度傳感器

該實驗記錄了在相同條件下隨時間變化從不同溫度傳感器獲得的溫度讀數。

使用Arduino測試所有溫度傳感器DHT11 DHT22 LM35 DS18B20 BME280 BMP180

我們將以下所有溫度傳感器連接到Arduino Mega

使用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中運行的代碼。



#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> 

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");
    
    myFile.println("DHT11,DHT22,DS18B20-1,DS18B20-2,BME280,BMP180,LM35");
  }
  myFile.close();  
}

void loop() {

  
  
  DHT11temperature = dht11.readTemperature();
  if (isnan(DHT11temperature)) {
    Serial.println("Failed to read from DHT11 sensor!");
    return;
  }
  Serial.print("Temperature DHT11(ºC): ");
  Serial.println(DHT11temperature);
  
  
  
  DHT22temperature = dht22.readTemperature();
  if (isnan(DHT22temperature)) {
    Serial.println("Failed to read from DHT22 sensor!");
    return;
  }
  Serial.print("Temperature DHT22(ºC): ");
  Serial.println(DHT22temperature);

  
  
  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);




  Serial.print("Temperature BME280(ºC): ");
  Serial.println(bme280.readTemperature());



  Serial.print("Temperature BMP180(ºC): ");
  Serial.println(bmp180.readTemperature());

 
  
  LM35sensorValue = analogRead(LM35sensorPin);
  LM35voltageOut = (LM35sensorValue * 5000) / 1024;
  
  
  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的結果
溫度(攝氏度)
華氏度溫度傳感器DHT11 DHT22 LM35 DS18B20 BME280 BMP180的結果與Arduino
溫度以華氏度(ºF)為單位

該圖表沒有對照組(我們未使用經過校準的溫度傳感器),但是我們對這些傳感器的工作方式有一個了解。

如果您仔細查看圖表,BME280測得的值要比其他溫度傳感器稍高。此行為是正常現象,這在數據表中有所描述。模塊會自發熱一點,溫度測量值可能比實際溫度值高1 ou 2度。

但是,BME280還是溫度傳感器,可提供更穩定的溫度讀數,而讀數之間不會出現很多振盪。這與傳感器的分辨率有關。它可以檢測高達0.01ºC的變化。

對於DS18B20溫度傳感器,我們可以看到讀數之間有些振盪,並且還值得注意的是分辨率不如BME280。此外,DS18B20溫度傳感器是在整個實驗過程中唯一提供“零”讀數的傳感器。我們已經在同一條數據線上測量了兩個DS18B20溫度傳感器,並且在整個實驗過程中(36小時內),其中一個傳感器未能讀取6次溫度。

DHT22和BMP180的行為非常相似,幾乎沒有振盪。DHT11的分辨率為1ºC,因此無法檢測到較小的溫度變化。

最終,LM35溫度傳感器檢測到24ºC至26ºC之間的溫度變化,但兩次測量之間存在很多振盪。

這張圖表比較了不同的溫度傳感器,清楚地顯示了每個傳感器之間的差異。更容易理解它們的工作方式以及它們是否適合您要構建的項目。

包起來

在本文中,我們比較了幾種可與ESP32,ESP8266,Arduino和其他開發板一起使用的溫度傳感器。這些傳感器均測量溫度,但同時在同一環境中進行測試時,它們的行為會有所不同。

我們希望您發現本文有用,並且可以幫助您根據項目要求選擇最佳的溫度傳感器。

您可能還喜歡閱讀:

如果您想在此比較中看到其他傳感器,請在下面發 


資料來源: https://randomnerdtutorials.com/dht11-vs-dht22-vs-lm35-vs-ds18b20-vs-bme280-vs-bmp180/