ESP32 kullanarak API, JSON anlama Rehberi: Döviz API Uygulaması

Bu rehberde, ESP32 kullanarak internetten döviz kuru verisi çekmeyi, JSON formatındaki veriyi ayrıştırmayı ve Serial Monitor üzerinde görüntülemeyi öğreneceksiniz. Frankfurter API’sini kullanarak EUR bazlı TRY ve USD kurlarını gerçek zamanlı olarak alacağız.

1. Amaç

Bu çalışmanın temel öğrenme hedefleri şunlardır:

  • ESP32’nin Wi-Fi üzerinden internete bağlanabilmesi
  • HTTPClient kütüphanesi ile REST API istekleri gönderebilmesi
  • JSON formatındaki verinin ArduinoJson kütüphanesi ile ayrıştırılması
  • Gerçek dünya verilerini (döviz kuru) IoT projelerinde kullanabilme
  • Hata yönetimi ve debug tekniklerini uygulayabilme

2. Kullanılan Malzeme ve Kütüphaneler

Donanım

  • ESP32 geliştirme kartı
  • USB Type-C veya Micro-USB kablo (veri aktarımı destekleyen)
  • Bilgisayar (Arduino IDE yüklü)

Yazılım ve Kütüphaneler

  • Arduino IDE (1.8.x veya 2.x)
  • ESP32 Board Paketi (Arduino IDE’ye kurulmuş)
  • WiFi.h – ESP32 Wi-Fi bağlantısı için (dahili)
  • HTTPClient.h – HTTP/HTTPS istekleri için (dahili)
  • ArduinoJson.h – JSON parsing için (Kütüphane Yöneticisinden kurulmalı)

ArduinoJson Kurulumu: Arduino IDE > Araçlar > Kütüphane Yöneticisi > “ArduinoJson” araması yapın > Benoit Blanchon tarafından geliştirilen kütüphaneyi yükleyin.

Ön Çalışma

API Nedir?

API (Application Programming Interface – Uygulama Programlama Arayüzü), farklı yazılımların birbirleriyle iletişim kurmasını sağlayan bir köprüdür.

  • API, bir yazılımın hangi fonksiyonlarının, nasıl kullanılacağını tanımlayan kurallar bütünüdür.
  • Genellikle HTTP istekleri (GET, POST, PUT, DELETE) üzerinden çalışır.
  • Veri alışverişi çoğunlukla JSON veya XML formatında yapılır.

Hava durumu uygulaması → Meteoroloji servisine API ile bağlanır
Ödeme sistemi → Stripe/Banka API’si üzerinden işlem yapar
Harita uygulaması → Google Maps API’sini kullanır
Giriş yap → “Google ile giriş” OAuth API’si kullanır

API Neden Önemlidir?

– Yazılımlar arası entegrasyonu kolaylaştırır
– Kod tekrarını önler, zaman kazandırır
– Güvenli ve kontrollü veri erişimi sağlar
– Ölçeklenebilir sistemler kurmayı mümkün kılar

JSON Nedir?

JSON (JavaScript Object Notation), veri alışverişi için kullanılan, metin tabanlı ve programlama dilinden bağımsız bir veri formatıdır.

  • Anahtar-değer çiftlerinden ("anahtar": "değer") oluşur
  • Nesneler {} süslü parantez, diziler [] köşeli parantez ile tanımlanır
  • Desteklenen veri tipleri: string (çift tırnak içinde), number, boolean, null, object, array
  • Öğeler virgül (,) ile ayrılır, anahtar ve değer iki nokta (:) ile eşleştirilir
  • Web API’lerinde istek ve yanıt payload’ları
  • Yapılandırma (config) dosyaları
  • NoSQL veritabanı kayıtları
  • Mobil ve web uygulamalarında istemci-sunucu veri iletimi
  • JavaScript söz diziminden türetilmiştir; Python, Java, C#, PHP, Go, Ruby gibi dillerde yerleşik veya standart kütüphane desteği bulunur

Örnek

