
İnternet Saati (ESP32 + LCD)
Başlangıç20 dkSaati internetten alan ve hiç ayar istemeyen bir masa saati: ESP32 evdeki Wi-Fi ağına bağlanır, Türkiye saatini bir zaman sunucusundan (NTP) alır ve LCD'de tarihi, günü ve saniyesiyle saati gösterir. Elektrik gidip gelse de açılınca saati kendisi yeniden bulur. ESP32 ile ilk proje için ideal: lehim yok, breadboard yok, yalnızca dört kablo.
Uygulamada adım adım yapGerekli malzemeler
1 × ESP32 Geliştirme Kartı (ESP32-WROOM-32)
1 × 16x2 Karakter LCD Ekran (I2C modüllü)
4 × Jumper Kablo - Dişi/Dişi
Bağlantı adımları
- 1
LCD'nin gücünü bağla (GND ve VCC)

ESP32'yi breadboard'a takma: 30 pinli kart breadboard'u neredeyse tamamen kaplar. Bu projede kart masada durur ve LCD dört dişi-dişi jumper kabloyla doğrudan pinlerine bağlanır. Kartı USB girişi sana bakacak şekilde tut; pin adları kartın üstünde, pinlerin yanında yazar. LCD'nin arkasındaki I2C modülünün 4 pinli başlığında GND'yi ESP32'nin sağ kenarında 3V3'ün hemen üstündeki GND pinine, VCC'yi sol kenarın en altındaki VIN pinine bağla. VIN, ESP32 USB'ye takılıyken 5V verir; LCD'nin yazısı 5V ile net görünür.
- ESP32 GND (3V3'ün yanındaki) → LCD GND (siyah kablo)
- ESP32 VIN (USB'nin 5V'u) → LCD VCC (kırmızı kablo)
- 2
I2C kablolarını bağla (SDA ve SCL)

LCD'nin SDA pinini ESP32'nin D21 pinine, SCL pinini D22 pinine bağla. ESP32'de I2C için kullanılan pinler bunlardır; başka pin kullanırsan koddaki SDA_PIN ve SCL_PIN'i de değiştir. Kodu yüklemeden önce koddaki WIFI_NAME ve WIFI_PASSWORD'a evdeki Wi-Fi ağının adını ve şifresini, büyük-küçük harfine dikkat ederek yaz. ESP32 yalnızca 2,4 GHz ağlara bağlanır; modemin yalnızca 5 GHz yayın yapıyorsa ağı göremez.
- ESP32 D21 → LCD SDA (sarı kablo)
- ESP32 D22 → LCD SCL (yeşil kablo)
Arduino kodu
// Kitaplık Yöneticisi'nden kurulacak:
// "LiquidCrystal I2C"
// Kart: "ESP32 Dev Module"
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <time.h>
// Evdeki Wi-Fi ağının adı ve şifresi
const char* WIFI_NAME = "Ag_Adi";
const char* WIFI_PASSWORD = "Sifre";
// Türkiye saati: UTC+3, yaz saati yok
const char* TIME_ZONE = "<+03>-3";
// Saati internetten veren sunucu
const char* NTP_SERVER = "pool.ntp.org";
// Ekrandaki tarih: gün.ay.yıl
const char* DATE_FORMAT = "%d.%m.%Y";
// Günler pazardan başlar (LCD'de ç yok)
const char* DAYS[] = {"Paz", "Pzt", "Sal", "Car",
"Per", "Cum", "Cmt"};
// ESP32'nin I2C pinleri
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// Bu kadar beklenince şifre sorulur (ms)
const unsigned long WIFI_HINT_AFTER = 15000;
// I2C adresi çoğunda 0x27, bazısında 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Ekrana en son yazılan saniye
int shownSecond = -1;
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
lcd.print("Wi-Fi bekleniyor");
Serial.print("Bağlanılan ağ: ");
Serial.println(WIFI_NAME);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (millis() - start > WIFI_HINT_AFTER) {
// Bağlanamadı: ad ve şifreye bak
lcd.setCursor(0, 1);
lcd.print("Ad/sifre dogru?");
}
}
Serial.println();
Serial.print("Bağlandı, IP: ");
Serial.println(WiFi.localIP());
// Saat bir kez internetten alınır,
// sonra kart kendisi sayar
configTzTime(TIME_ZONE, NTP_SERVER);
lcd.clear();
lcd.print("Saat aliniyor...");
}
void loop() {
struct tm now;
// Saat henüz gelmediyse 1 sn bekler
if (!getLocalTime(&now, 1000)) {
Serial.println("Saat henüz alınamadı");
return;
}
// Aynı saniye: yazacak yeni bir şey yok
if (now.tm_sec == shownSecond) {
delay(50);
return;
}
bool first = shownSecond < 0;
shownSecond = now.tm_sec;
char dateText[11];
strftime(dateText, sizeof dateText, DATE_FORMAT, &now);
char timeText[9];
strftime(timeText, sizeof timeText, "%H:%M:%S", &now);
// 1. satır: tarih ve gün
lcd.setCursor(0, 0);
lcd.print(dateText);
lcd.print(" ");
lcd.print(DAYS[now.tm_wday]);
// 2. satır: saat, ortada
lcd.setCursor(4, 1);
lcd.print(timeText);
// Seri Monitöre ilk saatte ve dakikada
// bir yazar
if (first || now.tm_sec == 0) {
Serial.print(dateText);
Serial.print(" ");
Serial.print(DAYS[now.tm_wday]);
Serial.print(" ");
Serial.println(timeText);
}
}
Seri Monitörde göreceğin
Bağlanılan ağ: EvAgim ..... Bağlandı, IP: 192.168.1.42 Saat henüz alınamadı 21.10.2026 Car 17:45:09 21.10.2026 Car 17:46:00 21.10.2026 Car 17:47:00
Bir kablo yerinde değilse
Bağlanılan ağ: EvAgim ....................................................
Sonuç
Arduino IDE'de bir kerelik ESP32 kurulumu: Dosya → Tercihler'de "Ek kart yöneticisi URL'leri" kutusuna https://espressif.github.io/arduino-esp32/package_esp32_index.json yaz; Araçlar → Kart → Kart Yöneticisi'nde "esp32" ara ve "esp32 by Espressif Systems"ı kur. Sonra Araçlar → Kart'tan "ESP32 Dev Module"ü ve ESP32'nin portunu seç, Kitaplık Yöneticisi'nden "LiquidCrystal I2C"yi kur ("AVR mimarisi" uyarısı verirse önemli değil, ESP32'de de çalışır). Kodu yükle ve Seri Monitörü 115200 baud'da aç. LCD önce "Wi-Fi bekleniyor" yazar; birkaç saniye içinde ağa bağlanır ve "Saat aliniyor..." yazar, ardından üst satırda tarih ve gün, alt satırda saniyesi akan saat görünür. Seri Monitör ilk saati ve sonra dakikada bir saati yazar. Saat bir kez alındıktan sonra kart kendisi sayar; Wi-Fi bir süre kopsa da saat durmaz, kart her saat başı saati yeniden düzeltir. Seri Monitörde noktalar hiç bitmiyorsa ve LCD'nin alt satırında "Ad/sifre dogru?" yazıyorsa ağın adını ve şifresini kontrol et; ağın 2,4 GHz olduğundan emin ol. LCD'nin ışığı yanıyor ama yazı yoksa I2C modülünün üstündeki mavi trimpotu küçük bir tornavidayla çevir; yine görünmüyorsa koddaki 0x27'yi 0x3F yap. Kod yüklenirken "Connecting..." yazıp hata veriyorsa yükleme sırasında ESP32'nin BOOT düğmesine basılı tut. Port listesinde ESP32 hiç görünmüyorsa kablonun şarj kablosu değil veri kablosu olduğundan emin ol ve Windows'ta kartın üstündeki USB çipinin (CP2102 ya da CH340) sürücüsünü kur.
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
Uygulamada adım adım yap