DIY ELECTRONICSEN

← Tüm projeler

Döviz Kuru Göstergesi (ESP32 + LCD)

Başlangıç20 dk

ESP32, 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.

Google Play'den indirin

Gerekli malzemeler

Bağlantı adımları

  1. 1

    LCD'nin gücünü bağla (GND ve VCC)

    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. 2

    I2C kablolarını bağla (SDA ve SCL)

    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

Devreyi tarayıcıda, hiçbir parça almadan çalıştır: Wokwi'de kodu başlat, Seri Monitörü izle.

// 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

SERIAL MONITOR · 115200 BAUD
Bağlanılıyor: EvAgim
.....
Bağlandı
30.10.2026  USD 49.8644  EUR 55.8153  GBP 67.0171

Bir kablo yerinde değilse

SERIAL MONITOR · 115200 BAUD
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

Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.

Google Play'den indirin