Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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.
Bu çalışmanın temel öğrenme hedefleri şunlardır:
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.
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.
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
– 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 (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") oluşur{} süslü parantez, diziler [] köşeli parantez ile tanımlanır,) ile ayrılır, anahtar ve değer iki nokta (:) ile eşleştirilir{
"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.
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
}
}
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.
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.
Ş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() {
}
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
}
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);
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.
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
Bu rehberde, ESP32 kullanarak gerçek bir API’den veri çekmeyi ve JSON formatındaki veriyi işlemeyi öğrendiniz. Bu temel bilgilerle artık:
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.