ESP32 adalah mikrokontroler System-on-Chip (SoC) yang dikembangkan oleh Espressif Systems asal Shanghai, Tiongkok. Chip ini menjadi sangat populer di kalangan maker dan engineer IoT karena menawarkan konektivitas WiFi dan Bluetooth dalam satu paket hemat daya dan murah.
ESP32 menggunakan prosesor Xtensa dual-core 32-bit LX6 yang berjalan pada frekuensi hingga 240 MHz. Ini menjadikannya jauh lebih powerful dibanding pendahulunya, ESP8266, yang hanya memiliki single-core berjalan di 80 MHz.
๐ก Tips
ESP32 tersedia dalam berbagai varian modul: ESP32-DevKitC, ESP32-WROOM-32, ESP32-S3, ESP32-C3, dan lain-lain. Untuk tutorial ini, kita akan menggunakan modul ESP32 DevKit v1 yang paling umum dan ramah pemula.
Spesifikasi Utama ESP32
Parameter
Spesifikasi
Prosesor
Xtensa Dual-Core LX6 @ 240 MHz
RAM
520 KB SRAM
Flash
4 MB (tergantung modul)
WiFi
802.11 b/g/n (2.4 GHz)
Bluetooth
BLE 4.2 + Classic
GPIO
34 pin (26 usable)
ADC
18 channel, 12-bit
DAC
2 channel, 8-bit
SPI / I2C / UART
4 / 2 / 3
Operating Voltage
2.2V โ 3.6V
Input Voltage (via USB)
5V
Arsitektur Internal ESP32 SoC
โก
Core 0 (LX6)
Dual-Core 240 MHz
โก
Core 1 (LX6)
Dual-Core 240 MHz
๐ก
WiFi 2.4GHz
802.11 b/g/n
๐ถ
Bluetooth
BLE 4.2 + Classic
โ
๐พ
520 KB SRAM
Memory Internal
๐
ADC 12-bit
18 Channel
๐
DAC 8-bit
2 Channel
ใฐ๏ธ
PWM
16 Channel
๐
Touch Pad
10 Channel
โ
๐
GPIO (34)
26 Usable
๐
SPI (4)
High Speed
๐
I2C (2)
Sensor Bus
๐
UART (3)
Serial Comm
Perbandingan ESP32 vs ESP8266 vs Arduino Uno
๐ง
ESP32
Rp 40-60rb
โ Dual-Core 240MHz
โ RAM 520 KB
โ Flash 4 MB
โ WiFi Built-in
โ BLE + Classic Bluetooth
โ 34 GPIO
โก Tegangan 3.3V
Paling Populer
๐ก
ESP8266
Rp 25-35rb
โ Single-Core 80MHz
โ RAM 160 KB
โ Flash 4 MB
โ WiFi Built-in
โ Tanpa Bluetooth
โ 17 GPIO
โก Tegangan 3.3V
Budget Friendly
๐ฆ
Arduino Uno
Rp 60-80rb
โ Single-Core 16MHz
โ RAM 2 KB
โ Flash 32 KB
โ Perlu WiFi Shield
โ Tanpa Bluetooth
โ 14 Digital + 6 Analog
โก Tegangan 5V
Legacy / Shield
โน๏ธ Kapan Pilih Mana?
Pilih ESP32 jika butuh WiFi + Bluetooth, komputasi lebih berat, atau banyak sensor. Pilih ESP8266 untuk proyek sederhana yang butuh WiFi saja. Pilih Arduino Uno untuk proyek yang membutuhkan tegangan 5V atau shield khusus.
2. Instalasi Arduino IDE dan Setup ESP32
Arduino IDE adalah Integrated Development Environment gratis yang paling banyak digunakan untuk memprogram mikrokontroler, termasuk ESP32. Meskipun ESP32 bukan produk Arduino resmi, board manager komunitas menyediakan dukungan penuh.
Langkah 1: Download dan Instal Arduino IDE 2.x
Kunjungi situs resmi https://www.arduino.cc/en/software
Pilih Arduino IDE 2.x (versi terbaru) untuk sistem operasi Anda
Download dan jalankan installer, ikuti wizard instalasi
Buka Arduino IDE setelah instalasi selesai
Langkah 2: Tambahkan Board ESP32 ke Board Manager
Diagram: Rangkaian LED Internal ESP32
Tulis kode berikut di Arduino IDE:
C++ โ led_blink.ino
// Program Blink LED - Hello World ESP32
// BeebaneLabs - https://beebanelabs.pages.dev
#define LED_BUILTIN_PIN 2
void setup() {
// Konfigurasi GPIO 2 sebagai output
pinMode(LED_BUILTIN_PIN, OUTPUT);
// Inisialisasi komunikasi serial
Serial.begin(115200);
Serial.println("ESP32 LED Blink dimulai!");
}
void loop() {
// Nyalakan LED
digitalWrite(LED_BUILTIN_PIN, HIGH);
Serial.println("LED ON");
delay(1000); // Tunggu 1 detik
// Matikan LED
digitalWrite(LED_BUILTIN_PIN, LOW);
Serial.println("LED OFF");
delay(1000); // Tunggu 1 detik
}
Cara Upload Program
Klik tombol โ Verify (atau Ctrl + R) untuk kompilasi
Pastikan tidak ada error
Klik tombol โ Upload (atau Ctrl + U)
Tunggu hingga muncul pesan "Done uploading"
Buka Tools โ Serial Monitor (atau Ctrl + Shift + M)
Atur baud rate ke 115200
Output Serial Monitor:
ESP32 LED Blink dimulai!
LED ON
LED OFF
LED ON
LED OFF
...
๐ก Tips Pemula
Jika ESP32 tidak masuk mode upload, coba tahan tombol BOOT pada board saat proses upload dimulai, kemudian lepaskan setelah muncul pesan "Connecting...". Ini adalah fitur bootloader ESP32.
4. Membaca Sensor Suhu DHT11
Sensor DHT11 adalah sensor digital yang murah dan mudah digunakan untuk mengukur suhu dan kelembaban udara. DHT11 memiliki rentang pengukuran suhu 0-50ยฐC dengan akurasi ยฑ2ยฐC, dan kelembaban 20-80% dengan akurasi ยฑ5%.
Kebutuhan Komponen
1x ESP32 DevKit
1x Sensor DHT11 (atau DHT22 untuk akurasi lebih baik)
1x Resistor 10kฮฉ (pull-up)
Kabel jumper beberapa buah
Breadboard
Diagram: Rangkaian ESP32 + DHT11
Instalasi Library DHT
Buka menu Sketch โ Include Library โ Manage Libraries
Cari "DHT sensor library" oleh Adafruit
Klik Install (library dependencies seperti Adafruit Unified Sensor akan ikut terinstal)
Program Membaca Sensor DHT11
Diagram: Arsitektur MQTT
Arsitektur MQTT
Instalasi Library MQTT
Buka Sketch โ Include Library โ Manage Libraries
Cari "PubSubClient" oleh Nick O'Leary
Klik Install
โน๏ธ Broker MQTT untuk Testing
Untuk percobaan, Anda bisa menggunakan broker MQTT publik gratis dari test.mosquitto.org (tanpa autentikasi). Untuk produksi, instal broker Mosquitto di Raspberry Pi atau gunakan layanan cloud seperti HiveMQ, AWS IoT, atau EMQX.
Diagram: Arsitektur Monitoring Suhu Real-time
Arsitektur Monitoring Suhu Real-time
Program Lengkap Proyek Monitoring
C++ โ monitoring_suhu.ino
// =============================================
// Proyek: Monitoring Suhu Real-time via MQTT
// BeebaneLabs - https://beebanelabs.pages.dev
// =============================================
#include "WiFi.h"
#include "PubSubClient.h"
#include "DHT.h"
// === Pin & Sensor ===
#define DHT_PIN 4
#define DHT_TYPE DHT11
#define LED_STATUS 2
// === WiFi Config ===
const char* WIFI_SSID = "NamaWiFiAnda";
const char* WIFI_PASS = "PasswordWiFi";
// === MQTT Config ===
const char* MQTT_SERVER = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC_DATA = "iothub/monitoring/suhu";
const char* MQTT_TOPIC_ALERT = "iothub/monitoring/alert";
const char* MQTT_TOPIC_CMD = "iothub/monitoring/cmd";
const char* CLIENT_ID = "esp32_monitor_suhu_01";
// === Threshold ===
const float SUHU_BAHAYA = 35.0; // Suhu bahaya dalam Celsius
const float SUHU_WASPADA = 30.0; // Suhu waspada
const int INTERVAL_KIRIM = 15000; // Kirim setiap 15 detik
// === Objek ===
DHT dht(DHT_PIN, DHT_TYPE);
WiFiClient espClient;
PubSubClient mqtt(espClient);
// === Variabel Global ===
unsigned long lastKirim = 0;
int totalPengiriman = 0;
int totalError = 0;
bool modeDebug = false;
// === Callback saat menerima pesan MQTT ===
void onMessage(char* topic, byte* payload, unsigned int length) {
String pesan = "";
for (unsigned int i = 0; i < length; i++) {
pesan += (char)payload[i];
}
Serial.print("[CMD] Diterima di topik '");
Serial.print(topic);
Serial.print("': ");
Serial.println(pesan);
// Handle perintah sederhana
if (pesan == "status") {
char statusMsg[128];
snprintf(statusMsg, sizeof(statusMsg),
"{\"total_pengiriman\":%d,\"total_error\":%d,\"uptime\":%lu}",
totalPengiriman, totalError, millis() / 1000);
mqtt.publish(MQTT_TOPIC_DATA, statusMsg);
Serial.println("[CMD] Status dikirim.");
} else if (pesan == "debug_on") {
modeDebug = true;
Serial.println("[CMD] Mode debug diaktifkan.");
} else if (pesan == "debug_off") {
modeDebug = false;
Serial.println("[CMD] Mode debug dinonaktifkan.");
}
}
void setupWiFi() {
Serial.print("WiFi: Menghubungkan ke ");
Serial.print(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
int attempt = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (++attempt > 40) {
Serial.println(" [GAGAL]");
ESP.restart(); // Restart jika gagal
}
}
Serial.println(" [OK]");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
// Kedipkan LED sebagai indikator WiFi terhubung
for (int i = 0; i < 5; i++) {
digitalWrite(LED_STATUS, HIGH);
delay(100);
digitalWrite(LED_STATUS, LOW);
delay(100);
}
}
void setupMQTT() {
mqtt.setServer(MQTT_SERVER, MQTT_PORT);
mqtt.setCallback(onMessage);
mqtt.setBufferSize(256);
}
void hubungkanMQTT() {
while (!mqtt.connected()) {
Serial.print("MQTT: Menghubungkan...");
// Buat pesan LWT (Last Will and Testament)
char lwtMsg[] = "{\"status\":\"offline\"}";
if (mqtt.connect(CLIENT_ID, MQTT_TOPIC_DATA, 1, true, lwtMsg)) {
Serial.println(" [OK]");
digitalWrite(LED_STATUS, HIGH);
// Subscribe ke topik perintah
mqtt.subscribe(MQTT_TOPIC_CMD);
Serial.println("Subscribed ke: " + String(MQTT_TOPIC_CMD));
// Publish status online (retained)
mqtt.publish(MQTT_TOPIC_DATA, "{\"status\":\"online\"}", true);
} else {
Serial.print(" [GAGAL, rc=");
Serial.print(mqtt.state());
Serial.println("]");
digitalWrite(LED_STATUS, LOW);
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_STATUS, OUTPUT);
Serial.println("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
Serial.println("โ Monitoring Suhu Real-time v1.0 โ");
Serial.println("โ BeebaneLabs - https://beebanelabs.pages.dev โ");
Serial.println("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
dht.begin();
setupWiFi();
setupMQTT();
hubungkanMQTT();
}
void loop() {
if (!mqtt.connected()) {
hubungkanMQTT();
}
mqtt.loop();
unsigned long sekarang = millis();
if (sekarang - lastKirim >= INTERVAL_KIRIM) {
lastKirim = sekarang;
// Baca sensor
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
// Validasi pembacaan
if (isnan(suhu) || isnan(kelembaban)) {
totalError++;
Serial.println("[ERROR] Pembacaan sensor gagal!");
return;
}
// Hitung heat index
float heatIndex = dht.computeHeatIndex(suhu, kelembaban, false);
// Tentukan level status
const char* level;
if (suhu >= SUHU_BAHAYA) {
level = "BAHAYA";
} else if (suhu >= SUHU_WASPADA) {
level = "WASPADA";
} else {
level = "AMAN";
}
// Format payload JSON
char payload[256];
snprintf(payload, sizeof(payload),
"{\"suhu\":%.1f,\"kelembaban\":%.1f,\"heat_index\":%.1f,"
"\"level\":\"%s\",\"wifi_rssi\":%d,\"uptime\":%lu,\"msg_count\":%d}",
suhu, kelembaban, heatIndex, level,
WiFi.RSSI(), sekarang / 1000, totalPengiriman + 1);
// Publish data
bool sukses = mqtt.publish(MQTT_TOPIC_DATA, payload);
if (suhu >= SUHU_WASPADA) {
// Kirim alert ke topik terpisah
char alertMsg[128];
snprintf(alertMsg, sizeof(alertMsg),
"{\"alert\":\"SUHU %s\",\"suhu\":%.1f,\"level\":\"%s\"}",
suhu >= SUHU_BAHAYA ? "BAHAYA" : "WASPADA",
suhu, level);
mqtt.publish(MQTT_TOPIC_ALERT, alertMsg);
// Kedipkan LED untuk alert
for (int i = 0; i < 3; i++) {
digitalWrite(LED_STATUS, LOW);
delay(200);
digitalWrite(LED_STATUS, HIGH);
delay(200);
}
}
if (sukses) {
totalPengiriman++;
Serial.printf("[%d] Suhu: %.1fยฐC | RH: %.1f%% | %s\n",
totalPengiriman, suhu, kelembaban, level);
} else {
totalError++;
Serial.println("[ERROR] Gagal mengirim data!");
}
if (modeDebug) {
Serial.print("[DEBUG] Payload: ");
Serial.println(payload);
}
}
}
๐ก Cara Pantau Data
Gunakan aplikasi MQTT Explorer (desktop) atau MQTT Dashboard (Android) untuk subscribe ke topik iothub/monitoring/suhu. Anda akan melihat data JSON berisi suhu, kelembaban, dan status yang diperbarui setiap 15 detik. Kirim perintah status atau debug_on ke topik iothub/monitoring/cmd untuk mengontrol ESP32 dari jarak jauh.
Memperluas Proyek
Setelah proyek dasar berjalan, Anda bisa mengembangkannya lebih lanjut:
Tambah Grafana: Gunakan Node-RED untuk menerima data MQTT dan simpan ke InfluxDB, lalu visualisasikan di Grafana
Multi-Sensor: Pasang DHT11 di beberapa ruangan, masing-masing dengan topik MQTT berbeda
Notifikasi Telegram: Kirim peringatan ke Telegram saat suhu melewati batas
OLED Display: Tambahkan layar OLED 0.96" I2C untuk menampilkan data langsung di perangkat
Deep Sleep: Gunakan mode deep sleep ESP32 untuk proyek bertenaga baterai
8. Troubleshooting Umum
Berikut adalah masalah yang paling sering dihadapi saat bekerja dengan ESP32, beserta solusinya:
ESP32 Tidak Terdeteksi di Port COM
โ ๏ธ Masalah Umum #1
Gejala: Tidak ada port COM yang muncul di Arduino IDE saat ESP32 dicolokkan.
Solusi:
Pastikan menggunakan kabel USB data (bukan kabel charge-only)
Instal driver CP2102 dari Silicon Labs atau CH340 dari situs resmi
Coba port USB yang berbeda atau kabel yang lain
Di Windows, cek Device Manager untuk melihat apakah driver terinstal dengan benar
Gagal Upload: "A fatal error occurred: Failed to connect to ESP32"
๐ด Masalah Umum #2
Gejala: Proses upload stuck di "Connecting..." lalu timeout.
Solusi:
Tahan tombol BOOT di board ESP32 saat upload dimulai
Lepaskan tombol BOOT setelah muncul pesan "Writing at 0x..."
Jika sering terjadi, tambahkan kapasitor 10ยตF antara EN dan GND
Pastikan upload speed di 115200 (bukan 921600)
WiFi Gagal Terhubung (Timeout)
โ ๏ธ Masalah Umum #3
Gejala: ESP32 stuck di "Menghubungkan ke WiFi..." terus-menerus.
Solusi:
Periksa SSID dan password (case-sensitive!)
Pastikan router berjalan di band 2.4 GHz (ESP32 tidak mendukung 5 GHz)
Coba dekatkan ESP32 ke router
Nonaktifkan sementara firewall atau MAC filtering di router
Panggil WiFi.disconnect() sebelum WiFi.begin()
Sensor DHT11 Membaca NaN / Error
โ ๏ธ Masalah Umum #4
Gejala: Nilai sensor selalu NaN atau tidak valid.
Solusi:
Pasang resistor pull-up 10kฮฉ antara pin DATA dan VCC