有各種各樣的溫度傳感器與Arduino的,ESP32,ESP8266和其他開發板兼容。因此,可能很難為您的項目選擇最合適的傳感器。在本文中,我們將比較6種廣泛使用的溫度傳感器:DHT11, DHT22,LM35,DS18B20,BME280和BMP180。
在通訊協議,溫度範圍,精度,易用性等方面,我們將對傳感器進行比較。
我們還運行了一個簡單的實驗,其中我們隨時間間隔使用所有溫度傳感器測量了同一環境中的溫度。通過該實驗,我們可以看到傳感器如何對溫度變化做出反應。我們已經進行了大約36個小時的實驗,然後在此處後面將向您展示的結果。
推薦讀物: 9個適用於您的電子項目的Arduino兼容溫度傳感器
比較溫度傳感器:DHT11,DHT22,LM35,DS18B20,BME280和BMP180
為了快速比較傳感器,我們匯總了更好,該表列出了選擇溫度傳感器時最重要的信息:通信協議,電源電壓,溫度範圍和精度。
注意:表格在台式機,平板電腦和移動設備上均水平滾動。
傳感器 | DHT11 | DHT22(AM2302) | LM35 | DS18B20 | BME280 | BMP180 |
措施 | 溫 濕度 | 溫 濕度 | 溫度 | 溫度 | 溫 濕度 壓力 | 溫度 壓力 |
通訊 協議 | 單線 | 單線 | 模擬量 | 單線 | I2C SPI | I2C |
電源 電壓 | 3至5.5V DC | 3至6V DC | 4至30 V直流 | 3至5.5V DC | 1.7至3.6V(用於芯片)板至3.3至5V | 1.8至3.6V(用於芯片)3.3至5V用於板 |
溫度 範圍 | 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庫 Adafruit統一傳感器庫 | Adafruit DHT庫 Adafruit統一傳感器庫 | AnalogRead() | 達拉斯溫度OneWire | Adafruit BME280庫 Adafruit統一傳感器庫 | Adafruit BME085 Adafruit統一傳感器庫 |
支持 (MicroPython) | dht模塊(包含在MicroPython固件中) | dht模塊(包含在MicroPython固件中) | 從機器引入ADC ADC()。閱讀 | DS18B20模塊(包括在MicroPython固件) | BME280 Adafruit庫 | BMP180模塊 |
去哪買? | 查看價格 | 查看價格 | 查看價格 | 查看價格 查看價格(防水) | 查看價格 | 查看價格 |
DHT11和DHT22(AM2302)
的DHT11和DHT22(AM2302)是數字溫度傳感器這一措施的溫度和濕度。它們看起來非常相似,並且工作方式相同,但是規格不同。
兩個傳感器均可採用3.3V或5V供電,因此,您可以輕鬆地在Arduino的或ESP項目中使用它們。
DHT22傳感器具有更好的分辨率以及更寬的溫度和濕度測量範圍。但是,它有點貴,您只能以2秒的間隔請求讀數。
DHT11稍微便宜一點,範圍更小,精確也可以。但是您可以每秒獲取傳感器讀數。
儘管它們本身有所不同,但它們的工作方式相似,您可以使用相同的代碼讀取溫度和濕度。您只需要在代碼中選擇要使用的傳感器類型。
因此,如果您願意多花一美元,我們建議使用DHT22而不是DHT11。
我們有一些有關如何使用DHT11和DHT22傳感器的指南:
- 具有DHT11 / DHT22溫濕度傳感器的ESP32(Arduino IDE)
- ESP8266(Arduino IDE) DHT11 / DHT22溫濕度Web服務器
- 帶有DHT11 / DHT22濕度和溫度傳感器的Arduino
- 具有DHT11 / DHT22 Web服務器的ESP32 / ESP8266(MicroPython)
LM35,LM335和LM34
的LM35,LM335和LM34是線性溫度傳感器,其輸出與溫度成比例的值的電壓。LM35的校準單位為攝氏度,LM335的單位為開爾文,而LM34的單位為華氏度。因此,根據您將在項目中使用的溫度單位,這些傳感器中的一個可能比另一個更實用。
我們建議使用LM35或LM34而不是LM335,因為從開爾文中稱為大量的LM335測量值以轉換溫度會損害結果的準確性。
根據數據表,LM35和LM34傳感器只需要很少的電流即可工作,大約60uA。這會導致極低的自發熱(在靜止空氣中大約0.08ºC),這意味著溫度測量將沒有傳感器本身的影響。
要從這些傳感器讀取溫度,您只需要使用模擬串行讀取傳感器的輸出電壓即可。如果使用Arduino,則只需要使用AnalogRead()功能,您將獲得兩個兩個小數點的溫度讀數。
因此,如果您需要便宜且易於使用的傳感器來監控溫度,則LM35是一個不錯的選擇。另外,由於它只消耗了很少的能量,因此非常適合要求低功耗的便攜式項目。
了解如何在Arduino上使用LM35,LM335和LM34溫度傳感器:
DS18B20溫度傳感器
所述DS18B20溫度傳感器 是一導線 數字溫度傳感器。這意味著只需要一條數據線(和GND)即可與您的微控制器通信。
它可以由外部電源供電,也可以從數據線供電(稱為“寄生模式”),從而無需外部電源。
每個DS18B20溫度傳感器都有一個唯一的64位串行代碼。這使您可以將多個傳感器連接到同一條數據線上。因此,您可以使用單個GPIO從多個傳感器獲取溫度。
此外,溫度傳感器的分辨率可以設置為9、10、11或12位,分別對應於0.5°C,0.25°C,0.125°C和0.0625°C的增量。上電時的默認分辨率為12位。
DS18B20溫度傳感器還提供防水版本,非常適合戶外項目或測量液體溫度。
您可以按照我們的指南學習如何使用Arduino IDE或MicroPython將DS18B20溫度傳感器與ESP32,ESP8266和Arduino結合使用:
- ESP32(Arduino IDE) DS18B20溫度傳感器(單個,多個,Web服務器)
- ESP8266(Arduino IDE) DS18B20溫度傳感器(單個,多個,Web服務器)
- 帶有DS18B20溫度傳感器的ESP32和ESP8266(MicroPython)
- 帶有DS18B20溫度傳感器的Arduino
BME280和BMP180
的BME280和BMP180是氣壓傳感器,這意味著它們讀大氣壓。BME280還配備了溫度和濕度傳感器,而BMP180還配備了溫度傳感器。由於壓力隨高度變化,因此這些傳感器也可以用於估計高度。
關於溫度範圍,BME280的測量範圍更廣:-40至85ºC,而BMP180的測量範圍僅為0至65ºC。您應該記住,BME280模塊會自發熱一點,因此溫度測量值可能比實際溫度值高1 ou 2度。
BME280可以使用I2C或SPI通信協議,而BMP180僅可以使用I2C通信。
BME280傳感器價格更高,但功能更多。例如,您可以僅使用此傳感器來構建氣象站項目。但是,如果您對測量壓力或濕度不感興趣,可以購買便宜的溫度傳感器。
得益於Adafruit庫,這些傳感器與Arduino,ESP8266和ESP32的接口非常容易。
您可以使用我們的指南來學習如何使用這些傳感器:
- BMP180:
- BME280:
您可能還會喜歡BME280的其他項目:
- 使用ESP8266和BME280和MicroPython的低功耗氣象站數據記錄器
- 帶有BME280的ESP32 Web服務器–迷你氣象站
- ESP32 / ESP8266使用PHP和Arduino IDE將數據插入MySQL數據庫
測試所有溫度傳感器
該實驗記錄了在相同條件下隨時間變化從不同溫度傳感器獲得的溫度讀數。
我們將以下所有溫度傳感器連接到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卡,並將結果復製到了電子表格中。我們已繪製了所有讀數的圖表,以更好地比較不同溫度傳感器的測量結果。
該圖表沒有對照組(我們未使用經過校準的溫度傳感器),但是我們對這些傳感器的工作方式有一個了解。
如果您仔細查看圖表,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/