{
  "isim": "Ahmet",
  "yas": 28,
  "aktif": true,
  "adres": {
    "sehir": "Ankara",
    "postaKodu": "06000"
  },
  "diller": ["Türkçe", "İngilizce"]
}

Eğer özel bir durum yoksa API kullanarak veri çektiğimizde gelen cevap JSON formatındadır.

Kullanılan API

  • Frankfurter API: https://api.frankfurter.app
  • Ücretsiz, kayıt gerektirmeyen, EUR bazlı döviz kuru verisi sağlar
  • HTTPS destekler, CORS izni verir, öğrenci projeleri için idealdir

Frankfurterden alınan Json formatındaki içerik:

{
  "amount": 1.0,
  "base": "EUR",
  "date": "2024-01-15",
  "rates": {
    "TRY": 34.52,
    "USD": 1.09,
    "GBP": 0.86
  }
}

HTTP GET İsteği Nedir?

GET, bir sunucudan veri almak için kullanılan HTTP metodudur. ESP32, http.begin(url) ve http.GET() fonksiyonları ile bu isteği gönderir.

HTTPS ve Sertifika Doğrulama

Frankfurter API HTTPS kullanır. ESP32 varsayılan olarak sertifika doğrulama yapar. Basit projelerde http.setInsecure() ile doğrulamayı atlayabilirsiniz, ancak üretim projelerinde sertifika yönetimi önerilir.

4. İçerik ve Kod Açıklamaları

Şifrelerinizi ana kod dosyasından ayırmak için proje klasöründe arduino_secrets.h oluşturmayı unutmayın.

#include <WiFi.h> // WiFi kütüphanesi: ESP32'nin kablosuz ağlara bağlanmasını sağlar
#include <HTTPClient.h>// HTTPClient kütüphanesi: HTTP/HTTPS istekleri göndermek için kullanılır
#include <ArduinoJson.h> // JSON formatındaki verileri işlemek için gereklidir
#include "arduino_secrets.h" // Şifrelerin bulunduğu harici dosyayı dahil ediyoruz

// Wi-Fi bilgilerini harici dosyadan alıyoruz
const char* ssid = SECRET_SSID;
const char* password = SECRET_PASS;

