Sensor Suhu ESP8266 DS18B20 dengan Arduino IDE (Single, Multiple, Web Server)

Ini adalah panduan mendalam untuk sensor suhu DS18B20 dengan ESP8266 menggunakan Arduino IDE. Kami akan membahas cara memasang sensor, menginstal pustaka yang diperlukan, dan menulis kode untuk mendapatkan pembacaan sensor dari satu dan beberapa sensor. Terakhir, kita akan membangun server web sederhana untuk menampilkan pembacaan sensor.

Sepanjang tutorial ini kita akan membahas topik-topik berikut:

  1. Baca suhu dari satu sensor suhu DS18B20;
  2. Baca suhu dari beberapa sensor suhu DS18B20;
  3. Menampilkan pembacaan sensor DS18B20 di server web.

Memperkenalkan Sensor Suhu DS18B20

sensor suhu DS18B20  adalah satu-kawat sensor suhu digital. Ini berarti hanya memerlukan satu jalur data (dan GND) untuk berkomunikasi dengan ESP8266 Anda.

Ini dapat didukung oleh catu daya eksternal atau dapat memperoleh daya dari jalur data (disebut "mode parasit"), yang menghilangkan kebutuhan akan catu daya eksternal.


Setiap sensor suhu DS18B20 memiliki kode serial 64-bit yang unik. Ini memungkinkan Anda untuk menghubungkan beberapa sensor ke kabel data yang sama. Jadi, Anda bisa mendapatkan suhu dari beberapa sensor hanya dengan satu GPIO.

Sensor suhu DS18B20 juga tersedia dalam  versi tahan air .

Berikut ringkasan spesifikasi paling relevan dari sensor suhu DS18B20:

  • Berkomunikasi melalui bus satu kabel
  • Rentang catu daya: 3.0V hingga 5.5V
  • Kisaran suhu pengoperasian: -55ºC hingga +125ºC
  • Akurasi +/-0,5 C (antara kisaran -10ºC hingga 85ºC)

Untuk informasi lebih lanjut, lihat  lembar data DS18B20 .

Bagian yang Diperlukan

Untuk menyelesaikan tutorial ini Anda memerlukan komponen berikut:

  • ESP8266 
  • Sensor suhu DS18B20  (satu atau beberapa sensor) 
  • Resistor 4.7k Ohm
  • Papan protoboard
  • Kabel jumper

ESP8266 dengan Diagram Skema DS18B20

Seperti disebutkan sebelumnya, sensor suhu DS18B20 dapat diaktifkan melalui pin VDD ( mode normal ), atau dapat memperoleh kekuatannya dari jalur data ( mode parasit ). Anda dapat memilih salah satu mode.

Modus Parasit

Mode normal

Catatan:  dalam tutorial ini kami menghubungkan jalur data DS18B20 keGPIO 4, tetapi Anda dapat menggunakan GPIO lain yang sesuai.

Catatan: jika Anda menggunakan ESP-01 , GPIO 2 adalah pin yang paling cocok untuk dihubungkan ke pin data DS18B20.

Mempersiapkan Arduino IDE Anda

Kami akan memprogram ESP8266 menggunakan Arduino IDE, jadi pastikan Anda telah menginstal add-on ESP8266 sebelum melanjutkan:

Menginstal Perpustakaan untuk DS18B20

Untuk berinteraksi dengan sensor suhu DS18B20, Anda perlu menginstal  perpustakaan One Wire oleh Paul Stoffregen  dan  perpustakaan Suhu Dallas . Ikuti langkah selanjutnya untuk menginstal perpustakaan tersebut.

1. Buka Arduino IDE Anda dan pergi ke  Sketch  >  Include Library  >  Manage Libraries . Manajer Perpustakaan harus terbuka.

2. Ketik " onewire " di kotak pencarian dan instal perpustakaan OneWire oleh Paul Stoffregen.


3. Kemudian, cari “ Dallas ” dan instal perpustakaan Suhu Dallas oleh Miles Burton.


Setelah menginstal perpustakaan, restart Arduino IDE Anda.


Kode (Single DS18B20)

