Istnieje szeroka gama czujników temperatury kompatybilnych z Arduino, ESP32, ESP8266 i innymi płytkami rozwojowymi. Tak więc, może być trudno wybrać najbardziej odpowiedni czujnik dla swojego projektu. W tym artykule porównamy 6 powszechnie używanych czujników temperatury: DHT11, DHT22, LM35, DS18B20, BME280 i BMP180.
Porównamy czujniki pod względem protokołu komunikacyjnego, zakresu temperatur, dokładności, łatwości obsługi i wielu innych.
Przeprowadzimy również prosty eksperyment, w którym zmierzymy temperaturę w tym samym środowisku przy użyciu wszystkich czujników temperatury w czasie. Dzięki temu eksperymentowi mogliśmy zobaczyć jak czujniki reagują na zmiany temperatury. Przeprowadzaliśmy ten eksperyment przez około 36 godzin, a wyniki pokażemy w dalszej części artykułu.
Zalecana lektura: 9 Arduino Compatible Temperature Sensors for Your Electronics Projects
Comparing Temperature Sensors: DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180
Dla szybkiego porównania czujników, zebraliśmy poniższą tabelę, która pokazuje najważniejsze informacje, jeśli chodzi o wybór czujnika temperatury, a mianowicie: protokół komunikacyjny, napięcie zasilania, zakres temperatur i dokładność.
Uwaga: tabela przewija się poziomo zarówno na komputerze stacjonarnym, tablecie, jak i telefonie komórkowym.
Czujnik | DHT11 | DHT22 (AM2302) | LM35 | DS18B20 | BME280 | BMP180 | |
Pomiary | Temperatura Wilgotność |
Temperatura Wilgotność |
Temperatura | Temperatura | Temperatura | Temperatura Wilgotność Ciśnienie |
Temperatura Ciśnienie |
Komunikacja protokół |
Jednorazowywire | One-wire | Analog | One-wire | I2C SPI |
I2C | |
Zasilanie napięcie |
3 do 5.5V DC | 3 do 6V DC | 4 do 30 V DC | 3 do 5.5V DC | 1.7 do 3.6V (dla układu) 3.3 do 5V dla płyty | 1.8 do 3.6V (dla układu) 3.3 do 5V dla płyty | |
Temperatura zakres |
0 do 50ºC | -40 do 80ºC | -55 do 150ºC | -.55 do 125ºC | -40 do 85ºC | 0 do 65ºC | |
Dokładność | +/- 2ºC (przy 0 do 50ºC) | +/- 0.5ºC (w temperaturze od -40 do 80ºC) | +/-0,5ºC (w temperaturze 25ºC) | +/-0,5ºC (w temperaturze od -10 do 85ºC) | +/-0,5ºC (w temperaturze 25ºC) | +/-0.5ºC (przy 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) |
moduł dht (zawarty w firmware MicroPython) | moduł dht (zawarty w firmware MicroPython) | from machine import ADC ADC().read |
moduł ds18b20 (zawarty w firmware MicroPython) | BME280 Adafruit Library | Moduł BMP180 | |
Gdzie kupić? | Ceny sprawdzone | Ceny sprawdzone | Ceny sprawdzone | Ceny sprawdzone Ceny sprawdzone (wodoodporne) |
Ceny sprawdzone | Ceny sprawdzone |
DHT11 vs DHT22 (AM2302)
DHT11 i DHT22 (AM2302) to cyfrowe czujniki temperatury, które mierzą temperaturę i wilgotność. Wyglądają bardzo podobnie i działają w ten sam sposób, ale mają różne specyfikacje.
Oba czujniki mogą być zasilane zarówno napięciem 3.3V jak i 5V. Możesz więc łatwo użyć ich w swoich projektach Arduino lub ESP.
Czujnik DHT22 ma lepszą rozdzielczość i szerszy zakres pomiaru temperatury i wilgotności. Jest jednak nieco droższy i można zażądać odczytów tylko co 2 sekundy.
Czujnik DHT11 jest nieco tańszy, ma mniejszy zakres i jest mniej dokładny. Ale można uzyskać odczyty czujnika co sekundę.
Mimo różnic, działają one w podobny sposób i można użyć tego samego kodu do odczytu temperatury i wilgotności. Musisz tylko wybrać w kodzie typ czujnika, którego używasz.
Więc, jeśli jesteś skłonny wydać dodatkowego dolara, polecamy DHT22 zamiast DHT11.
Posiadamy kilka przewodników na temat używania czujników DHT11 i DHT22:
- ESP32 (Arduino IDE) z czujnikiem temperatury i wilgotności DHT11/DHT22
- ESP8266 (Arduino IDE) DHT11/DHT22 Temperature and Humidity Web Server
- ESP8266 (Arduino IDE) DHT11/DHT22 Temperature and Humidity Web Serwer
- Arduino z DHT11/DHT22 Czujnik wilgotności i temperatury
- ESP32/ESP8266 (MicroPython) z DHT11/DHT22 Serwer WWW
LM35, LM35, LM335 i LM34
LM35, LM335 i LM34 to liniowe czujniki temperatury, które generują napięcie proporcjonalne do wartości temperatury. LM35 jest kalibrowany w stopniach Celsjusza, LM335 w Kelwinach, a LM34 w Fahrenheitach. Tak więc, w zależności od jednostek temperatury, których będziesz używał w swoim projekcie, jeden z tych czujników może być bardziej praktyczny niż drugi.
Zalecamy użycie LM35 lub LM34 zamiast LM335, ponieważ odjęcie dużej liczby do pomiarów LM335 w celu przeliczenia temperatury z Kelvina może pogorszyć dokładność wyników.
Zgodnie z arkuszem danych, czujniki LM35 i LM34 wymagają bardzo małego prądu do działania, około 60uA. Powoduje to bardzo małe samonagrzewanie (około 0,08ºC w nieruchomym powietrzu), co oznacza, że pomiar temperatury nie będzie zakłócany przez sam czujnik.
Aby odczytać temperaturę z tych czujników wystarczy odczytać napięcie wyjściowe czujnika za pomocą pinu analogowego. Jeśli używasz Arduino, wystarczy użyć funkcji analogRead() i otrzymasz odczyt temperatury z dwoma miejscami po przecinku.
Tak więc, jeśli potrzebujesz taniego i łatwego w użyciu czujnika do monitorowania temperatury, LM35 może być dobrym rozwiązaniem. Również dlatego, że zużywa bardzo mało energii, jest świetny do przenośnych projektów, gdzie wymagany jest niski pobór mocy.
Dowiedz się, jak używać czujników temperatury LM35, LM335 i LM34 z Arduino:
- Przewodnik po czujnikach temperatury LM35, LM335 i LM34 z Arduino
DS18B20 Temperature Sensor
Czujnik temperatury DS18B20 jest jednoprzewodowym cyfrowym czujnikiem temperatury. Oznacza to, że wymaga tylko jednej linii danych (i GND) do komunikacji z mikrokontrolerami.
Może być zasilany z zewnętrznego zasilacza lub może pobierać zasilanie z linii danych (tzw. tryb pasożytniczy), co eliminuje potrzebę stosowania zewnętrznego zasilacza.
Każdy czujnik temperatury DS18B20 ma unikalny 64-bitowy kod szeregowy. Pozwala to na podłączenie wielu czujników do tego samego przewodu danych. Możesz więc uzyskać temperaturę z wielu czujników za pomocą jednego GPIO.
Dodatkowo rozdzielczość czujnika temperatury może być ustawiona na 9, 10, 11 lub 12 bitów, co odpowiada przyrostom odpowiednio 0,5°C, 0,25°C, 0,125°C i 0,0625°C. Domyślną rozdzielczością podczas włączania zasilania jest 12 bitów.
Czujnik temperatury DS18B20 jest również dostępny w wersji wodoodpornej, idealnej do projektów zewnętrznych lub do pomiaru temperatury cieczy.
Możesz postępować zgodnie z naszymi przewodnikami, aby dowiedzieć się, jak używać czujnika temperatury DS18B20 z ESP32, ESP8266 i Arduino przy użyciu Arduino IDE lub MicroPython:
- ESP32 (Arduino IDE) DS18B20 Temperature Sensor (Single, Multiple, Web Server)
- ESP8266 (Arduino IDE) DS18B20 Temperature Sensor (Single, Multiple, Web Server)
- ESP32 i ESP8266 (MicroPython) z czujnikiem temperatury DS18B20
- Arduino z czujnikiem temperatury DS18B20
BME280 vs BMP180
Czujniki BME280 i BMP180 są czujnikami barometrycznymi, co oznacza, że odczytują ciśnienie atmosferyczne. BME280 wyposażony jest również w czujnik temperatury i wilgotności, a BMP180 w czujnik temperatury. Ponieważ ciśnienie zmienia się wraz z wysokością, czujniki te mogą być również używane do szacowania wysokości.
Jeśli chodzi o zakres temperatur, BME280 ma szerszy zakres pomiarowy: -40 do 85ºC, podczas gdy BMP180 mierzy tylko od 0 do 65ºC. Należy pamiętać, że moduł BME280 trochę się nagrzewa, więc pomiar temperatury może być o 1 lub 2 stopnie wyższy od rzeczywistej wartości temperatury.
Czujnik BME280 może korzystać z protokołu komunikacyjnego I2C lub SPI, podczas gdy BMP180 może korzystać tylko z komunikacji I2C.
Czujnik BME280 jest droższy, ale ma więcej funkcji. Na przykład, można zbudować projekt stacji pogodowej tylko z tym czujnikiem. Jeśli jednak nie interesuje Cię pomiar ciśnienia czy wilgotności, możesz kupić tańszy czujnik temperatury.
Interfejsowanie tych czujników z Arduino, ESP8266 i ESP32 jest bardzo proste dzięki bibliotekom Adafruit.
Możesz skorzystać z naszych przewodników, aby dowiedzieć się, jak używać tych czujników:
- BMP180:
- Arduino z czujnikiem barometrycznym BMP180
- ESP32 (Arduino IDE) z czujnikiem barometrycznym BMP180
- BME280:
- ESP32 (Arduino IDE) z Czujnikiem BME280 (Ciśnienie, Temperatura, Wilgotność)
- ESP8266 (Arduino IDE) z Czujnikiem BME280 (Ciśnienie, Temperatura, Wilgotność)
- Arduino z Czujnikiem BME280(Ciśnienie, Temperatura, Wilgotność)
Posiadamy również inne projekty z BME280, które mogą Ci się spodobać:
- Low Power Weather Station Datalogger using ESP8266 and BME280 with MicroPython
- ESP32 Web Server with BME280 – Mini Weather Station
- ESP32/ESP8266 Insert Data into MySQL Database using PHP and Arduino IDE
Testowanie wszystkich czujników temperatury
Ten eksperyment rejestrował odczyty temperatury z różnych czujników temperatury w czasie w tych samych warunkach.
Podłączyliśmy wszystkie poniższe czujniki temperatury do Arduino Mega:
- DHT11
- DHT22
- LM35
- 2x DS18B20 w tej samej szynie danych
- BME280
- BMP180
Dane zostały zapisane na karcie microSD za pomocą modułu kart microSD. Eksperyment trwał około 36 godzin, a odczyty temperatury były rejestrowane co 5 minut.
Piny danych czujników temperatury podłączyliśmy do następujących pinów w Arduino Mega:
- DHT11: Pin 11
- DHT22: Pin 12
- DS18B20: Pin 14
- LM35: Pin A0
- BME280: programowe SPI na tych pinach: Pin 4 (MISO), Pin 5 (CS), Pin 6 (SCK), Pin 7 (MOSI)
- BMP180: Pin 20 (SDA) i Pin 21 (CSL)
Moduł karty microSD został podłączony poprzez sprzętowe SPI: Pin 51 (MOSI), Pin 50 (MISO), Pin 52 (SCK), Pin 53 (CS).
Tak wygląda kod uruchomiony w 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);}
View raw code
Uwaga: aby skompilować i uruchomić ten kod, musisz zainstalować w swoim Arduino IDE wszystkie biblioteki czujników wymienione w tabeli porównawczej na początku tego artykułu.
Wyniki: Porównanie odczytów temperatury
Po około 36 godzinach wyjęliśmy kartę microSD i skopiowaliśmy wyniki do arkusza kalkulacyjnego. Wykreśliliśmy wszystkie odczyty, aby lepiej porównać pomiary z różnych czujników temperatury.
Ten wykres nie ma grupy kontrolnej (nie używaliśmy skalibrowanego czujnika temperatury), ale mamy pojęcie o tym, jak zachowują się te czujniki.
Jeśli przyjrzysz się bliżej wykresom, BME280 mierzy nieco wyższe wartości niż inne czujniki temperatury. Takie zachowanie jest normalne i jest to opisane w datasheecie. Moduł sam się trochę nagrzewa i pomiary temperatury mogą być o 1 lub 2 stopnie wyższe od rzeczywistej wartości temperatury.
Jednakże BME280 jest również czujnikiem temperatury, który dawał bardziej stabilne odczyty temperatury, bez wielu oscylacji pomiędzy odczytami. Ma to związek z rozdzielczością czujnika. Potrafi on wykryć zmiany do 0,01ºC.
W przypadku czujników temperatury DS18B20 możemy zauważyć pewne oscylacje pomiędzy odczytami, a także można zauważyć, że rozdzielczość nie jest tak dobra jak w przypadku BME280. Dodatkowo, czujnik temperatury DS18B20 jako jedyny dawał kilka „zerowych” odczytów podczas całego eksperymentu. Zmierzyliśmy dwa czujniki temperatury DS18B20 w tej samej linii danych i jeden z czujników nie odczytał temperatury 6 razy w ciągu całego eksperymentu (w ciągu 36 godzin).
DHT22 i BMP180 zachowują się bardzo podobnie z niewielkimi oscylacjami. DHT11 nie mógł wykryć małych zmian temperatury, ponieważ jego rozdzielczość wynosi 1ºC.
Na koniec, czujnik temperatury LM35 wykrył zmiany temperatury pomiędzy 24ºC a 26ºC, ale z dużą ilością oscylacji pomiędzy pomiarami.
Ten wykres porównujący różne czujniki temperatury jasno pokazuje, jak każdy czujnik różni się od innych. Łatwiej jest zrozumieć, jak działają i czy będą odpowiednie dla projektów, które chcesz zbudować.
Wrapping Up
W tym artykule porównaliśmy kilka czujników temperatury, których możesz użyć z ESP32, ESP8266, Arduino i innymi płytkami rozwojowymi. Wszystkie te czujniki mierzą temperaturę, ale zachowują się inaczej, gdy są testowane w tym samym środowisku i w tym samym czasie.
Mamy nadzieję, że znalazłeś ten artykuł przydatny i że pomoże Ci on wybrać najlepszy czujnik temperatury dla Twoich wymagań projektowych.
Możesz również polubić czytanie:
- 9 kompatybilnych z Arduino czujników temperatury dla Twoich projektów elektronicznych
- ESP32/ESP8266 Plot Sensor Readings in Real Time Charts
- Zapisz się na nasze kursy elektroniki i eBook
.