// Kitaplık Yöneticisi'nden kurulacak: // "LiquidCrystal I2C" // Kart: "ESP32 Dev Module" #include #include #include // 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(); }