Setelah menginstal perpustakaan yang diperlukan, Anda dapat mengunggah kode berikut ke ESP8266. Kode membaca suhu dari sensor suhu DS18B20 dan menampilkan pembacaan pada 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);
}

Lihat kode mentah

Ada banyak cara berbeda untuk mendapatkan suhu dari sensor suhu DS18B20. Namun, jika Anda hanya menggunakan satu sensor, ini adalah salah satu cara termudah dan paling sederhana.


Cara Kerja Kode

Mulailah dengan menyertakan library OneWire dan DallasTemperatuter.

#include <OneWire.h>
#include <DallasTemperature.h>

Buat instance yang diperlukan untuk sensor suhu. Sensor suhu terhubung keGPIO 4.

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

Dalam mempersiapkan(), inisialisasi Serial Monitor pada baud rate 115200.

Serial.begin(115200);

Inisialisasi sensor suhu DS18B20:

sensors.begin();

Sebelum benar-benar mendapatkan suhu, Anda perlu menghubungi permintaanSuhu() metode.

sensors.requestTemperatures(); 

Kemudian, dapatkan suhu dalam Celcius dengan menggunakan getTempCByIndex() metode seperti yang ditunjukkan di bawah ini:

float temperatureC = sensors.getTempCByIndex(0);

Atau gunakan getTempFByIndex() untuk mendapatkan suhu dalam Fahrenheit.

float temperatureF = sensors.getTempFByIndex(0);

NS getTempCByIndex() dan getTempFByIndex()metode menerima indeks sensor suhu. Karena kita hanya menggunakan satu sensor indeksnya adalah 0. Jika Anda ingin membaca lebih dari satu sensor, Anda menggunakan indeks 0 untuk satu sensor, indeks 1 untuk sensor lainnya dan seterusnya.

Terakhir, print 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 mengupload kode, buka Arduino IDE Serial Monitor dengan baud rate 9600. Anda harus mendapatkan suhu yang ditampilkan dalam Celcius dan Fahrenheit:



Mendapatkan Suhu dari Beberapa Sensor Suhu DS18B20


Sensor suhu DS18B20 berkomunikasi menggunakan protokol satu kabel dan setiap sensor memiliki kode serial 64-bit yang unik, sehingga Anda dapat membaca suhu dari beberapa sensor hanya dengan menggunakan satu Pin digital.

Skema

Untuk membaca suhu dari beberapa sensor, Anda hanya perlu menyambungkan semua jalur data seperti yang ditunjukkan pada diagram skema berikut:


Kode (Beberapa DS18B20s)

Kemudian, unggah kode berikut. Ini memindai semua perangkat diGPIO 4dan mencetak suhu untuk masing-masing. Sketsa ini didasarkan pada contoh yang diberikan oleh perpustakaan 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<numberOfDevices; i++){
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)){
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);
      Serial.println();
    } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
    }
  }
}

void loop(){ 
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++){
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)){
      // Output the device ID
      Serial.print("Temperature for device: ");
      Serial.println(i,DEC);
      // Print the data
      float tempC = sensors.getTempC(tempDeviceAddress);
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
    }
  }
  delay(5000);
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
      Serial.print(deviceAddress[i], HEX);
  }
}

Lihat kode mentah

Cara kerja kode

Kode menggunakan beberapa metode yang berguna untuk menangani beberapa sensor DS18B20.

Anda menggunakan getDeviceCount() metode untuk mendapatkan jumlah sensor DS18B20 pada jalur data.

numberOfDevices = sensors.getDeviceCount();

NS dapatkanAlamat() metode menemukan alamat sensor:

