
Karena merasa gabut dan gerah, aku terpikir untuk mengukur suhu di kamarku. Akhirnya, iseng-iseng aku merangkai ESP32 dan OLED display untuk membuat sistem sederhana. Eksperimen ini mungkin bisa berguna bagi pemula di dunia IoT seperti aku, jadi aku memutuskan untuk mencatatnya di sini.
Pada artikel ini, kita akan membahas cara membuat sistem monitoring suhu menggunakan ESP32, sensor DS18B20, OLED Display SSD1306, dan 4 LED indikator yang masing-masing menampilkan kondisi suhu berbeda (Cool, Normal, Warm, dan Hot). Proyek ini sangat cocok untuk pemula dalam bidang IoT (Internet of Things) dan mikrokontroler yang ingin belajar tentang pengukuran suhu dan kontrol LED berbasis kondisi suhu.
Bahan dan Alat yang Dibutuhkan
Berikut ini adalah daftar komponen yang diperlukan:
- ESP32 DEVKIT 1
- Sensor DS18B20 untuk mengukur suhu.
- OLED Display SSD1306 untuk menampilkan suhu dan kondisi.
- 4 buah LED (Biru, Hijau, Oranye, Merah) sebagai indikator kondisi suhu.
- Resistor 220Ω untuk masing-masing LED.
- Resistor pull-up 4.7kΩ untuk sensor DS18B20.
- Breadboard dan kabel jumper untuk menyusun rangkaian.
Tujuan Proyek
Sistem ini akan mengukur suhu ruangan menggunakan sensor DS18B20, lalu menampilkan hasil pengukurannya pada OLED Display SSD1306. Berdasarkan pengukuran suhu, 4 buah LED akan menyala sesuai dengan kondisi suhu yang terbaca:
- Cool: Suhu di bawah 25°C (LED Biru menyala).
- Normal: Suhu antara 25°C dan 27°C (LED Normal menyala).
- Warm: Suhu antara 27°C dan 28°C (LED Oranye menyala).
- Hot: Suhu di atas 29°C (LED Merah menyala).
Langkah 1: Rangkaian Hardware
Koneksi Sensor DS18B20:
- VCC → 3.3V ESP32.
- GND → GND ESP32.
- DQ → GPIO 15 ESP32 (gunakan resistor pull-up 4.7kΩ antara pin DQ dan VCC).
Koneksi OLED Display SSD1306 (I2C):
- VCC → 3.3V ESP32.
- GND → GND ESP32.
- SDA → GPIO 21 ESP32.
- SCL → GPIO 22 ESP32.
Koneksi 4 LED Indikator:
- LED Biru (Cool) → GPIO 16 ESP32 (resistor 220Ω).
- LED Hijau (Normal) → GPIO 17 ESP32 (resistor 220Ω).
- LED Oranye (Warm) → GPIO 18 ESP32 (resistor 220Ω).
- LED Merah (Hot) → GPIO 19 ESP32 (resistor 220Ω).
Rangkaian
Langkah 2: Menginstal Library yang Diperlukan
Sebelum menulis kode, pastikan Anda menginstal beberapa library yang diperlukan agar ESP32 dapat bekerja dengan sensor DS18B20 dan OLED SSD1306. Berikut adalah penjelasan mengenai library dan cara menginstalnya di Arduino IDE.
Library Adafruit SSD1306
Library ini digunakan untuk mengendalikan OLED Display SSD1306.
Cara Instalasi:
Buka Arduino IDE. Pilih Sketch > Include Library > Manage Libraries. Di Library Manager, cari "Adafruit SSD1306". Pilih Adafruit SSD1306 by Adafruit dan klik Install.
Library Adafruit GFX
Library ini digunakan bersama dengan Adafruit SSD1306 untuk menggambar bentuk dan menampilkan teks di OLED.
Cara Instalasi:
Di Library Manager (seperti langkah di atas), cari "Adafruit GFX". Pilih Adafruit GFX Library dan klik Install.
Library DallasTemperature
Library ini diperlukan untuk berkomunikasi dengan sensor DS18B20.
Cara Instalasi:
Di Library Manager, cari "DallasTemperature". Pilih DallasTemperature by Miles Burton dan klik Install.
Library OneWire
Library ini memungkinkan ESP32 berkomunikasi dengan sensor DS18B20 yang menggunakan protokol OneWire.
Cara Instalasi:
Di Library Manager, cari "OneWire". Pilih OneWire by Paul Stoffregen dan klik Install.
Langkah 3: Kode Program
Berikut ini adalah kode lengkap yang akan membaca suhu dari DS18B20, menampilkan informasi suhu pada OLED, dan mengendalikan LED sesuai kondisi suhu:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Konfigurasi pin untuk DS18B20 dan LED
#define ONE_WIRE_BUS 15 // Pin untuk DS18B20
#define LED_COOL 16 // Pin untuk LED kondisi "Cool" (Biru)
#define LED_NORMAL 17 // Pin untuk LED kondisi "Normal" (Hijau)
#define LED_WARM 18 // Pin untuk LED kondisi "Warm" (Oranye)
#define LED_HOT 19 // Pin untuk LED kondisi "Hot" (Merah)
// Konfigurasi OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Konfigurasi OneWire untuk DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(115200);
// Inisialisasi OLED Display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat I2C OLED 0x3C atau 0x3D
Serial.println(F("OLED gagal diinisialisasi!"));
for (;;); // Berhenti jika gagal
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Inisialisasi sensor suhu DS18B20
sensors.begin();
// Inisialisasi pin untuk LED
pinMode(LED_COOL, OUTPUT);
pinMode(LED_NORMAL, OUTPUT);
pinMode(LED_WARM, OUTPUT);
pinMode(LED_HOT, OUTPUT);
// Set semua LED ke kondisi mati
digitalWrite(LED_COOL, LOW);
digitalWrite(LED_NORMAL, LOW);
digitalWrite(LED_WARM, LOW);
digitalWrite(LED_HOT, LOW);
// Tampilkan pesan inisialisasi
display.setCursor(0, 0);
display.println("Inisialisasi Sukses");
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
// Baca suhu dari DS18B20
sensors.requestTemperatures();
float suhu = sensors.getTempCByIndex(0);
// Tampilkan suhu di Serial Monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" C");
// Bersihkan layar OLED
display.clearDisplay();
// Header atau judul di bagian atas layar
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Monitoring Suhu Ruang");
// Gaya tampilan utama suhu dengan ukuran besar
display.setTextSize(1);
display.setCursor(0, 16); // Atur posisi kursor untuk "Suhu: "
display.print("Suhu:"); // Tampilkan "Suhu:"
display.setTextSize(2);
display.setCursor(0, 28); // Pindah kursor ke bawah (baris baru)
display.print(suhu); // Tampilkan nilai suhu pada baris berikutnya
display.print(" C"); // Tampilkan unit suhu pada baris yang sama dengan nilai suhu
// Tentukan kondisi berdasarkan suhu yang terbaca dan kontrol LED
String kondisi;
if (suhu < 25) {
kondisi = "Cool";
digitalWrite(LED_COOL, HIGH); // Nyalakan LED Cool (Biru)
digitalWrite(LED_NORMAL, LOW); // Matikan LED Normal
digitalWrite(LED_WARM, LOW); // Matikan LED Warm
digitalWrite(LED_HOT, LOW); // Matikan LED Hot
} else if (suhu >= 25 && suhu < 27) {
kondisi = "Normal";
digitalWrite(LED_COOL, LOW); // Matikan LED Cool
digitalWrite(LED_NORMAL, HIGH); // Nyalakan LED Normal (Hijau)
digitalWrite(LED_WARM, LOW); // Matikan LED Warm
digitalWrite(LED_HOT, LOW); // Matikan LED Hot
} else if (suhu >= 27 dan suhu < 29) {
kondisi = "Warm";
digitalWrite(LED_COOL, LOW); // Matikan LED Cool
digitalWrite(LED_NORMAL, LOW); // Matikan LED Normal
digitalWrite(LED_WARM, HIGH); // Nyalakan LED Warm (Oranye)
digitalWrite(LED_HOT, LOW); // Matikan LED Hot
} else if (suhu >= 29) {
kondisi = "Hot";
digitalWrite(LED_COOL, LOW); // Matikan LED Cool
digitalWrite(LED_NORMAL, LOW); // Matikan LED Normal
digitalWrite(LED_WARM, LOW); // Matikan LED Warm
digitalWrite(LED_HOT, HIGH); // Nyalakan LED Hot (Merah)
}
// Tampilkan kondisi suhu di OLED
display.setTextSize(1);
display.setCursor(0, 45); // Baris kedua untuk kondisi suhu
display.print("Status: ");
display.print(kondisi);
// Menampilkan grafik bar suhu
int barWidth = map(suhu, 0, 50, 0, 128); // Peta suhu (0-50C) ke lebar layar (0-128 pixel)
display.drawRect(0, 56, 128, 8, SSD1306_WHITE); // Gambar bingkai grafik
display.fillRect(0, 56, barWidth, 8, SSD1306_WHITE); // Isi grafik sesuai suhu
// Tampilkan semua elemen di layar OLED
display.display();
// Tunggu sebelum pengukuran berikutnya
delay(2000);
}
Struktur Kode Program Header dan Library yang Digunakan
#include <Wire.h>:
Library ini digunakan untuk komunikasi I2C antara ESP32 dan OLED Display.
#include <Adafruit_GFX.h>
dan #include <Adafruit_SSD1306.h>
: Library dari Adafruit ini digunakan untuk mengontrol OLED Display SSD1306. Library GFX memberikan kemampuan untuk menggambar bentuk dan teks pada display.
#include <OneWire.h>
dan #include <DallasTemperature.h>
: Library OneWire digunakan untuk berkomunikasi dengan sensor DS18B20, sementara DallasTemperature menangani pengambilan data suhu dari sensor.
Konfigurasi Pin dan OLED
ONE_WIRE_BUS
: Pin GPIO 15 digunakan untuk menghubungkan sensor DS18B20 ke ESP32.
LED_COOL, LED_NORMAL, LED_WARM, LED_HOT
: Pin GPIO 16-19 masing-masing dihubungkan ke LED indikator dengan warna berbeda untuk kondisi suhu.
SCREEN_WIDTH dan SCREEN_HEIGHT
: Ini mendefinisikan resolusi layar OLED, yaitu 128x64 pixel.
Adafruit_SSD1306 display
: Membuat objek display dari library Adafruit untuk mengontrol OLED Display SSD1306.
Inisialisasi Sensor dan LED
OneWire oneWire(ONE_WIRE_BUS);
: Membuat objek oneWire untuk berkomunikasi dengan DS18B20 pada pin GPIO 15.
DallasTemperature sensors(&oneWire);
: Objek sensors dari library DallasTemperature untuk mengelola sensor suhu DS18B20.
Fungsi setup()
Serial.begin(115200);
: Memulai komunikasi serial dengan baud rate 115200 untuk debugging di Serial Monitor.
display.begin()
: Menginisialisasi OLED Display. Jika gagal, pesan error akan ditampilkan di Serial Monitor, dan program akan berhenti.
sensors.begin()
: Menginisialisasi komunikasi dengan sensor DS18B20.
pinMode(LED_COOL, OUTPUT)
: Mengatur pin GPIO 16 sebagai output untuk LED Biru. Ini juga dilakukan untuk pin GPIO lainnya yang terhubung ke LED.
digitalWrite(LED_COOL, LOW)
: Menyalakan LED dalam keadaan mati saat inisialisasi.
display.println("Inisialisasi Sukses")
: Menampilkan pesan "Inisialisasi Sukses" di OLED sebagai tanda bahwa sistem telah berhasil diinisialisasi.
Fungsi loop()
sensors.requestTemperatures()
: Meminta sensor untuk mengukur suhu saat ini.
float suhu = sensors.getTempCByIndex(0);
: Membaca suhu dari sensor DS18B20 dalam derajat Celsius.
Menampilkan Suhu di Serial dan OLED
Serial.print()
: Menampilkan nilai suhu di Serial Monitor.
display.clearDisplay()
: Membersihkan layar OLED sebelum menampilkan informasi baru.
display.print()
: Menampilkan teks di layar OLED, termasuk nilai suhu dalam derajat Celsius.
Kondisi Suhu dan Pengendalian LED
Kondisi suhu dibagi menjadi 4 kategori: Cool, Normal, Warm, dan Hot.
Jika suhu < 24°C, kondisi adalah Cool dan LED Biru akan menyala. Jika suhu antara 25°C dan 27°C, kondisi adalah Normal dan LED Hijau akan menyala. Jika suhu antara 28°C dan 29°C, kondisi adalah Warm dan LED Oranye akan menyala. Jika suhu >= 30°C, kondisi adalah Hot dan LED Merah akan menyala. digitalWrite(): Menyalakan atau mematikan LED sesuai kondisi suhu.
Menampilkan Kondisi Suhu dan Grafik Bar di OLED
display.print("Status: ")
: Menampilkan status suhu (Cool, Normal, Warm, Hot) di OLED.
map(suhu, 0, 50, 0, 128)
: Mengonversi nilai suhu ke lebar grafik batang, di mana suhu 0°C hingga 50°C dipetakan ke panjang 0 hingga 128 pixel di OLED.
display.drawRect()
dan display.fillRect()
: Menampilkan grafik bar sesuai suhu yang terbaca.
delay(2000)
: Menunggu 2 detik sebelum pembacaan suhu berikutnya.
Langkah 4: Uji Coba Sistem
- Upload Kode ke ESP32: Gunakan Arduino IDE untuk mengupload kode ke
ESP32. - Cek Suhu di OLED dan LED: Lihat hasil suhu yang ditampilkan di OLED dan perhatikan LED indikator yang menyala sesuai dengan kondisi suhu.
- Periksa Koneksi dan Debugging: Jika salah satu LED tidak menyala atau tidak ada tampilan di OLED, pastikan koneksi telah benar dan tidak ada hubungan pendek (short circuit).
Kesimpulan
Dengan mengikuti tutorial ini, Anda telah berhasil membuat sistem monitoring suhu menggunakan ESP32, sensor DS18B20, OLED Display, dan 4 LED untuk menampilkan kondisi suhu. Proyek ini dapat menjadi dasar bagi aplikasi IoT yang lebih canggih, seperti sistem kontrol suhu otomatis atau pemantauan lingkungan.