// setup() fonksiyonu: ESP32 açıldığında sadece bir kez çalışır
void setup() {
  Serial.begin(115200);   // Kablolu serial iletişimi 115200 baud hızında başlatıyoruz
  delay(1000); // ESP32'nin tamamen hazır olması için 1 saniye bekliyoruz

  Serial.print("Wi-Fi'ye baglaniliyor"); // bağlantı sürecinin başladığını bildiriyoruz
  
  WiFi.begin(ssid, password); // WiFi.begin() fonksiyonu ile bağlantı sürecini başlatıyoruz
  
  // WL_CONNECTED olana kadar bekleyen döngü
  // WiFi.status() fonksiyonu mevcut bağlantı durumunu döndürür
  while (WiFi.status() != WL_CONNECTED) {
    // Her yarım saniyede bir nokta yazdırarak ilerlemeyi gösteriyoruz
    delay(500);
    Serial.print(".");
  }
  
  // Bağlantı başarılı olduğunda yeni satıra geçip onay mesajı yazıyoruz
  Serial.println("\nBaglanti basarili!");

  // Eğer Wi-Fi bağlantısı varsa API isteği gönderelim
  if (WiFi.status() == WL_CONNECTED) {
    
    // HTTPClient nesnesi oluşturuyoruz. Bu nesne üzerinden HTTP isteklerini yöneteceğiz
    HTTPClient http;
    
    // Hedef Frankfurter API: EUR bazlı ücretsiz döviz kuru servisi
    // https://api.exchangerate-api.com/v4/latest/USD
    // https://api.frankfurter.app/latest?to=TRY (sadece TRY için)
    http.begin("https://api.frankfurter.app/latest"); 

    // Pozitif kodlar (200, 301 vb.) başarılı isteği gösterir
    int httpCode = http.GET(); // HTTP GET isteği gönderiyoruz ve dönüş kodunu alıyoruz

    // httpCode pozitif ise istek başarılı demektir
    if (httpCode > 0) {
      
      String payload = http.getString();
      
      // Gelen ham veriyi Serial Monitor'de gösteriyoruz
      Serial.println("--- Gelen Veri ---");
      Serial.println(payload);

      DynamicJsonDocument doc(2048); // JSON verisini saklamak için doc adında nesne oluşturuyoruz
      
      // deserializeJson() fonksiyonu ile JSON verisini ayrıştırıyoruz
      // payload: Gelen ham JSON verisi
      // doc: Ayrıştırılmış verinin saklanacağı nesne
      // error: Hata durumu varsa bu değişkende tutulur
      DeserializationError error = deserializeJson(doc, payload);

      // Hata yoksa (error false ise) veriyi işliyoruz
      if (!error) {
        
        // JSON yapısından istediğimiz değerleri çekiyoruz
        // doc["rates"]["TRY"]: rates nesnesi içindeki TRY anahtarının değeri
        float tryRate = doc["rates"]["TRY"];
        
        // USD kuru da aynı şekilde çekiliyor
        float usdRate = doc["rates"]["USD"];
        
        // Verinin ait olduğu tarihi alıyoruz
        String date = doc["date"];

        // Sonuçları düzenli formatta Serial Monitor'e yazdırıyoruz
        Serial.println("-------------------------");
        Serial.print("Tarih: "); 
        Serial.println(date);
        
        Serial.print("1 EUR = "); 
        Serial.print(tryRate); 
        Serial.println(" TRY");
        
        Serial.print("1 EUR = "); 
        Serial.print(usdRate); 
        Serial.println(" USD");
        Serial.println("-------------------------");
        
      } else {
        // JSON ayrıştırma hatası oluştuysa hata mesajını yazdırıyoruz
        // error.c_str() hatayı okunabilir metne çevirir
        Serial.print("JSON Ayrıştırma Hatasi: ");
        Serial.println(error.c_str());
      }

    } else {
      // HTTP isteği başarısız olduysa hata kodunu yazdırıyoruz
      // http.errorToString() fonksiyonu kodu açıklama metnine çevirir
      Serial.printf("HTTP Hatasi: %s\n", http.errorToString(httpCode).c_str());
    }
    
    // HTTP bağlantısını kapatıyoruz ve kaynakları serbest bırakıyoruz
    http.end();
  }
}

// loop() fonksiyonu: setup() tamamlandıktan sonra sürekli tekrarlanır

void loop() {

}

Görev 1: Periyodik Güncelleme

Amaç: loop() fonksiyonunu kullanarak her 5 dakikada bir kurları güncelleyin.

Dikkat: API’ye çok sık istek göndermek sınırlandırmaya neden olabilir. Minimum 60 saniye aralık önerilir.

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    // HTTP istek kodları buraya taşınacak
  }
  delay(300000); // 5 dakika bekle
}

Görev 2: Hata Durumlarında LED Kontrolü

Amaç: Bağlantı başarılıysa GPIO 2’deki LED’i yakın, hata durumunda söndürün.

pinMode(2, OUTPUT);
// Bağlantı başarılı olduğunda:
digitalWrite(2, HIGH);
// Hata durumunda:
digitalWrite(2, LOW);

6. Öğrencilerden Gelen Sık Sorular

Soru: ArduinoJson kütüphanesini kuramıyorum, ne yapmalıyım?

Cevap: Arduino IDE’de Araçlar > Kütüphane Yöneticisi menüsüne gidin. Arama çubuğuna “ArduinoJson” yazın. Yazarı “Benoit Blanchon” olan kütüphaneyi bulun ve “Yükle” butonuna tıklayın. Kurulum sonrası IDE’yi yeniden başlatın.

Soru: HTTP Hatası: connection refused alıyorum

Cevap: Bu hata genellikle şu nedenlerle oluşur: (1) Wi-Fi bağlantısı tam kurulmamıştır, (2) ESP32’nin sistem saati yanlış olabilir (HTTPS için önemli), (3) API sunucusu geçici olarak erişilemez. Serial Monitor’de Wi-Fi bağlantı mesajlarını kontrol edin. Gerekirse configTime() ile saat ayarı ekleyin.

