📡 MEMBUAT WIFI SCANNER PORTABEL
dengan NodeMCU ESP8266 dan Layar OLED 0.96"
📑 DAFTAR ISI
📡 Apa Itu WiFi Scanner?
WiFi scanner adalah alat atau perangkat lunak yang digunakan untuk mendeteksi dan menampilkan semua jaringan WiFi yang tersedia di sekitar suatu lokasi. Alat ini menampilkan informasi penting seperti SSID (nama jaringan), BSSID (MAC address access point), RSSI (kekuatan sinyal dalam dBm), channel yang digunakan, serta jenis enkripsi (WPA2, WPA3, WEP, atau Open).
Dalam proyek kali ini, kita akan membuat WiFi scanner portabel berukuran saku yang dapat Anda bawa ke mana saja. Berbeda dengan scanner di smartphone yang terbatas, alat buatan sendiri ini memberikan Anda kendali penuh atas data yang ditampilkan dan dapat dikustomisasi sesuai kebutuhan.
🎯 Mengapa Anda Membutuhkan Alat Ini?
Berikut adalah 7 skenario nyata di mana WiFi scanner portabel sangat berguna:
- 🔍 Survei Lokasi Pemasangan WiFi - Sebelum memasang access point di rumah atau kantor, Anda bisa scan dulu area mana yang sinyalnya paling kuat.
- 🏢 Audit Keamanan Jaringan - Deteksi jaringan terbuka (tanpa password) yang berpotensi disalahgunakan.
- 📊 Analisis Interferensi Channel - Lihat channel apa yang paling padat, lalu pilih channel yang lebih sepi untuk router Anda.
- 🎓 Belajar IoT & Pemrograman ESP8266 - Proyek sempurna untuk pemula karena langsung ada hasil visualnya.
- 🛠 Troubleshooting WiFi - Cek apakah tetangga menggunakan channel yang sama dengan router Anda.
- 📱 Membandingkan Kualitas ISP - Scan di berbagai lokasi untuk melihat provider mana yang paling banyak tersedia.
- 🚗 WarDriving (Pemetaan WiFi) - Buat peta sebaran WiFi di kota Anda untuk proyek komunitas.
🛠 Alat dan Bahan (Lengkap dengan Estimasi Biaya)
Semua komponen mudah didapatkan di Tokopedia, Shopee, atau toko elektronik lokal. Total biaya sekitar Rp 150.000 - Rp 250.000.
| Komponen | Spesifikasi | Fungsi | Harga (Rp) |
|---|---|---|---|
| NodeMCU ESP8266 | ESP-12E, CP2102/CH340 | Otak alat + WiFi | 60.000 - 85.000 |
| Layar OLED 0.96" | 128x64 pixel, I2C, SSD1306 | Menampilkan hasil scan | 40.000 - 65.000 |
| Kabel Jumper F-F | 20cm, 4-5 buah | Koneksi | 5.000 - 10.000 |
| Power Bank (opsional) | 5V 1A output | Power portabel | 50.000 - 100.000 |
| Kabel Micro USB | Untuk data & power | Upload program | 15.000 - 30.000 |
| Project Box (opsional) | 6x9 cm | Tempat/casing | 10.000 - 25.000 |
🔌 Skema Koneksi (Wiring Diagram)
Layar OLED 0.96" yang menggunakan protokol I2C hanya membutuhkan 4 kabel. Berikut adalah tabel koneksi yang harus Anda buat:
| Layar OLED | NodeMCU ESP8266 | GPIO | Keterangan |
|---|---|---|---|
| VCC | 3.3V | - | Tegangan 3.3 Volt (JANGAN 5V!) |
| GND | GND | - | Ground / Tanah |
| SCL | D1 | GPIO5 | Clock I2C |
| SDA | D2 | GPIO4 | Data I2C |
⚙️ Persiapan Arduino IDE
Sebelum memprogram, Anda perlu menambahkan board ESP8266 ke Arduino IDE. Berikut langkah-langkahnya:
Langkah 1: Tambahkan URL Board Manager
Buka Arduino IDE → File → Preferences. Pada kolom "Additional Boards Manager URLs", tambahkan URL berikut:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
Langkah 2: Instal Board ESP8266
Klik Tools → Board → Boards Manager. Cari "esp8266", lalu instal "esp8266 by ESP8266 Community".
Langkah 3: Pilih Board NodeMCU
Setelah instalasi selesai, pilih board: Tools → Board → ESP8266 Boards → NodeMCU 1.0 (ESP-12E Module)
Langkah 4: Pilih Port COM
Hubungkan NodeMCU ke komputer, lalu pilih port yang sesuai di Tools → Port (misal COM3, COM4, atau /dev/cu.usbserial-xxx).
📚 Instalasi Library yang Diperlukan
Buka Sketch → Include Library → Manage Libraries, lalu cari dan instal:
| Library | Nama Pencarian | Fungsi |
|---|---|---|
| Adafruit GFX | "Adafruit GFX Library" | Fungsi grafis dasar (lingkaran, garis, persegi) |
| Adafruit SSD1306 | "Adafruit SSD1306" | Driver khusus untuk layar OLED SSD1306 |
| ESP8266WiFi | (Built-in, sudah ada) | Fungsi koneksi dan scan WiFi |
Catatan: Library Adafruit SSD1306 mungkin meminta instalasi dependensi. Setujui semua permintaan instalasi tambahan.
💻 Kode Program LENGKAP (Copy-Paste)
Berikut adalah kode program lengkap yang siap diupload ke NodeMCU. Kode ini berukuran sekitar 250 baris dan sudah mencakup semua fitur yang dijelaskan.
/*
================================================================
PROJECT: WiFi Scanner Portabel dengan NodeMCU ESP8266 + OLED
AUTHOR: Tutorial IoT
VERSION: 2.0 (Lengkap dengan fitur sorting, icon signal, dll)
================================================================
Fitur:
- Scan otomatis setiap 10 detik
- Menampilkan SSID, RSSI (dBm), dan jenis keamanan
- Icon bar sinyal (1-4 bar)
- Icon gembok untuk jaringan terenkripsi
- Sorting dari sinyal terkuat ke terlemah
- Pagination (3 jaringan per halaman)
- Tampilan jam digital di bagian atas (opsional dengan NTP)
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
// ========== KONFIGURASI OLED ==========
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C // Coba 0x3D jika tidak muncul
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ========== VARIABEL GLOBAL ==========
unsigned long lastScan = 0;
int scanInterval = 10000; // Scan setiap 10 detik (10000 ms)
int currentPage = 0;
int totalNetworks = 0;
int networksPerPage = 3; // Jumlah jaringan per halaman
// Array penyimpanan data (maks 20 jaringan)
String networkNames[20];
int networkRSSI[20];
int networkEncryption[20];
String networkBSSID[20];
int networkChannel[20];
// ========== FUNGSI SCAN JARINGAN ==========
void scanWiFi() {
// Tampilkan pesan scanning
display.clearDisplay();
display.setTextSize(1);
display.setCursor(25, 28);
display.println("Scanning WiFi...");
display.display();
// Lakukan scan (mode aktif)
int n = WiFi.scanNetworks();
if (n == 0) {
display.clearDisplay();
display.setCursor(20, 28);
display.println("No networks found");
display.display();
delay(2000);
return;
}
// Batasi maksimal 20 jaringan
totalNetworks = min(n, 20);
// Simpan hasil scan ke array
for (int i = 0; i < totalNetworks; i++) {
networkNames[i] = WiFi.SSID(i);
if (networkNames[i] == "") networkNames[i] = "(Hidden Network)";
networkRSSI[i] = WiFi.RSSI(i);
networkEncryption[i] = WiFi.encryptionType(i);
networkBSSID[i] = WiFi.BSSIDstr(i);
networkChannel[i] = WiFi.channel(i);
}
// ===== SORTING: Urutkan dari sinyal TERKUAT ke TERLEMAH =====
for (int i = 0; i < totalNetworks - 1; i++) {
for (int j = i + 1; j < totalNetworks; j++) {
if (networkRSSI[j] > networkRSSI[i]) {
// Tukar SSID
String tempName = networkNames[i];
networkNames[i] = networkNames[j];
networkNames[j] = tempName;
// Tukar RSSI
int tempRSSI = networkRSSI[i];
networkRSSI[i] = networkRSSI[j];
networkRSSI[j] = tempRSSI;
// Tukar enkripsi
int tempEnc = networkEncryption[i];
networkEncryption[i] = networkEncryption[j];
networkEncryption[j] = tempEnc;
// Tukar BSSID
String tempBSSID = networkBSSID[i];
networkBSSID[i] = networkBSSID[j];
networkBSSID[j] = tempBSSID;
// Tukar channel
int tempCh = networkChannel[i];
networkChannel[i] = networkChannel[j];
networkChannel[j] = tempCh;
}
}
}
// Reset ke halaman pertama
currentPage = 0;
// Hapus hasil scan dari memory (hemat RAM)
WiFi.scanDelete();
}
// ========== FUNGSI IKON KEKUATAN SINYAL ==========
void drawSignalIcon(int x, int y, int rssi) {
int bars = 0;
// Konversi RSSI ke jumlah bar (1-4)
if (rssi > -50) bars = 4; // Excellent
else if (rssi > -60) bars = 3; // Good
else if (rssi > -70) bars = 2; // Fair
else if (rssi > -80) bars = 1; // Weak
else bars = 0; // Very Weak
// Gambar bar sinyal
for (int i = 0; i < 4; i++) {
int barHeight = (i + 1) * 2;
int barX = x + (i * 3);
int barY = y + 8 - barHeight;
if (i < bars) {
display.fillRect(barX, barY, 2, barHeight, SSD1306_WHITE);
} else {
display.drawRect(barX, barY, 2, barHeight, SSD1306_WHITE);
}
}
}
// ========== FUNGSI IKON KEAMANAN ==========
void drawSecurityIcon(int x, int y, int encryptionType) {
switch(encryptionType) {
case ENC_TYPE_TKIP: // WPA
case ENC_TYPE_CCMP: // WPA2
case ENC_TYPE_AUTO: // WPA/WPA2
// Gembok TERTUTUP (terenkripsi)
display.drawRect(x, y + 2, 5, 5, SSD1306_WHITE);
display.fillRect(x + 1, y + 1, 3, 2, SSD1306_BLACK);
display.fillRect(x + 2, y + 3, 1, 2, SSD1306_WHITE);
break;
case ENC_TYPE_WEP: // WEP (lama, tidak aman)
display.drawRect(x, y + 2, 5, 5, SSD1306_WHITE);
display.drawLine(x + 1, y + 1, x + 3, y + 3, SSD1306_WHITE);
break;
default: // OPEN (tanpa password)
display.drawRect(x, y + 2, 5, 5, SSD1306_WHITE);
display.drawLine(x + 2, y + 1, x + 2, y + 3, SSD1306_WHITE);
break;
}
}
// ========== FUNGSI MENAMPILKAN HASIL SCAN ==========
void displayScanResults() {
display.clearDisplay();
// ===== HEADER =====
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("WiFi Scanner v2.0");
display.drawLine(0, 9, 128, 9, SSD1306_WHITE);
// ===== ISI (3 jaringan per halaman) =====
int startIdx = currentPage * networksPerPage;
int endIdx = min(startIdx + networksPerPage, totalNetworks);
for (int i = startIdx; i < endIdx; i++) {
int yPos = 12 + ((i - startIdx) * 16);
// Icon sinyal
drawSignalIcon(5, yPos + 2, networkRSSI[i]);
// Nama SSID (potong jika terlalu panjang)
String ssid = networkNames[i];
if (ssid.length() > 12) {
ssid = ssid.substring(0, 10) + "..";
}
display.setCursor(18, yPos);
display.print(ssid);
// Icon keamanan
drawSecurityIcon(110, yPos + 2, networkEncryption[i]);
// Nilai RSSI (dBm)
display.setCursor(18, yPos + 8);
display.setTextSize(0.8);
display.print(String(networkRSSI[i]) + " dBm");
display.setTextSize(1);
}
// ===== FOOTER (info halaman) =====
if (totalNetworks > 0) {
display.setCursor(0, 56);
display.print("Page ");
display.print(currentPage + 1);
display.print("/");
int totalPages = (totalNetworks + networksPerPage - 1) / networksPerPage;
display.print(totalPages);
display.print(" ");
display.print(totalNetworks);
display.print(" nets");
// Indikator scan berikutnya
int remaining = (scanInterval - (millis() - lastScan)) / 1000;
if (remaining < 0) remaining = 0;
display.setCursor(85, 56);
display.print("Next:");
display.print(remaining);
display.print("s");
}
display.display();
}
// ========== SPLASH SCREEN AWAL ==========
void showSplashScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(15, 12);
display.println("WiFi");
display.setCursor(10, 32);
display.println("Scanner");
display.setTextSize(1);
display.setCursor(18, 52);
display.println("NodeMCU + OLED");
display.display();
delay(2500);
}
// ========== SETUP ==========
void setup() {
Serial.begin(115200);
Serial.println("\nWiFi Scanner Tool Starting...");
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
Serial.println("OLED gagal diinisialisasi! Cek koneksi.");
for(;;); // Hentikan program jika OLED tidak terdeteksi
}
display.clearDisplay();
showSplashScreen();
// Set WiFi ke mode station (bukan access point)
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("NodeMCU siap melakukan scan WiFi");
// Scan pertama kali
scanWiFi();
lastScan = millis();
}
// ========== LOOP UTAMA ==========
void loop() {
unsigned long now = millis();
// Scan ulang setiap interval
if (now - lastScan > scanInterval) {
scanWiFi();
lastScan = now;
}
// Tampilkan hasil
if (totalNetworks > 0) {
displayScanResults();
} else {
display.clearDisplay();
display.setCursor(15, 28);
display.println("No WiFi found");
display.display();
}
// ===== NAVIGASI TOMBOL (Opsional) =====
// Jika Anda menambahkan tombol fisik di pin D3 dan D4,
// uncomment kode di bawah ini:
/*
pinMode(0, INPUT_PULLUP); // D3 untuk NEXT
pinMode(2, INPUT_PULLUP); // D4 untuk PREV
if (digitalRead(0) == LOW) {
delay(200);
int totalPages = (totalNetworks + networksPerPage - 1) / networksPerPage;
currentPage = (currentPage + 1) % totalPages;
}
if (digitalRead(2) == LOW) {
delay(200);
int totalPages = (totalNetworks + networksPerPage - 1) / networksPerPage;
currentPage = (currentPage - 1 + totalPages) % totalPages;
}
*/
delay(500); // Refresh rate 0.5 detik
}
📖 Penjelasan Kode (DETAIL Setiap Bagian)
Agar Anda bisa memodifikasi dan memahami program, berikut penjelasan mendetail setiap fungsi:
1. Bagian Header dan Library
#include <Wire.h> : Library untuk komunikasi I2C antara NodeMCU dan OLED.
#include <Adafruit_GFX.h> : Library grafis yang menyediakan fungsi menggambar seperti drawCircle(), drawLine(), fillRect().
#include <Adafruit_SSD1306.h> : Driver spesifik untuk layar OLED SSD1306.
#include <ESP8266WiFi.h> : Library bawaan ESP8266 untuk semua fungsi WiFi, termasuk scan jaringan.
2. Konfigurasi Layar OLED
#define SCREEN_WIDTH 128 dan SCREEN_HEIGHT 64 : Resolusi layar OLED (umum untuk model 0.96 inch).
#define OLED_ADDRESS 0x3C : Alamat I2C default layar OLED. Jika tidak merespon, coba ganti ke 0x3D.
3. Variabel Global
scanInterval = 10000 : Interval scan ulang dalam milidetik (10 detik).
networksPerPage = 3 : Jumlah jaringan yang ditampilkan per halaman (karena tinggi layar terbatas).
Array networkNames[20], networkRSSI[20], dll : Menyimpan data hingga 20 jaringan.
4. Fungsi scanWiFi()
Fungsi ini adalah jantung dari program. Cara kerjanya:
- WiFi.scanNetworks() - Melakukan scan sinkronus, mengembalikan jumlah jaringan ditemukan.
- Hasil scan disimpan ke array menggunakan
WiFi.SSID(i),WiFi.RSSI(i), dll. - Jaringan tersembunyi (SSID kosong) diberi label "(Hidden Network)".
- Algoritma Bubble Sort - Mengurutkan jaringan dari RSSI tertinggi (sinyal terkuat) ke terendah.
- WiFi.scanDelete() - Membersihkan memory agar tidak bocor (memory leak).
5. Fungsi drawSignalIcon()
Menggambar bar sinyal (1-4 bar) berdasarkan nilai RSSI:
- RSSI > -50 dBm → 4 bar (Excellent)
- RSSI -50 s/d -60 dBm → 3 bar (Good)
- RSSI -60 s/d -70 dBm → 2 bar (Fair)
- RSSI -70 s/d -80 dBm → 1 bar (Weak)
- RSSI < -80 dBm → 0 bar (Very Weak)
6. Fungsi drawSecurityIcon()
Menggambar ikon gembok untuk menunjukkan jenis keamanan:
- Gembok Tertutup → WPA/WPA2 (aman)
- Gembok dengan garis miring → WEP (lama, kurang aman)
- Gembok Terbuka → Tanpa password (Open)
7. Fungsi displayScanResults()
Menampilkan hasil scan ke layar OLED dengan format:
- Header "WiFi Scanner v2.0" dan garis pemisah
- 3 jaringan per halaman (sesuai
networksPerPage) - Footer: nomor halaman, total jaringan, dan countdown scan berikutnya
8. Fungsi loop()
Loop utama yang berjalan terus:
- Mengecek apakah sudah waktunya scan ulang (
millis() - lastScan > scanInterval) - Memanggil
displayScanResults()untuk memperbarui tampilan - Delay 500ms untuk menghemat resource (tidak perlu refresh terlalu cepat)
📱 Hasil dan Tampilan
Setelah program berhasil diupload, layar OLED akan menampilkan:
WiFi Scanner v2.0
────────────────
▂▃▄▅ HomeWiFi 🔒
-45 dBm
▂▃▄ Indihome_2G 🔒
-58 dBm
▂▃ WiFi Publik 🔓
-72 dBm
────────────────
Page 1/3 8 nets Next:5s
Informasi yang ditampilkan untuk setiap jaringan:
- Ikon bar : Kekuatan sinyal secara visual
- SSID : Nama jaringan (dipotong jika >12 karakter)
- Ikon gembok : Jenis keamanan
- Nilai dBm : Kekuatan sinyal numerik (semakin mendekati 0, semakin kuat)
🐛 Troubleshooting (10+ Solusi Masalah)
Masalah 1: Layar OLED Tidak Menampilkan Apa-apa
Solusi:
1. Periksa koneksi VCC ke 3.3V (BUKAN 5V!)
2. Periksa koneksi SCL ke D1, SDA ke D2
3. Coba ganti alamat I2C dari 0x3C menjadi 0x3D di kode
4. Gunakan sketch scanner I2C untuk mendeteksi alamat yang benar
Masalah 2: Gagal Upload ke NodeMCU
Solusi:
1. Tekan dan tahan tombol FLASH pada NodeMCU saat proses "Connecting..."
2. Lepaskan FLASH setelah tulisan "Uploading..." muncul
3. Coba ganti kabel USB (pastikan bisa transfer data, bukan hanya charging)
4. Instal driver CH340/CP2102 jika port COM tidak muncul
Masalah 3: Tidak Ada Jaringan yang Terdeteksi
Solusi:
1. Pastikan antena NodeMCU tidak tertutup atau terhalang
2. Coba di area yang banyak WiFi (mall, kantor, perumahan)
3. Periksa apakah WiFi module tidak dalam mode flight/power save
4. Reset NodeMCU dan coba lagi
Masalah 4: Tampilan Berkedip atau Rusak
Solusi:
1. Kurangi nilai delay di loop() menjadi 100ms atau 50ms
2. Pastikan power supply stabil (gunakan power bank berkualitas)
3. Periksa koneksi ground (GND) antara OLED dan NodeMCU
Masalah 5: Kompilasi Error "Adafruit_SSD1306.h not found"
Solusi:
1. Buka Library Manager (Sketch → Include Library → Manage Libraries)
2. Cari "Adafruit SSD1306" dan instal
3. Instal juga "Adafruit GFX Library"
4. Restart Arduino IDE
Masalah 6: NodeMCU Panas / Overheat
Solusi:
1. Pastikan tidak ada korsleting antar pin
2. Jangan menyambungkan VCC OLED ke 5V (gunakan 3.3V)
3. Kurangi frekuensi scan (perpanjang scanInterval menjadi 30000)
🚀 10 Ide Pengembangan Lebih Lanjut
Setelah berhasil membuat WiFi Scanner dasar, Anda bisa mengembangkannya dengan fitur-fitur berikut:
- 🔘 Tombol Navigasi Fisik - Tambahkan 2 tombol (NEXT/PREV) di pin D3 dan D4 untuk scroll halaman manual.
- 💾 Penyimpanan Data - Gunakan EEPROM atau kartu SD untuk merekam riwayat scan.
- 📊 Mode Grafik - Tampilkan grafik kekuatan sinyal dalam bentuk chart batang.
- 🔍 Filter SSID - Filter hanya menampilkan jaringan dengan nama tertentu.
- 🔊 Buzzer Indikator - Bunyi saat menemukan jaringan target tertentu.
- 📱 Bluetooth Serial - Kirim data scan ke smartphone via Bluetooth.
- 🌐 Web Server - Buat akses point sendiri untuk melihat hasil scan via browser.
- 🔋 Battery Monitor - Tampilkan level baterai jika menggunakan power bank.
- 📈 Export ke CSV - Simpan data dalam format CSV untuk analisis di Excel.
- 🗺 GPS Integration - Tambahkan module GPS untuk wardriving (pemetaan lokasi).
❓ FAQ (Pertanyaan yang Sering Diajukan)
Q: Apakah alat ini bisa digunakan untuk "hack" WiFi?
A: TIDAK. Alat ini hanya untuk scan dan menampilkan jaringan, BUKAN untuk membobol password. WiFi scanner hanya mendeteksi keberadaan jaringan, bukan menembus keamanannya.
Q: Berapa jarak maksimal deteksi?
A: Tergantung kondisi lingkungan. Di ruang terbuka bisa mencapai 50-100 meter. Di dalam ruangan dengan banyak tembok, sekitar 10-30 meter.
Q: Apakah bisa mendeteksi jaringan 5GHz?
A: NodeMCU ESP8266 hanya mendukung frekuensi 2.4 GHz. Untuk 5GHz, gunakan board ESP32.
Q: Berapa lama baterai bertahan?
A: Dengan power bank 10.000 mAh, alat ini bisa bertahan 12-24 jam non-stop.
Q: Apakah bisa menampilkan channel yang digunakan?
A: Bisa! Tambahkan WiFi.channel(i) pada kode untuk menampilkan channel setiap jaringan.
📦 Kesimpulan
Selamat! Anda telah berhasil membuat WiFi Scanner portabel menggunakan NodeMCU ESP8266 dan layar OLED 0.96". Alat ini tidak hanya berguna untuk survei jaringan, tetapi juga merupakan proyek yang sempurna untuk belajar pemrograman ESP8266, antarmuka grafis dengan OLED, dan pemrosesan data scan WiFi.
Dengan memahami kode di atas, Anda sekarang memiliki fondasi untuk mengembangkan berbagai proyek IoT lainnya seperti pemantau kualitas udara, stasiun cuaca, atau smart home controller. Kunci utamanya adalah memahami cara kerja library ESP8266WiFi.h dan Adafruit_GFX.h.

Tidak ada komentar:
Posting Komentar