Ini adalah panduan mendalam untuk sensor suhu DS18B20 dengan ESP32 menggunakan Arduino IDE. Kami akan menunjukkan cara menghubungkan sensor, menginstal library yang diperlukan, dan menulis kode untuk mendapatkan pembacaan sensor dari satu dan beberapa sensor. Akhirnya, kami akan membangun sebuah server web sederhana untuk menampilkan pembacaan sensor.
Pengenalan Sensor Suhu DS18B20
Sensor suhu DS18B20 adalah sensor suhu digital satu kabel. Ini berarti hanya memerlukan satu jalur data (dan GND) untuk berkomunikasi dengan ESP32 Anda.
Sensor ini dapat diberi daya oleh sumber daya eksternal atau dapat memperoleh daya dari jalur data (disebut "mode parasit"), yang menghilangkan kebutuhan untuk sumber daya eksternal.
Setiap sensor suhu DS18B20 memiliki kode serial unik berukuran 64-bit. Hal ini memungkinkan Anda untuk menghubungkan beberapa sensor ke kabel data yang sama. Dengan demikian, Anda dapat mendapatkan data suhu dari beberapa sensor hanya menggunakan satu pin GPIO.
Selain itu, sensor suhu DS18B20 juga tersedia dalam versi tahan air (waterproof).
Berikut adalah ringkasan dari spesifikasi paling relevan dari sensor suhu DS18B20:
- Berkomunikasi melalui bus komunikasi satu kabel (one-wire bus).
- Rentang sumber daya: 3,0V hingga 5,5V.
- Rentang suhu operasi: -55ºC hingga +125ºC.
- Akurasi +/-0,5 ºC (antara rentang -10ºC hingga 85ºC).
Untuk informasi lebih lanjut, silakan lihat lembar data (datasheet) dari sensor DS18B20.
Bagian-bagian yang diperlukan
Untuk mengikuti panduan ini, Anda memerlukan bagian-bagian berikut:
1. ESP32 (baca: Papan pengembangan ESP32 terbaik)
2. Sensor suhu DS18B20 (satu atau beberapa sensor) - versi tahan air (waterproof)
4. Kabel jumper
5. Breadboard (papan percobaan)
Anda dapat menggunakan tautan sebelumnya atau langsung mengunjungi tokopedia.com/cncstorebandung untuk menemukan semua bagian yang Anda butuhkan untuk proyek Anda dengan harga terbaik!
Skema (Schematic) - ESP32
Seperti yang disebutkan sebelumnya, sensor suhu DS18B20 dapat diberi daya melalui pin VDD (mode normal), atau dapat memperoleh daya dari jalur data (mode parasit). Anda dapat memilih salah satu dari kedua mode tersebut.
Jika Anda menggunakan ESP32, ikuti salah satu dari dua diagram skema berikut.
Mode Parasit
Mode Normal
Kami akan memprogram ESP32 menggunakan Arduino IDE, pastikan Anda telah menginstal add-on ESP32 sebelum melanjutkan:
Instal Board ESP32 di Arduino IDE (ikuti instruksi untuk Windows, Mac OS X, dan Linux)
Instalasi (Libraries)
Menginstal Libraries
Untuk berinteraksi dengan sensor suhu DS18B20, Anda perlu menginstal library One Wire karya Paul Stoffregen dan library Dallas Temperature. Ikuti langkah-langkah berikut untuk menginstal kedua library tersebut.
1. Buka Arduino IDE Anda dan pergi ke Sketch > Include Library > Manage Libraries. Library Manager akan terbuka.
2. Ketikkan "onewire" pada kotak pencarian dan instal library OneWire karya Paul Stoffregen.
3. Selanjutnya, cari "Dallas" dan instal library DallasTemperature karya Miles Burton.
Setelah menginstal library, restart Arduino IDE Anda.
Kode (Single DS18B20)
Setelah menginstal library yang diperlukan, Anda dapat mengunggah kode ke ESP32. Berikut adalah contoh kode untuk membaca suhu dari sensor suhu DS18B20 dan menampilkan pembacaan tersebut di Serial Monitor Arduino IDE.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com
*********/
#include <OneWire.h>
#include <DallasTemperature.h>
// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
void setup() {
// Start the Serial Monitor
Serial.begin(115200);
// Start the DS18B20 sensor
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");
delay(5000);
}
"Terdapat banyak cara berbeda untuk mendapatkan suhu dari sensor suhu DS18B20. Namun, jika Anda hanya menggunakan satu sensor tunggal, cara ini merupakan salah satu cara yang paling mudah dan sederhana."
Bagaimana Kode Bekerja
#include <OneWire.h>
#include <DallasTemperature.h>
Mulailah dengan menyertakan library OneWire dan DallasTemperature.
Buatlah instance yang dibutuhkan untuk sensor suhu. Sensor suhu ini terhubung ke pin GPIO 4 (D4) pada ESP32.
// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
Pada fungsi setup(), inisialisasikan Serial Monitor dengan kecepatan baud rate 115200.
Serial.begin(115200);
Inisialisasikan sensor suhu DS18B20:
sensors.begin();
Sebelum benar-benar mendapatkan suhu, Anda perlu memanggil metode requestTemperatures().
sensors.requestTemperatures();
Kemudian, dapatkan suhu dalam derajat Celsius dengan menggunakan metode getTempCByIndex() seperti yang ditunjukkan di bawah ini:
float temperatureC = sensors.getTempCByIndex(0);
Atau gunakan getTempFByIndex() untuk mendapatkan suhu dalam Fahrenheit.
float temperatureF = sensors.getTempFByIndex(0);
Metode getTempCByIndex() dan getTempFByIndex() menerima indeks dari sensor suhu. Karena kita hanya menggunakan satu sensor, indeksnya adalah 0. Jika Anda ingin membaca lebih dari satu sensor, Anda dapat menggunakan indeks 0 untuk satu sensor, indeks 1 untuk sensor lainnya, dan seterusnya.
Terakhir, cetak hasilnya di Serial Monitor.
Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");
Pembacaan suhu baru diminta setiap 5 detik.
delay(5000);
Demonstrasi
Setelah mengunggah kode, Anda akan melihat pembacaan suhu dari sensor ditampilkan di Serial Monitor:
Mendapatkan Suhu dari Beberapa Sensor Suhu DS18B20
Sensor suhu DS18B20 berkomunikasi menggunakan protokol satu kabel (one-wire) dan setiap sensor memiliki kode serial unik berukuran 64-bit, sehingga Anda dapat membaca suhu dari beberapa sensor hanya menggunakan satu pin GPIO. Anda hanya perlu menghubungkan semua jalur data bersama-sama seperti yang ditunjukkan dalam diagram skema berikut:
Kode (Multiple DS18B20s)
Kemudian, unggah kode berikut. Kode ini akan memindai semua perangkat yang terhubung pada GPIO 4 dan mencetak suhu dari setiap perangkat. (Sketch ini berdasarkan contoh yang disediakan oleh library DallasTemperature).
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com
*********/
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged TO GPIO 4
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Number of temperature devices found
int numberOfDevices;
// We'll use this variable to store a found device address
DeviceAddress tempDeviceAddress;
void setup(){
// start serial port
Serial.begin(115200);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i
Demonstrasi
Pada contoh ini, kami menggunakan tiga sensor suhu DS18B20. Ini adalah hasil yang akan Anda lihat di Serial Monitor Arduino IDE:
Kami memiliki artikel khusus tentang cara menghubungkan beberapa sensor suhu DS18B20 dengan ESP32. Ikuti tutorial berikut:
"ESP32 dengan Beberapa Sensor Suhu DS18B20"
Menampilkan (Display) Pembacaan Suhu DS18B20 pada Web Server
Untuk membangun web server, kita akan menggunakan library ESPAsyncWebServer yang menyediakan cara mudah untuk membuat web server yang asinkron. Membangun web server asinkron memiliki beberapa keuntungan. Kami sarankan untuk melihat dokumentasi library tersebut di halaman GitHub-nya.
Menginstal Library ESPAsyncWebServer dan AsyncTCP
Anda perlu menginstal dua library berikut di Arduino IDE Anda untuk membangun web server untuk proyek ini.
"ESPAsyncWebServer (.zip folder)"
Library ESPAsyncWebServer, AsyncTCP, dan ESPAsyncTCP tidak tersedia untuk diinstal melalui Arduino Library Manager, jadi Anda perlu menyalin file library ke folder Libraries di instalasi Arduino. Sebagai alternatif, di Arduino IDE Anda, Anda dapat pergi ke Sketch > Include Library > Add .zip Library dan pilih library yang baru saja Anda unduh.
Kode (DS18B20 Async Web Server)
Buka Arduino IDE Anda dan salin kode berikut."
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com
*********/
// Import required libraries
#ifdef ESP32
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#else
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#endif
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is connected to GPIO 4
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// Variables to store temperature values
String temperatureF = "";
String temperatureC = "";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
String readDSTemperatureC() {
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if(tempC == -127.00) {
Serial.println("Failed to read from DS18B20 sensor");
return "--";
} else {
Serial.print("Temperature Celsius: ");
Serial.println(tempC);
}
return String(tempC);
}
String readDSTemperatureF() {
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
sensors.requestTemperatures();
float tempF = sensors.getTempFByIndex(0);
if(int(tempF) == -196){
Serial.println("Failed to read from DS18B20 sensor");
return "--";
} else {
Serial.print("Temperature Fahrenheit: ");
Serial.println(tempF);
}
return String(tempF);
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<style>
html {
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h2 { font-size: 3.0rem; }
p { font-size: 3.0rem; }
.units { font-size: 1.2rem; }
.ds-labels{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 15px;
}
</style>
</head>
<body>
<h2>ESP DS18B20 Server</h2>
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Temperature Celsius</span>
<span id="temperaturec">%TEMPERATUREC%</span>
<sup class="units">°C</sup>
</p>
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Temperature Fahrenheit</span>
<span id="temperaturef">%TEMPERATUREF%</span>
<sup class="units">°F</sup>
</p>
</body>
<script>
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperaturec").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperaturec", true);
xhttp.send();
}, 10000) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperaturef").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperaturef", true);
xhttp.send();
}, 10000) ;
</script>
</html>)rawliteral";
// Replaces placeholder with DS18B20 values
String processor(const String& var){
//Serial.println(var);
if(var == "TEMPERATUREC"){
return temperatureC;
}
else if(var == "TEMPERATUREF"){
return temperatureF;
}
return String();
}
void setup(){
// Serial port for debugging purposes
Serial.begin(115200);
Serial.println();
// Start up the DS18B20 library
sensors.begin();
temperatureC = readDSTemperatureC();
temperatureF = readDSTemperatureF();
// Connect to Wi-Fi
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
// Print ESP Local IP Address
Serial.println(WiFi.localIP());
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", temperatureC.c_str());
});
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", temperatureF.c_str());
});
// Start server
server.begin();
}
void loop(){
if ((millis() - lastTime) > timerDelay) {
temperatureC = readDSTemperatureC();
temperatureF = readDSTemperatureF();
lastTime = millis();
}
}
Masukkan kredensial jaringan Anda pada variabel berikut, dan kode akan langsung berfungsi.
Bagaimana Kode Berfungsi
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Pada paragraf berikut, kami akan menjelaskan bagaimana kode berfungsi. Lanjutkan membaca jika Anda ingin belajar lebih lanjut atau langsung ke bagian "Demonstrasi" untuk melihat hasil akhir.
Impor Library
Pertama, impor library yang diperlukan untuk board ESP32:
Membuat Instance untuk Sensor DS18B20
Tentukan pin GPIO tempat data sensor DS18B20 dihubungkan. Dalam kasus ini, pin tersebut dihubungkan ke GPIO 4.
#define ONE_WIRE_BUS 4
Membuat Instance yang Diperlukan untuk Menginisialisasi Sensor:
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
Mengatur Kredensial Jaringan Anda
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Masukkan kredensial jaringan Anda pada variabel berikut, agar ESP8266 dapat terhubung ke jaringan lokal Anda.
Membuat objek AsyncWebServer pada port 80.
AsyncWebServer server(80);
Fungsi Membaca Suhu
Selanjutnya, kami membuat dua fungsi untuk membaca suhu.
Fungsi `readDSTemperatureC()` mengembalikan pembacaan suhu dalam derajat Celsius.
String readDSTemperatureC() {
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if(tempC == -127.00){
Serial.println("Failed to read from DS18B20 sensor");
return "--";
} else {
Serial.print("Temperature Celsius: ");
Serial.println(tempC);
}
return String(tempC);
}
"Jika sensor tidak dapat mendapatkan pembacaan yang valid, maka fungsi ini mengembalikan nilai -127. Karena itu, kami menggunakan pernyataan if untuk mengganti nilai -127 dengan dua tanda hubung (–-) jika sensor gagal mendapatkan pembacaan yang valid."
if(tempC == -127.00){
Serial.println("Failed to read from DS18B20 sensor");
return "--";
}
Fungsi `readDSTemperatureF()` bekerja dengan cara yang serupa tetapi mengembalikan pembacaan suhu dalam derajat Fahrenheit.
Hasil pembacaan dikembalikan dalam tipe data string. Untuk mengonversi tipe data float menjadi string, gunakan fungsi String().
return String(tempC);
Membangun Halaman Web
Langkah berikutnya adalah membangun halaman web. Kode HTML dan CSS yang diperlukan untuk membangun halaman web disimpan dalam variabel index_html.
Dalam teks HTML, kami memiliki TEMPERATUREC dan TEMPERATUREF di antara tanda persen (%). Ini adalah tempat penampung untuk nilai suhu.
Ini berarti bahwa teks %TEMPERATUREC% berfungsi seperti variabel yang akan digantikan dengan nilai suhu aktual dari sensor. Penampung pada teks HTML harus berada di antara tanda persen (%).
Kami telah menjelaskan secara detail bagaimana HTML dan CSS yang digunakan dalam web server ini berfungsi dalam tutorial sebelumnya. Jika Anda ingin belajar lebih lanjut, silakan lihat proyek berikutnya:
"DHT11/DHT22 Temperature and Humidity Web Server with Arduino IDE"
Processor
Sekarang, kita perlu membuat fungsi processor() yang akan menggantikan penampung dalam teks HTML dengan nilai suhu aktual.
String processor(const String& var){
//Serial.println(var);
if(var == "TEMPERATUREC"){
return readDSTemperatureC();
}
else if(var == "TEMPERATUREF"){
return readDSTemperatureF();
}
return String();
}
Ketika halaman web diminta, kita memeriksa apakah ada penampung dalam HTML. Jika kita menemukan penampung %TEMPERATUREC%, kita akan mengembalikan nilai suhu dalam derajat Celsius dengan memanggil fungsi readDSTemperatureC() yang telah dibuat sebelumnya.
if(var == "TEMPERATUREC"){
return readDSTemperatureC();
}
Jika penampungnya adalah %TEMPERATUREF%, kita akan mengembalikan nilai suhu dalam derajat Fahrenheit.
else if(var == "TEMPERATUREF"){
return readDSTemperatureF();
}
Setup ()
Dalam fungsi setup(), kita inisialisasi Serial Monitor untuk tujuan debugging.
Serial.begin(115200);
Inisialisasi sensor suhu DS18B20.
sensors.begin();
Sambungkan ke jaringan lokal Anda dan cetak alamat IP ESP32.
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
// Print ESP8266 Local IP Address
Serial.println(WiFi.localIP());
Terakhir, tambahkan baris kode berikut untuk menangani web server.
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});
Ketika kita membuat permintaan pada URL root, kita mengirimkan teks HTML yang disimpan dalam variabel index_html. Kami juga perlu melewati fungsi processor, yang akan menggantikan semua penampung dengan nilai yang tepat.
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
Kita perlu menambahkan dua penangan tambahan untuk memperbarui pembacaan suhu. Ketika kita menerima permintaan pada URL/temperaturec, kita hanya perlu mengirimkan nilai suhu yang diperbarui. Ini berupa teks biasa, dan harus dikirimkan sebagai char, sehingga kita menggunakan metode c_str().
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});
Proses yang sama diulangi untuk suhu dalam Fahrenheit.
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});
Terakhir, kita bisa memulai server.
server.begin();
Karena ini adalah web server yang bersifat asinkron, kita tidak perlu menulis apapun di dalam loop().
void loop(){
}
Itulah kurang lebih cara kerja kode ini.
Demonstrasi
Setelah mengunggah kode, buka Serial Monitor Arduino IDE dengan baud rate 115200. Tekan tombol reset pada ESP32 dan setelah beberapa detik, alamat IP ESP32 akan muncul.
Di jaringan lokal Anda, buka browser dan ketik alamat IP ESP32.
Sekarang Anda dapat melihat suhu dalam derajat Celsius dan Fahrenheit pada web server Anda. Pembacaan sensor akan diperbarui secara otomatis tanpa perlu me-refresh halaman web.
Penutup
Kami berharap Anda telah menemukan tutorial ini bermanfaat.
Terima kasih telah membaca.
Sensor Suhu DS18B20
Sensor temperatur DS28B20
Tutorial Mengintegrasisan Sensor Suhu DS18B20 dengan ESP32
Cara Membaca dan Menampilkan Suhu Data Suhu dengan DS18B20 dan ESP32
DS18B20 adalah
Tutorial Memantau Suhu Via Web Server dengan DS18B20 dan ESP32
Membuat Web Server Untuk Sensor Suhu DS18B20 dan ESP32
Panduan Membaca Suhu dengan DS18B20 dan ESP32 menggunakan Arduino
Mengukur Suhu dengan DS18B20 dan ESP32
Cara Kerja Sensor Suhu DS18B20
Prinsip Kerja Sensor Suhu DS18B20
Tidak ada komentar:
Posting Komentar