Rabu, 12 November 2025

Wi-Fi hotspot dengan captive portal

ESP32 yang dikonfigurasi sebagai Wi-Fi hotspot dengan captive portal bekerja dengan cara membuat jaringan lokal mandiri yang dapat diakses oleh perangkat lain. Ketika ESP32 diaktifkan dalam mode Access Point (AP), ia memancarkan sinyal Wi-Fi dengan nama SSID tertentu, misalnya "ESP32_Hotspot". Perangkat yang terhubung ke jaringan ini akan diarahkan ke halaman web lokal melalui mekanisme DNS spoofing, di mana semua permintaan domain dialihkan ke alamat IP ESP32 menggunakan library DNSServer. Web server yang berjalan di ESP32 kemudian menangani permintaan HTTP dan menampilkan halaman HTML yang telah diprogram, seperti halaman sambutan atau formulir input. Dengan cara ini, pengguna yang terhubung ke hotspot akan otomatis melihat halaman portal tanpa perlu mengetik alamat tertentu, mirip seperti sistem login Wi-Fi publik di kafe atau hotel.

Source code lengkap untuk ESP32 yang berfungsi sebagai Wi-Fi hotspot dengan captive portal yang mengarahkan pengguna ke halaman web lokal:

#include <WiFi.h>
#include <DNSServer.h>
#include <ESPAsyncWebServer.h>
#include <AsyncTCP.h>

const byte DNS_PORT = 53;
DNSServer dnsServer;
AsyncWebServer server(80);

// HTML halaman utama
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>ESP32 Captive Portal</title>
</head>
<body>
  <h1>Selamat Datang di Hotspot ESP32</h1>
  <p>Anda berhasil terhubung ke jaringan lokal.</p>
</body>
</html>
)rawliteral";

void setup() {
  Serial.begin(115200);

  // Setup Access Point
  WiFi.softAP("ESP32_Hotspot", "12345678");
  delay(100);
  Serial.println("Hotspot aktif: ESP32_Hotspot");

  // Setup DNS untuk redirect semua domain ke IP ESP32
  dnsServer.start(DNS_PORT, "*", WiFi.softAPIP());

  // Setup Web Server
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });

  // Redirect semua permintaan ke halaman utama
  server.onNotFound([](AsyncWebServerRequest *request){
    request->redirect("/");
  });

  server.begin();
}

void loop() {
  dnsServer.processNextRequest();
}
https://github.com/lacamera/ESPAsyncWebServer

Selasa, 11 November 2025

Pemrograman dan Proyek IoT dengan ESP32

🧭 Bagian 1: Pengenalan dan Dasar-Dasar

  1. Apa Itu ESP32?

    • Sejarah dan evolusi dari ESP8266

    • Keunggulan ESP32 dibanding mikrokontroler lain

  2. Spesifikasi Teknis ESP32

    • CPU, memori, konektivitas, GPIO

    • Modul populer: ESP32-WROOM, ESP32-CAM, dll

  3. Lingkungan Pengembangan

    • Instalasi Arduino IDE

    • Instalasi ESP-IDF (opsional untuk pengguna lanjutan)

    • Pemilihan board dan port

🔌 Bagian 2: Pemrograman Dasar

  1. Blink LED: Program Pertama

    • Penjelasan kode

    • Upload dan troubleshooting

  2. GPIO dan Sensor Digital

    • Membaca tombol, mengontrol LED

    • Sensor PIR, sensor cahaya

  3. Sensor Analog dan ADC

    • Membaca potensiometer, sensor suhu analog

  4. PWM dan Kontrol Aktuator

    • Kendali motor DC, buzzer, LED RGB

📡 Bagian 3: Konektivitas

  1. Wi-Fi dan Web Server

    • Menghubungkan ke Wi-Fi

    • Membuat web server lokal

  2. Bluetooth dan BLE

    • Perbedaan BLE dan Bluetooth klasik

    • Membuat BLE server dan client

  3. HTTP dan MQTT

    • Kirim data ke server (ThingSpeak, Firebase)

    • Komunikasi IoT dengan MQTT

🧠 Bagian 4: Proyek Praktis

  1. Stasiun Cuaca Pintar

    • Sensor DHT11/DHT22 + ESP32 + ThingSpeak

  2. Kontrol Lampu via Smartphone

    • BLE + relai + aplikasi Android

  3. Sistem Keamanan Rumah

    • Sensor gerak + kamera ESP32-CAM + notifikasi

  4. Data Logger ke MicroSD dan Cloud

    • Penyimpanan lokal dan sinkronisasi