if(sensors.getAddress(tempDeviceAddress, i)){

Alamatnya unik untuk setiap sensor. Jadi setiap sensor dapat diidentifikasi dengan alamatnya.

Kemudian, Anda menggunakan getTempC()metode yang menerima sebagai argumen alamat perangkat. Dengan metode ini, Anda bisa mendapatkan suhu dari sensor tertentu:

float tempC = sensors.getTempC(tempDeviceAddress);

Untuk mendapatkan suhu dalam derajat Fahrenheit, Anda dapat menggunakan dapatkanTemF()Atau, Anda dapat mengubah suhu dalam Celcius ke Fahrenheit sebagai berikut:

DallasTemperature::toFahrenheit(tempC)

Demonstrasi

Setelah mengupload kode, buka Serial Monitor Anda pada baud rate 115200. Anda akan menampilkan semua pembacaan sensor seperti yang ditunjukkan di bawah ini:



Tampilkan Pembacaan Suhu DS18B20 di Server Web

Untuk membangun server web, kami akan menggunakan  pustaka ESPAsyncWebServer yang menyediakan cara mudah untuk membangun server web asinkron. Membangun server web asinkron memiliki beberapa keuntungan. Kami menyarankan untuk melihat sekilas dokumentasi perpustakaan di halaman GitHub -nya .

Menginstal perpustakaan ESPAsyncWebServer

Pustaka ESPAsyncWebServer tidak tersedia untuk dipasang di Pengelola Perpustakaan IDE Arduino. Jadi, Anda perlu menginstalnya secara manual.

Ikuti langkah-langkah selanjutnya untuk menginstal perpustakaan ESPAsyncWebServer:

  1. Klik di sini untuk mengunduh pustaka ESPAsyncWebServer . Anda harus memiliki folder .zip di folder Unduhan Anda
  2. Buka zip folder .zip dan Anda akan mendapatkan   folder master ESPAsyncWebServer
  3. Ganti nama folder Anda dari ESPAsyncWebServer-master ke  ESPAsyncWebServer
  4. Pindahkan  folder ESPAsyncWebServer  ke folder library instalasi Arduino IDE Anda

Menginstal Perpustakaan TCP ESPAsync

Pustaka ESPAsyncWebServer memerlukan  pustaka ESPAsyncTCP agar berfungsi. Ikuti langkah-langkah selanjutnya untuk menginstal perpustakaan itu:

  1. Klik di sini untuk mengunduh pustaka ESPAsyncTCP . Anda harus memiliki folder .zip di folder Unduhan Anda
  2. Buka zip folder .zip dan Anda akan mendapatkan  folder master ESPAsyncTCP
  3. Ganti nama folder Anda dari ESPAsyncTCP-master ke ESPAsyncTCP
  4. Pindahkan  folder ESPAsyncTCP ke folder library instalasi Arduino IDE Anda
  5. Terakhir, buka kembali IDE Arduino Anda

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>S
#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">&deg;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">&deg;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();
  }  
}

Lihat kode mentah

Masukkan kredensial jaringan Anda dalam variabel berikut, dan kode akan langsung bekerja.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Cara Kerja Kode

Dalam paragraf berikut kami akan menjelaskan cara kerja kode. Teruslah membaca jika Anda ingin mempelajari lebih lanjut atau lompat ke bagian “Demonstrasi” untuk melihat hasil akhirnya.

Mengimpor perpustakaan

Pertama, impor perpustakaan yang diperlukan.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Instansiasi Sensor DS18B20

Tentukan GPIO yang terhubung dengan pin data DS18B20. Dalam hal ini, itu terhubung keGPIO 4(D1).

#define ONE_WIRE_BUS 4

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

Buat variabel yang akan menahan suhu dan kelembaban sebagai nilai String:

String temperatureF = "";
String temperatureC = "";

Kami akan mendapatkan pembacaan sensor baru setiap 30 detik. Anda dapat mengubahnya diwaktu tunda variabel.

unsigned long lastTime = 0;  
unsigned long timerDelay = 30000;

Mengatur kredensial jaringan Anda

Masukkan kredensial jaringan Anda di variabel berikut, sehingga ESP8266 dapat terhubung ke jaringan lokal Anda.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Buat objek AsyncWebServer pada port 80.

AsyncWebServer server(80);

Baca Fungsi Suhu

Kemudian, kami membuat dua fungsi untuk membaca suhu.

NS bacaDSTemperatureC() fungsi mengembalikan pembacaan dalam derajat Celcius.

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 bisa mendapatkan pembacaan yang valid, ia mengembalikan -127. Jadi, kami memiliki pernyataan if yang mengembalikan dua tanda hubung (–-) jika sensor gagal mendapatkan pembacaan.

if(tempC == -127.00){
  Serial.println("Failed to read from DS18B20 sensor");
  return "--";

NS bacaDSTemperatureF() fungsi bekerja dengan cara yang sama tetapi mengembalikan pembacaan dalam derajat Fahrenheit.

Pembacaan dikembalikan sebagai tipe string. Untuk mengonversi float menjadi string, gunakanRangkaian() fungsi.

return String(tempC);

Membangun Halaman Web

Langkah selanjutnya adalah membangun halaman web. HTML dan CSS yang diperlukan untuk membuat halaman web disimpan diindex_html variabel.

Dalam teks HTML yang kita miliki SUHU dan TEMPERATUREFantara % tanda. Ini adalah pengganti untuk nilai suhu.

Ini berarti bahwa %TEMPERATUREC%teks seperti variabel yang akan digantikan oleh nilai suhu aktual dari sensor. Placeholder pada teks HTML harus berada di antara tanda % .

Prosesor

Sekarang, kita perlu membuat prosesor() fungsi, yang akan menggantikan placeholder dalam teks HTML kita dengan nilai suhu aktual.

// 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();
}

Saat halaman web diminta, kami memeriksa apakah HTML memiliki placeholder. Jika menemukan%TEMPERATUREC% placeholder, kami mengembalikan suhu dalam Celcius dengan memanggil bacaDSTemperatureC() fungsi yang dibuat sebelumnya.

if(var == "TEMPERATUREC"){
  return temperatureC;
}

Jika penggantinya adalah %TEMPERATUREF%, kami mengembalikan suhu dalam Fahrenheit.

else if(var == "TEMPERATUREF"){
  return temperatureF;
}

mempersiapkan()

Dalam mempersiapkan(), inisialisasi Serial Monitor untuk keperluan debugging.

Serial.begin(115200);

Inisialisasi sensor suhu DS18B20.

sensors.begin();

Dapatkan nilai suhu saat ini:

temperatureC = readDSTemperatureC();
temperatureF = readDSTemperatureF();

Hubungkan ke jaringan lokal Anda dan cetak alamat IP ESP8266.

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 berikutnya untuk menangani server web.

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

Saat kami membuat permintaan pada URL root, kami mengirim teks HTML yang disimpan di index_htmlvariabel. Kita juga harus melewatiprosesor fungsi, yang akan menggantikan semua placeholder 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. Saat kami menerima permintaan di  URL /temperature c, kami hanya perlu mengirim nilai suhu yang diperbarui. Ini adalah teks biasa, dan harus dikirim sebagai karakter, jadi, kami menggunakanc_str() metode.

server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", temperatureC.c_str());
});

Proses yang sama diulang untuk suhu dalam Fahrenheit.

server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", temperatureF.c_str());
});

Terakhir, kita bisa memulai server.

server.begin();

Dalam lingkaran(), perbarui nilai suhu setiap 30 detik (waktu tunda variabel).

void loop(){
  if ((millis() - lastTime) > timerDelay) {
    temperatureC = readDSTemperatureC();
    temperatureF = readDSTemperatureF();
    lastTime = millis();
  }  
}

Kurang lebih begitulah cara kerja kode.

Demonstrasi

Setelah mengupload kode, buka Arduino IDE Serial Monitor dengan baud rate 115200. Setelah beberapa detik, alamat IP Anda akan muncul.

Di jaringan lokal Anda, buka browser dan ketik alamat IP ESP8266.

Sekarang Anda dapat melihat suhu dalam Celcius dan Fahrenheit di server web Anda. Pembacaan sensor diperbarui secara otomatis tanpa perlu me-refresh halaman web.


Penutup

Ini adalah panduan mendalam tentang cara menggunakan sensor suhu DS18B20 dengan ESP8266 dan menampilkan pembacaan di server web.

DS18B20 berkomunikasi melalui protokol satu kabel dan setiap sensor memiliki kode serial 64-bit yang unik, yang berarti Anda dapat membaca banyak sensor pada pin data yang sama.

Post a Comment

Lebih baru Lebih lama