// Kitaplık Yöneticisi'nden kurulacak:
// "LiquidCrystal I2C"
// Kart: "ESP32 Dev Module"
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ESP32'nin I2C pinleri
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// Her ağ ekranda bu kadar kalır (ms)
const unsigned long SHOW_EACH = 3000;
// En çok bu kadar ağ sıralanır
const int MAX_NETWORKS = 40;
// Adını yayınlamayan ağ (LCD'de ğ yok)
const char* HIDDEN = "(gizli ag)";
// I2C adresi çoğunda 0x27, bazısında 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Bulunan ağlar, güçlüden zayıfa
int order[MAX_NETWORKS];
int found = 0;
// Sıradaki gösterilecek ağ
int next = 0;
unsigned long shownAt = 0;
// Sinyal gücü (dBm) kaç çizgi eder: 0-4
int bars(int rssi) {
if (rssi >= -55) return 4;
if (rssi >= -67) return 3;
if (rssi >= -75) return 2;
if (rssi >= -85) return 1;
return 0;
}
// Şifreleme türünün kısa adı
const char* security(wifi_auth_mode_t mode) {
switch (mode) {
case WIFI_AUTH_OPEN: return "Açık";
case WIFI_AUTH_WEP: return "WEP";
case WIFI_AUTH_WPA_PSK: return "WPA";
case WIFI_AUTH_WPA2_PSK: return "WPA2";
case WIFI_AUTH_WPA_WPA2_PSK: return "WPA/WPA2";
case WIFI_AUTH_WPA3_PSK: return "WPA3";
case WIFI_AUTH_WPA2_WPA3_PSK: return "WPA2/WPA3";
default: return "Diğer";
}
}
// Ağın adı; yayınlamıyorsa HIDDEN
String networkName(int k) {
String name = WiFi.SSID(k);
if (name.length() == 0) name = HIDDEN;
return name;
}
// Ağları tarar, güçlüden zayıfa dizer
void scan() {
lcd.clear();
lcd.print("Taraniyor...");
Serial.println("Taranıyor...");
int count = WiFi.scanNetworks();
found = constrain(count, 0, MAX_NETWORKS);
for (int i = 0; i < found; i++) {
order[i] = i;
}
// Sıralama: her ağ, kendinden zayıf
// olanların önüne kayar
for (int i = 1; i < found; i++) {
int k = order[i];
int j = i - 1;
while (j >= 0 &&
WiFi.RSSI(order[j]) < WiFi.RSSI(k)) {
order[j + 1] = order[j];
j--;
}
order[j + 1] = k;
}
Serial.print(found);
Serial.println(" ağ bulundu");
for (int i = 0; i < found; i++) {
int k = order[i];
Serial.printf("%2d. %4d dBm kanal %2d %s (%s)\n",
i + 1, WiFi.RSSI(k), WiFi.channel(k),
networkName(k).c_str(),
security(WiFi.encryptionType(k)));
}
next = 0;
shownAt = millis();
}
// Bir ağı LCD'ye yazar: üstte adı, altta
// sırası, gücü, çizgiler ve şifre (*)
void show(int i) {
int k = order[i];
int rssi = WiFi.RSSI(k);
char barText[] = " ";
for (int b = 0; b < bars(rssi); b++) {
barText[b] = '#';
}
bool locked =
WiFi.encryptionType(k) != WIFI_AUTH_OPEN;
char line[17];
snprintf(line, sizeof line, "%2d/%-2d%4d %s %c",
i + 1, found, rssi, barText,
locked ? '*' : ' ');
lcd.clear();
lcd.print(networkName(k).substring(0, 16));
lcd.setCursor(0, 1);
lcd.print(line);
}
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
// Yalnızca dinler, hiçbir ağa bağlanmaz
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
scan();
}
void loop() {
if (found == 0) {
lcd.setCursor(0, 1);
lcd.print("Ag bulunamadi");
delay(SHOW_EACH);
scan();
return;
}
// İlk ağ hemen, sonrakiler sırayla
if (next > 0 && millis() - shownAt < SHOW_EACH) {
return;
}
// Hepsi gösterildi: yeniden tara
if (next >= found) {
scan();
return;
}
show(next);
next++;
shownAt = millis();
}