Pendahuluan
Sensor DS18B20 dapat mengukur suhu dengan rentang -55°C sampai +125°C dengan akurasi ±0.5°C untuk temperature antara -10°C dan +85°C. Cocok digunakan untuk aplikasi yang membutuhkan akurasi yang lebih tinggi.
DS18B20 menggunakan 1-Wire bus system dan dengan protokol komunikasi 64-bit addressing, jadi multiple DS18B20s dapat menggunakan saluran komunikasi yang sama.
Component
- DS18B20 sensor.
- 4.7 kΩ pull-up resistor.
Diagram
Code
File driver sama dengan external library dari modul sebelumnya.
Kita juga perlu mengatur platformio.ini
monitor_speed = 115200 lib_extra_dirs = ../../esp-idf-lib/components
Buka file main.c, gunakan code berikut
//bagian import library #include <stdio.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <ds18x20.h> #define SENSOR_PIN 21 #define MAX_SENSORS 8 static ds18x20_addr_t addrs[MAX_SENSORS]; static int sensor_count = 0; static float temps[MAX_SENSORS]; //bagian init hardware static void init_hw(void) { while (sensor_count == 0) { sensor_count = ds18x20_scan_devices((gpio_num_t)SENSOR_PIN, addrs, MAX_SENSORS); vTaskDelay(1000 / portTICK_PERIOD_MS); } if (sensor_count > MAX_SENSORS) { sensor_count = MAX_SENSORS; } } //bagian main function void app_main() { init_hw(); while (1) { ds18x20_measure_and_read_multi((gpio_num_t)SENSOR_PIN, addrs, sensor_count, temps); for (int i = 0; i < sensor_count; i++) { printf("sensor-id: %08x temp: %fC\n", (uint32_t) addrs[i], temps[i]); } vTaskDelay(1000 / portTICK_PERIOD_MS); } }
Penjelasan Code
Bagian import library
Untuk driver, include ds18x20.h header file. Type untuk addressing adalah ds18x20_addr_t, berupa 64-bit unsigned integer yang didefinsikan pada header file.
Pada contoh, kita alokasikan arrays dengan ukuran 8 untuk menyimpan addresses dan temperature readings.
Bagian Init Hardware
Pada init_hw function, kita scan 1-wire bus untuk sensor dengan memanggil perintah ds18x20_scan_devices. Parameter yang diperlukan GPIO pin dimana sensors terhubung dan isi addrs dengan array sensor addresses.
Bagian Main App
app_main function akan berisi while loop untuk membaca sensors. Fungsi yang digunakan adalah ds18x20_measure_and_read_multi, parameter yang digunakan adalah GPIO pin dimana sensors terhubung, addresses dan array untuk menyimpan hasil readings.
Tips
Jika anda menggunakan single DS18B20 sensor, Anda dapat gunakan fungsi ds18x20_read_temperature, dengan sensor address adalah ds18x20_ANY. Jadi kita tidak perlu melakukan bus scan untuk menemukan addresses.
Sampai disini kita sudah mempelajari bagaimana menggunakan sensor suhu yang lebih akurat. Pada modul berikutnya kita akan mempelajari sensor cahaya.