🛠️ Bagian 5: Tips Lanjutan dan Troubleshooting

  1. Debugging dan Serial Monitor

    • Teknik membaca output dan error

  2. Manajemen Daya dan Sleep Mode

    • Deep sleep, light sleep, dan penghematan energi

  3. Integrasi dengan Platform IoT

    • Blynk, Home Assistant, Node-RED

📚 Lampiran

  • Referensi pustaka dan dokumentasi resmi

  • Daftar komponen dan toko rekomendasi

  • Template kode dan proyek siap pakai

Simple Wifi Server

 /*
 WiFi Web Server LED Blink

 A simple web server that lets you blink an LED via the web.
 This sketch will print the IP address of your WiFi Shield (once connected)
 to the Serial monitor. From there, you can open that address in a web browser
 to turn on and off the LED on pin 5.

 If the IP address of your shield is yourAddress:
 http://yourAddress/H turns the LED on
 http://yourAddress/L turns it off

 This example is written for a network using WPA2 encryption. For insecure
 WEP or WPA, change the Wifi.begin() call and use Wifi.setMinSecurity() accordingly.

 Circuit:
 * WiFi shield attached
 * LED attached to pin 5

 created for arduino 25 Nov 2012
 by Tom Igoe

ported for sparkfun esp32
31.01.2017 by Jan Hendrik Berlin

 */

#include <WiFi.h>

const char *ssid = "yourssid";
const char *password = "yourpasswd";

NetworkServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(5, OUTPUT);  // set the LED pin mode

  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();
}

void loop() {
  NetworkClient client = server.accept();  // listen for incoming clients

  if (client) {                     // if you get a client,
    Serial.println("New Client.");  // print a message out the serial port
    String currentLine = "";        // make a String to hold incoming data from the client
    while (client.connected()) {    // loop while the client's connected
      if (client.available()) {     // if there's bytes to read from the client,
        char c = client.read();     // read a byte, then
        Serial.write(c);            // print it out the serial monitor
        if (c == '\n') {            // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 5 on.<br>");
            client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 5 off.<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {  // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(5, HIGH);  // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(5, LOW);  // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

Board ESP32

 

Board ESP32 terdiri berbagai jenis:

Senin, 10 November 2025

Monitoring Suhu Ruangan Jarak Jauh

 

Studi kasus ini mendemonstrasikan penerapan ESP32 dalam solusi Internet of Things (IoT) yang fungsional, dirancang khusus untuk memantau kondisi lingkungan kritis secara real-time dan memberikan notifikasi instan.
1. Tantangan & Kebutuhan (Latar Belakang Masalah)
Permasalahan utama yang dihadapi adalah risiko overheating pada peralatan sensitif di dalam lemari server tertutup. Kerusakan perangkat keras akibat suhu berlebih adalah ancaman nyata. Kebutuhan spesifik meliputi:
  • Pemantauan Berkelanjutan: Membaca data suhu dan kelembapan secara otomatis dan berkala.
  • Akses Jarak Jauh: Melihat status ruangan dari mana saja melalui internet.
  • Respons Instan: Menerima notifikasi darurat secara otomatis di ponsel jika suhu melebihi ambang batas aman (target: > 30°C).
2. Solusi Proyek (Tujuan)
Tujuan proyek ini adalah merancang dan mengimplementasikan sistem otomatis menggunakan ESP32 yang berfungsi sebagai "penjaga digital" untuk lemari server, dengan kapabilitas utama:
  • Akuisisi data sensor.
  • Transmisi data melalui jaringan Wi-Fi.
  • Visualisasi data pada dashboard IoT.
  • Integrasi sistem peringatan dini melalui aplikasi perpesanan (Telegram).
3. Spesifikasi Teknis (Komponen yang Digunakan)
KomponenDeskripsi & Fungsi
ESP32 Dev BoardMikrokontroler inti yang memproses data dan mengelola koneksi Wi-Fi.
Sensor DHT22Sensor digital presisi untuk mengukur suhu (°C) dan kelembapan (%).
Modul PendukungBreadboard, kabel jumper, dan power supply (adaptor micro-USB) untuk prototipe.
API Telegram BotAntarmuka pemrograman aplikasi cloud yang memfasilitasi pengiriman notifikasi pesan.
Platform IoT (ThingSpeak)Layanan cloud gratis untuk menerima, menyimpan, dan menampilkan data sensor dalam bentuk grafik.
4. Metodologi Implementasi (Langkah Proyek)
Proyek ini dilaksanakan melalui tiga tahapan utama:
A. Perakitan Hardware & Sirkuit:
Sensor DHT22 dihubungkan ke salah satu pin GPIO ESP32. Penggunaan GPIO tunggal ini menyederhanakan perkabelan (hanya 3 pin yang digunakan: VCC, GND, dan Data).
B. Pengembangan Software (Arduino IDE):
  • Menggunakan library Wi-Fi dan DHT yang tersedia di Arduino IDE.
  • Skrip pemrograman fokus pada:
    • Menghubungkan ESP32 ke jaringan Wi-Fi lokal dengan kredensial SSID dan password yang benar.
    • Pengambilan sampel data sensor setiap 30 detik.
    • Mengirim data ke saluran (channel) ThingSpeak melalui permintaan HTTP GET.
C. Integrasi Sistem Peringatan (Telegram API):
  • Sebuah bot Telegram unik dibuat melalui @BotFather untuk mendapatkan token API.
  • Logika kondisional ditambahkan ke kode ESP32: JIKA suhu yang dibaca sensor > 30°C, MAKA ESP32 secara otomatis memicu permintaan HTTP POST ke API Telegram untuk mengirim pesan darurat.
5. Dampak dan Manfaat (Hasil Proyek)
Sistem yang dibangun berhasil memenuhi semua tujuan proyek. Manfaat utama yang diperoleh meliputi:
  • Efisiensi Biaya: Solusi ini jauh lebih murah dibandingkan sistem pemantauan industri yang siap pakai.
  • Ketenangan Pikiran: Pengguna dapat memantau kondisi lemari server dari jarak jauh melalui dashboard web ThingSpeak kapan saja.
  • Respons Cepat: Notifikasi instan Telegram memungkinkan tindakan korektif dilakukan segera setelah suhu kritis terdeteksi, mencegah kerugian finansial akibat kerusakan perangkat keras.
6. Wawasan Utama (Pelajaran dari Studi Kasus)
  • Akselerasi Prototyping: Fitur Wi-Fi terintegrasi pada ESP32 mempercepat pengembangan solusi IoT secara signifikan.
  • Interoperabilitas API: ESP32 berfungsi sebagai jembatan yang kuat antara dunia fisik (sensor) dan layanan cloud (Telegram, ThingSpeak), menunjukkan fleksibilitasnya dalam berinteraksi dengan API standar.
  • Solusi Praktis IoT: Studi kasus ini membuktikan bahwa proyek IoT yang kompleks dapat diimplementasikan dengan komponen off-the-shelf (siap pakai) yang terjangkau.

Penjelasan dan Alur Sistem

1. Fungsi Utama Sistem

Sistem ini berfungsi sebagai "penjaga digital" untuk memantau kondisi lingkungan kritis, khususnya suhu pada lemari server (atau ruangan tertutup lainnya), secara real-time dan dari jarak jauh. Tujuannya adalah mencegah kerusakan perangkat keras akibat overheating dengan menyediakan pemantauan berkelanjutan, visualisasi data, dan respons instan berupa notifikasi darurat.

2. Komponen Kunci

KomponenPeran dalam Sistem
ESP32 Dev BoardBertindak sebagai otak sistem. Membaca data sensor, menjalankan logika kondisional, dan mengelola koneksi Wi-Fi.
Sensor DHT22Input data fisik. Mengukur suhu (°C) dan kelembapan (%) dengan presisi tinggi.
Platform IoT (ThingSpeak)Layanan Cloud & Visualisasi. Menerima data dari ESP32, menyimpannya, dan menampilkannya dalam bentuk grafik yang dapat diakses melalui browser.
API Telegram BotSistem Peringatan. Digunakan untuk memfasilitasi pengiriman pesan darurat (notifikasi) secara otomatis ke ponsel pengguna.
 

3. Alur Kerja Sistem (Metodologi Implementasi)

Sistem ini bekerja melalui siklus tiga tahap yang terus berulang, didukung oleh koneksi internet:

TahapProsesDetail Implementasi
1. Akuisisi Data (Sisi Hardware)ESP32 membaca data lingkungan.Sensor DHT22 dihubungkan ke salah satu pin GPIO ESP32. Skrip Arduino diprogram untuk mengambil sampel data suhu dan kelembapan dari sensor, misalnya, setiap 30 detik.
2. Transmisi & Visualisasi (Cloud)ESP32 mengirim data ke internet.ESP32 terhubung ke jaringan Wi-Fi lokal. Skrip memformat data dan mengirimkannya ke saluran ThingSpeak melalui permintaan HTTP GET (seperti mengirim URL). ThingSpeak menerima data, menyimpannya, dan memperbarui grafik visualisasi.
3. Logika Kondisional & Peringatan (Alert)ESP32 mengambil keputusan dan bertindak cepat.Logika JIKA/MAKA ditanamkan dalam kode: JIKA suhu yang dibaca melebihi ambang batas aman (misalnya, > 30°C), MAKA ESP32 secara otomatis memicu permintaan HTTP POST ke API Telegram Bot untuk mengirim pesan darurat ke ponsel pengguna.
 

 

 

Referensi

Komunikasi Bluetooth dengan ESP32

ESP32 adalah pilihan mikrokontroler yang populer untuk proyek

Ada dua mode Bluetooth utama yang dapat digunakan pada ESP32, masing-masing memiliki fungsi dan skenario penggunaan yang berbeda: Bluetooth Classic dan Bluetooth Low Energy (BLE).


1. Bluetooth Classic (BT)

Bluetooth Classic, juga dikenal sebagai Bluetooth Standard atau BR/EDR, cocok untuk transfer data yang stabil dan berkecepatan tinggi, ideal untuk streaming data besar atau koneksi data yang terus-menerus.

⚙️ Karakteristik Utama

  • Kecepatan Data: Lebih cepat (hingga 2-3 Mbps).

  • Konsumsi Daya: Lebih tinggi, tidak ideal untuk perangkat bertenaga baterai yang kecil.

  • Koneksi: Menggunakan profil spesifik seperti SPP (Serial Port Profile) untuk komunikasi serial nirkabel.

💻 Contoh Penggunaan (Profil SPP)

Dalam mode ini, ESP32 bertindak seperti kabel serial nirkabel, memungkinkan komunikasi dua arah dengan perangkat lain (misalnya, aplikasi kontrol di ponsel).

FungsiDeskripsi
ServerESP32 menunggu koneksi dari klien (misalnya, ponsel).
KlienESP32 mencari dan terhubung ke perangkat Bluetooth lain.

📖 Cara Kerja Skrip Ini

  1. Inklusi Library: Memanggil semua library yang diperlukan untuk fungsi BLE.

  2. UUID: SERVICE_UUID dan CHARACTERISTIC_UUID adalah alamat unik (ID) data yang digunakan oleh klien untuk menemukan service dan data yang ditawarkan oleh ESP32.

  3. Setup (Inisialisasi):

    • ESP32 menginisialisasi dirinya sebagai perangkat BLE.

    • Membuat BLE Server yang dapat menerima koneksi.

    • Membuat Service dan Characteristic di bawah server tersebut, mendefinisikan bahwa Characteristic tersebut bisa dibaca, ditulis, dan memberi notifikasi (notify).

    • Mulai Advertising (beriklan) sehingga smartphone atau perangkat BLE lain dapat melihat ESP32.

  4. Loop (Pengiriman Data):

    • Setiap 2 detik, jika ada klien yang terhubung (deviceConnected == true), nilai value (counter) diubah menjadi string.

    • pCharacteristic->setValue(txString); dan pCharacteristic->notify(); digunakan untuk memperbarui nilai dan mengirimkan pembaruan (notification) ke klien secara real-time.

💡 Untuk Menguji Kode Ini:

  1. Pastikan Anda telah menginstal board ESP32 di Arduino IDE.

  2. Upload skrip ke ESP32 Anda.

  3. Gunakan aplikasi scanner BLE di smartphone Anda (seperti nRF Connect atau BLE Scanner) untuk menemukan perangkat bernama "ESP32_BLE_Counter" dan membaca Characteristic di dalamnya.

 

📚 Referensi

Untuk memulai pemrograman komunikasi Bluetooth pada ESP32, Anda akan membutuhkan sumber daya berikut:

  1. Dokumentasi Resmi ESP-IDF: Dokumentasi framework pengembangan Espressif Systems yang menyediakan detail mendalam tentang implementasi Bluetooth Classic dan BLE.

  2. Arduino Core for the ESP32: Repositori GitHub yang menyediakan library seperti BluetoothSerial.h dan BLEDevice.h.

  3. Arduino IDE Software: Lingkungan pengembangan untuk menulis dan mengunggah kode ke ESP32.

Internet Radio ESP32 Tanpa Amplifier, DAC, dan Display

Pendahuluan

ESP32 adalah mikrokontroler pilihan terbaik untuk proyek Internet of Things (IoT) berbasis audio, berkat chip Wi-Fi dan kemampuan pemrosesan suara yang memadai. Proyek Internet Radio ini memungkinkan ESP32 terhubung ke stasiun radio online dan melakukan streaming audio.

Tutorial ini berfokus pada pendekatan minimalis dan hemat biaya, memungkinkan Anda membangun radio yang berfungsi hanya dengan board ESP32 dan speaker sederhana, tanpa perlu Digital-to-Analog 


1. Persiapan dan Komponen

Proyek ini menggunakan library audio yang memanfaatkan kemampuan Internal DAC atau I2S (Inter-IC Sound) ESP32, sehingga meminimalkan jumlah komponen.

1.1. Komponen Hardware

KomponenKeteranganFungsi Utama
ESP32 Dev ModuleTipe apa pun (DevKit V1, NodeMCU-32S, dll.).Otak pemrosesan dan koneksi Wi-Fi.
Kartu MicroSD & AdapterDiperlukan untuk menyimpan file konfigurasi stasiun radio.Menyimpan data konfigurasi.
Speaker atau HeadphoneSpeaker kecil 4-8 Ohm atau headphone biasa.Output suara.
Kabel Jumper & BreadboardUntuk menghubungkan speaker ke pin ESP32.Koneksi sirkuit.

#include <WiFi.h>
#include "Audio.h" // Asumsi menggunakan library 'Audio' yang umum
#include "SD.h"

// --- KONFIGURASI WIFI & SD CARD ---
const char* ssid = "NAMA_WIFI_ANDA";
const char* password = "PASSWORD_WIFI_ANDA";
// Pin SD Card (dapat bervariasi)
#define SD_CS_PIN 5 

// Objek Audio dan pin output I2S/DAC
Audio audio; 

void setup() {
  Serial.begin(115200);
  
  // 1. Inisialisasi Wi-Fi
  Serial.print("Menghubungkan ke Wi-Fi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nTerhubung! IP: " + WiFi.localIP().toString());

  // 2. Inisialisasi SD Card
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("Gagal Inisialisasi Kartu SD!");
    // Tambahkan penanganan error
    return;
  }
  Serial.println("Kartu SD terinisialisasi.");

  // 3. Konfigurasi Audio
  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); // Ganti dengan pin I2S yang benar
  audio.setVolume(5); // Atur volume (0-21)
  
  // 4. Baca URL dari SD Card dan Mulai Streaming
  // Misalnya, membaca file 'radio.txt'
  File radioFile = SD.open("/radio.txt");
  if (radioFile) {
    String url = radioFile.readStringUntil('\n');
    url.trim();
    Serial.println("Streaming dari URL: " + url);
    audio.connecttohost(url.c_str());
    radioFile.close();
  } else {
    Serial.println("File radio.txt tidak ditemukan di SD Card.");
  }
}

void loop() {
  audio.loop(); // Fungsi wajib untuk menjaga buffer audio tetap berjalan
}

// Tambahkan handler callback audio (penting untuk library audio)
void audio_info(const char *info){
  Serial.print("INFO: "); Serial.println(info);
}
// ... [Tambahkan callback audio lainnya]

 

4. Troubleshooting (Pemecahan Masalah)

Proyek Internet Radio sering mengalami masalah terkait jaringan dan buffer.

MasalahKemungkinan PenyebabSolusi
Suara Patah-patah/TerputusBuffer audio tidak terisi tepat waktu (latensi Wi-Fi buruk).Periksa kualitas sinyal Wi-Fi. Tambahkan lebih banyak delay atau atur ukuran buffer di library audio.
Tidak ada suara sama sekaliPengkabelan pin I2S/Speaker salah, atau library tidak dikonfigurasi dengan benar.Cek kembali pinout audio.setPinout(...) dengan pin yang Anda gunakan. Pastikan volume diatur di atas 0.
Gagal inisialisasi SD CardPin CS salah, atau kartu SD diformat tidak benar.Pastikan SD_CS_PIN sudah benar. Gunakan kartu SD dengan format FAT32.
Error: Gagal Terhubung ke HostURL streaming stasiun radio mati atau salah.Verifikasi URL streaming di browser Anda. Coba URL streaming yang berbeda dan pastikan formatnya (misalnya, .mp3 atau .aac).

 

Kesimpulan

Proyek Internet Radio adalah cara yang sangat efektif untuk mendemonstrasikan kekuatan ESP32 sebagai perangkat IoT dual-core yang mampu menangani tugas jaringan yang kompleks (Wi-Fi, HTTP request) sekaligus memproses output audio real-time. Dengan memanfaatkan fitur internal ESP32, Anda dapat menciptakan solusi audio yang fungsional dan minimalis.

 

Referensi

Wi-Fi hotspot dengan captive portal