Soru: JSON ayrıştırma hatası alıyorum, payload boş geliyor

Cevap: Önce Serial.println(payload) ile gelen veriyi kontrol edin. Eğer boşsa HTTP isteği başarısız olmuş demektir. Eğer veri var ama JSON hatası alıyorsanız, DynamicJsonDocument boyutunu artırın (örneğin 4096). Ayrıca API yanıt formatının değişip değişmediğini kontrol edin.
Soru: HTTPS yerine HTTP kullanabilir miyim?

Cevap: Frankfurter API sadece HTTPS destekler. Bazı API’ler HTTP de kabul eder ancak güvenlik nedeniyle HTTPS kullanımı önerilir. ESP32’de HTTPS kullanmak için ek sertifika ayarı gerekebilir. Test amaçlı http.setInsecure() kullanabilirsiniz ancak bu yöntem üretim ortamında güvenli değildir.

Soru: DynamicJsonDocument boyutu nasıl belirlenir?

Cevap: JSON verinizin boyutuna göre belirlenir. Basit kurlar için 2048 byte yeterlidir. Daha karmaşık veriler için ArduinoJson Assistant aracı (https://arduinojson.org/v6/assistant/) kullanarak gerekli bellek miktarını hesaplayabilirsiniz.

Soru: Kod her çalıştığında farklı tarih görüyorum, neden?

Cevap: Frankfurter API, en son güncellenen veriyi döndürür. Hafta sonları ve resmi tatillerde kurlar güncellenmez, bir önceki iş gününün verisi gelir. Bu normal bir durumdur.

Ek Bilgiler ve Kaynaklar

Faydalı API Alternatifleri

  • ExchangeRate-API: https://www.exchangerate-api.com
  • CurrencyAPI: https://currencyapi.com

ArduinoJson Referans Dokümanları

  • Resmi Dokümantasyon: https://arduinojson.org/v6/doc/
  • JSON Parsing Örneği: https://arduinojson.org/v6/example/parser/

ESP32 Wi-Fi Sorun Giderme

  • ESP32 sadece 2.4GHz Wi-Fi destekler, 5GHz ağlara bağlanamaz
  • Router’da MAC filtresi veya WPA3 güvenlik protokolü bağlantıyı engelleyebilir
  • Güç kaynağı yetersizse Wi-Fi bağlantısı kararsız olabilir

SEO Meta Bilgileri

Başlık: ESP32 ile Döviz Kuru Çekme: API ve JSON İşleme Rehberi

Meta Açıklaması: ESP32 kullanarak Frankfurter API’den döviz kuru verisi çekmeyi öğrenin. HTTPClient ve ArduinoJson kütüphaneleri ile JSON parsing örneği, öğrenciler için adım adım rehber.

Anahtar Kelimeler: ESP32, API, JSON, ArduinoJson, HTTPClient, döviz kuru, Frankfurter, IoT, Wi-Fi, Arduino IDE

Kategori Önerileri: IoT Projeleri, ESP32 Eğitim, API Entegrasyonu, Arduino Dersleri

Etiket Önerileri: #ESP32 #ArduinoJson #API #JSON #HTTPClient #DovizKuru #IoT #Egitim

Görsel Önerileri

Sonuç

Bu rehberde, ESP32 kullanarak gerçek bir API’den veri çekmeyi ve JSON formatındaki veriyi işlemeyi öğrendiniz. Bu temel bilgilerle artık:

  • Hava durumu API’lerinden sıcaklık verisi çekebilir,
  • Kripto para borsalarından anlık fiyat alabilir,
  • Kendi sunucunuzdan komut alıp işleyebilir,
  • IoT projelerinizde bulut entegrasyonu yapabilirsiniz.

Bir sonraki adımda, elde ettiğiniz veriyi bir OLED ekranda göstermeyi veya bir web arayüzüne göndermeyi deneyebilirsiniz.

Öğrenmenin en iyi yolu uygulamaktır. Kodu değiştirin, hata yapın, düzeltin ve tekrar deneyin. Her hata, yeni bir şey öğrenme fırsatıdır.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir