
Döviz Kuru Göstergesi (ESP32 + LCD)
Başlangıç20 dkESP32, Merkez Bankası'nın (TCMB) her iş günü yayımladığı kur listesini internetten indirir ve doların, euronun ve sterlinin satış kurunu 16x2 LCD'de gösterir. Ekran dört saniyede bir sayfa değiştirir: önce USD ve EUR, sonra GBP ve kurların tarihi; liste yarım saatte bir yenilenir. HTTPS ile bir web sayfasını indirmeyi, gelen metnin içinden aranan değeri bulmayı ve LCD'yi titretmeden güncellemeyi öğretir. İnternet Saati'yle aynı devre: kurduysan yalnızca kodu yükle. Kitaplık Yöneticisi'nden "LiquidCrystal I2C" kurulur.

Gerekli 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. İnternet Saati'ni ya da Wi-Fi Tarayıcı'yı kurduysan devre aynı; yalnızca yeni kodu yükle.
- ESP32 D21 → LCD SDA (sarı kablo)
- ESP32 D22 → LCD SCL (yeşil kablo)
Arduino kodu
Kodu indir (.ino)Wokwi'de dene
// Kitaplık Yöneticisi'nden kurulacak:
// "LiquidCrystal I2C"
// Kart: "ESP32 Dev Module"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Evdeki Wi-Fi ağının adı ve şifresi
const char* WIFI_NAME = "Ag_Adi";
const char* WIFI_PASSWORD = "Sifre";
// Merkez Bankası'nın günlük kur listesi
const char* RATES_URL = "https://www.tcmb.gov.tr/kurlar/today.xml";
// Kurlar iş günleri 15.30'da açıklanır;
// yarım saatte bir bakmak yeter (ms)
const unsigned long FETCH_EVERY = 30UL * 60 * 1000;
// Alınamazsa bu kadar sonra yine dene
const unsigned long RETRY_AFTER = 60000;
// Ekran sayfaları arası süre (ms)
const unsigned long PAGE_EVERY = 4000;
// ESP32'nin I2C pinleri
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// Bu süreden sonra şifreyi sor (ms)
const unsigned long WIFI_HINT_AFTER = 15000;
// I2C adresi çoğunda 0x27, bazısında 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Son okunan satış kurları; 0: henüz yok
float usd = 0;
float eur = 0;
float gbp = 0;
// Kurların tarihi, ör. "30.10.2026"
String rateDate = "";
unsigned long nextFetch = 0;
unsigned long lastPage = 0;
int page = 0;
// Bir satırı yazar, kalanını boşlukla
// siler (ekran titremez)
void printLine(int row, const String& text) {
lcd.setCursor(0, row);
lcd.print(text);
for (int n = text.length(); n < 16; n++) {
lcd.print(' ');
}
}
// Bir paranın satış kurunu bulur
// (ForexSelling); bulamazsa 0
float sellingRate(const String& xml, const char* code) {
int at = xml.indexOf(String("CurrencyCode=\"") + code + "\"");
if (at < 0) return 0;
int start = xml.indexOf("<ForexSelling>", at);
if (start < 0) return 0;
start += 14;
int end = xml.indexOf('<', start);
return xml.substring(start, end).toFloat();
}
// Listeyi indirir; olmazsa ekrandaki
// eski kurlar kalır
bool fetchRates() {
WiFiClientSecure client;
// Sertifikaya bakılmaz: yalnızca
// herkese açık bir liste okunuyor
client.setInsecure();
HTTPClient http;
http.begin(client, RATES_URL);
// Sıkıştırmasız iste: ESP32'nin olağan
// isteğine TCMB gzip ile cevap veriyor
http.setAcceptEncoding("identity");
int status = http.GET();
if (status != 200) {
Serial.print("Kurlar alınamadı, HTTP ");
Serial.println(status);
http.end();
return false;
}
String xml = http.getString();
http.end();
// Liste en başta tarihini söyler:
// Tarih="30.10.2026"
int at = xml.indexOf("Tarih=\"");
if (at >= 0) {
int end = xml.indexOf('"', at + 7);
rateDate = xml.substring(at + 7, end);
}
float newUsd = sellingRate(xml, "USD");
if (newUsd == 0) {
// Gelen şey kur listesi değil: başını
// göster, nedeni oradan anlaşılır
Serial.print("Beklenmeyen yanıt (");
Serial.print(xml.length());
Serial.print(" bayt): ");
Serial.println(xml.substring(0, 160));
return false;
}
usd = newUsd;
eur = sellingRate(xml, "EUR");
gbp = sellingRate(xml, "GBP");
Serial.print(rateDate);
Serial.print(" USD ");
Serial.print(usd, 4);
Serial.print(" EUR ");
Serial.print(eur, 4);
Serial.print(" GBP ");
Serial.println(gbp, 4);
return usd > 0;
}
// "USD/TL 49.8644": tam 16 karakter
String rateLine(const char* code, float rate) {
char text[17];
snprintf(text, sizeof text, "%s/TL %8.4f", code, rate);
return String(text);
}
void showPage() {
if (usd == 0) {
printLine(0, "Kur alinamadi");
printLine(1, "Yine denenecek");
return;
}
if (page == 0) {
printLine(0, rateLine("USD", usd));
printLine(1, rateLine("EUR", eur));
} else {
printLine(0, rateLine("GBP", gbp));
printLine(1, "TCMB " + rateDate);
}
}
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
lcd.print("Wi-Fi bekleniyor");
Serial.print("Bağlanılıyor: ");
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 ya da şifre?
lcd.setCursor(0, 1);
lcd.print("Ad/sifre dogru?");
}
}
Serial.println();
Serial.println("Bağlandı");
printLine(0, "Kurlar aliniyor");
printLine(1, "");
}
void loop() {
// İlk açılışta, sonra yarım saatte bir
if ((long)(millis() - nextFetch) >= 0) {
bool ok = fetchRates();
nextFetch = millis() + (ok ? FETCH_EVERY : RETRY_AFTER);
showPage();
}
// İki sayfa sırayla: USD ve EUR, sonra
// GBP ve kurların tarihi
if (millis() - lastPage > PAGE_EVERY) {
lastPage = millis();
page = 1 - page;
showPage();
}
}
Seri Monitörde göreceğin
Bağlanılıyor: EvAgim ..... Bağlandı 30.10.2026 USD 49.8644 EUR 55.8153 GBP 67.0171
Bir kablo yerinde değilse
Bağlanılıyor: EvAgim ..... Bağlandı Kurlar alınamadı, HTTP -1
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; ağa bağlanınca "Kurlar aliniyor" der ve birkaç saniye içinde üst satırda "USD/TL 49.8644", alt satırda euronun kuru görünür. Dört saniyede bir ikinci sayfaya geçer: sterlin ve kurların tarihi ("TCMB 30.10.2026"). Rakamlar TCMB'nin döviz satış kurudur; bankaların ve döviz bürolarının fiyatı biraz farklıdır. TCMB kurları iş günleri 15.30'da açıklar: hafta sonu ve tatilde son iş gününün kuru görünür, tarih de onu gösterir. Liste yarım saatte bir yeniden okunur; alınamazsa ekrandaki kurlar kalır ve bir dakika sonra yine denenir. Seri Monitörde "Kurlar alınamadı" yazıyorsa internet bağlantısına bak. 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. Başka bir para birimi istersen sellingRate(xml, "CHF") gibi kodunu yaz: listede 20'ye yakın para var.
Benzer projeler
İ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.Projeye git
RFID Kartlı Yoklama (ESP32 + LCD)Orta40 dkKartını okutan kişinin adı LCD'de görünür ve "girdi" ya da "çıktı" diye kaydedilir; ekran içeride kaç kişi olduğunu sayar. Kulüp, sınıf ya da atölye yoklaması için: tanımadığı kartın numarasını gösterir, sen o numarayı bir adla koddaki listeye eklersin. Breadboard gerekmez; RC522 ve LCD dişi-dişi kablolarla doğrudan ESP32'ye bağlanır.Projeye git
Wi-Fi Tarayıcı (ESP32 + LCD)Başlangıç20 dkÇevrendeki Wi-Fi ağlarını bulan bir cep tarayıcısı: ESP32 ağları tarar, en güçlüden en zayıfa sıralar ve LCD'de her birinin adını, sinyal gücünü (dBm ve çizgilerle) ve şifreli olup olmadığını sırayla gösterir; Seri Monitöre kanal ve şifreleme türüyle tam listeyi yazar. Bir powerbank'e takıp evde dolaştırarak modemin en iyi çektiği yeri bulabilirsin. Hiçbir ağa bağlanmaz, şifre gerekmez. İnternet Saati ile aynı dört kablo; ağ taramayı, diziyi sıralamayı ve snprintf ile ekran satırı biçimlemeyi öğretir.Projeye git
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
