#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
// Wi-Fi credentials — Wokwi default / Wokwi default credentials
// Gercek donanim icin kendi SSID ve sifrenizle degistirin!
// For real hardware change with your own SSID and password!
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = ""; // Wokwi-GUEST sifresizdir / Wokwi-GUEST has no password
// Pin tanimlari / Pin definitions
#define LED_PIN 2 // DevKit dahili LED / Onboard LED
#define WIFI_TIMEOUT_MS 15000 // Ilk bag timeout / Initial timeout
#define WIFI_RECOVER_MS 30000 // Reconnect araligi / Reconnect interval
#define SCREEN_SWITCH_MS 3000 // Ekran degisim suresi / Screen switch period
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long lastReconnect = 0;
unsigned long lastScreenSwitch = 0;
bool showIpScreen = true;
// RSSI -> sinyal kalitesi / RSSI -> signal quality
const char* rssiQuality(int rssi) {
if (rssi >= -55) return "Mukemmel";
if (rssi >= -65) return "Iyi";
if (rssi >= -75) return "Orta";
if (rssi >= -85) return "Zayif";
return "Cok zayif";
}
void showConnecting() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Baglaniliyor...");
lcd.setCursor(0, 1);
lcd.print("Connecting...");
}
void showDisconnected() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Baglanti yok");
lcd.setCursor(0, 1);
lcd.print("Disconnected");
}
void showIpInfo() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("IP:");
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP());
}
void showRssiInfo() {
int rssi = WiFi.RSSI();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RSSI:");
lcd.print(rssi);
lcd.print(" dBm");
lcd.setCursor(0, 1);
lcd.print(rssiQuality(rssi));
}
bool connectWiFi() {
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(true);
WiFi.setSleep(false);
WiFi.setHostname("bluegrays-esp32");
WiFi.begin(WIFI_SSID, WIFI_PASS);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < WIFI_TIMEOUT_MS) {
delay(500);
}
return WiFi.status() == WL_CONNECTED;
}
void setup() {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// V1 default I2C: SDA=21 SCL=22 / V1 I2C default
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
// Splash 3sn / Splash 3s
lcd.setCursor(3, 0);
lcd.print("BlueGrays");
lcd.setCursor(2, 1);
lcd.print("Wi-Fi STA v1");
delay(3000);
showConnecting();
if (connectWiFi()) {
digitalWrite(LED_PIN, HIGH);
showIpInfo();
lastScreenSwitch = millis();
} else {
showDisconnected();
}
}
void loop() {
// Reconnect kontrolu / Reconnect check
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_PIN, (millis() / 500) % 2);
if (millis() - lastReconnect > WIFI_RECOVER_MS) {
showConnecting();
WiFi.disconnect();
WiFi.reconnect();
lastReconnect = millis();
delay(3000);
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(LED_PIN, HIGH);
showIpInfo();
lastScreenSwitch = millis();
} else {
showDisconnected();
}
}
return;
}
// Bagli — IP / RSSI ekranlari arasinda gec / Connected — alternate screens
if (millis() - lastScreenSwitch > SCREEN_SWITCH_MS) {
lastScreenSwitch = millis();
showIpScreen = !showIpScreen;
if (showIpScreen) showIpInfo();
else showRssiInfo();
}
delay(50);
}