ESP8266 hava durumu ekranı, NodeMCU kartının Wi-Fi ile internete bağlanıp Open-Meteo servisinden anlık sıcaklık, nem, rüzgâr ve hava durumu kodunu alması ve bunları 0,96 inç OLED ekranda göstermesiyle çalışır. Open-Meteo ticari olmayan kullanımda ücretsizdir ve API anahtarı istemez; kart veriyi 15 dakikada bir yeniler.
Okula çıkmadan önce dışarının kaç derece olduğunu masanızdaki küçük bir ekrandan görmek ister misiniz? Bu projede ESP8266 tabanlı NodeMCU kartı ve 0,96 inç OLED ekranla internetten hava durumu çeken bir ekran yapıyoruz. Proje Wi-Fi, internet servisleri (API) ve JSON veri biçimini öğretir; lise bilişim ödevleri, meslek lisesi ve TÜBİTAK 4006 projeleri için uygundur.
ESP8266 hava durumu ekranı nedir?
ESP8266 hava durumu ekranı, Wi-Fi'li bir mikrodenetleyicinin bir hava durumu servisinden veri alıp küçük bir ekranda gösterdiği bir nesnelerin interneti (IoT) projesidir. Ekranda sensör ölçümü değil, meteoroloji modellerinin seçtiğiniz konum için hesapladığı değerler görünür.
Kendi sensörüyle ölçüm yapan bir istasyon isterseniz ESP32 hava istasyonu projesi yazısına bakabilirsiniz. Bu projede sensör yoktur; bu yüzden kurulumu daha kısadır.
Hangi malzemeler gerekir?
Bir NodeMCU kartı, bir 0,96 inç I2C OLED ekran, breadboard ve dört jumper kablo yeterlidir. Kart USB kablosuyla bilgisayardan ya da bir telefon şarj adaptöründen beslenir.
Malzeme listesi
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| ESP8266 NodeMCU (CH340G, Type-C) | 1 | Wi-Fi'ye bağlanır, veriyi alır ve işler |
| 0,96 inç 128x64 I2C OLED ekran (SSD1306) | 1 | Sıcaklık, nem ve rüzgârı gösterir |
| Terminalli 830 pin breadboard | 1 | Kartı ve ekranı taşır |
| 140 parça kutulu jumper kablo seti | 1 | Bağlantılar |
| Type-C USB kablo ve 5V USB adaptör | 1 | Besleme ve kod yükleme |
Devre nasıl bağlanır?
OLED ekranın VCC ucu NodeMCU'nun 3V3 pinine, GND ucu GND'ye, SCL ucu D1'e, SDA ucu D2'ye bağlanır. NodeMCU'da D1 GPIO5, D2 GPIO4 pinidir ve I2C için kullanılır.
- NodeMCU'yu breadboard'un ortasındaki boşluğun iki yanına gelecek şekilde takın.
- OLED'in pin sırasını ekranın üzerindeki yazıdan okuyun; bazı ekranlarda sıra GND-VCC, bazılarında VCC-GND'dir.
- VCC → 3V3, GND → GND, SCL → D1, SDA → D2 bağlantılarını yapın.
- USB kablosunu takın. Ekran henüz boş kalır; kod yüklendiğinde yazı çıkar.
Ekranın kendisi ve I2C adresi (genellikle 0x3C) hakkında ayrıntılar OLED ekran SSD1306 yazısında.
Arduino IDE ve Wi-Fi nasıl hazırlanır?
Arduino IDE'ye ESP8266 kart paketini ve üç kütüphaneyi kurup kodda Wi-Fi ağınızın adını ve şifresini yazmanız yeterlidir.
- Dosya → Tercihler → Ek Kart Yöneticisi URL'leri alanına
https://arduino.esp8266.com/stable/package_esp8266com_index.jsonadresini ekleyin. - Kart Yöneticisi'nden "esp8266" paketini kurun; kart olarak "NodeMCU 1.0 (ESP-12E Module)" seçin.
- Bilgisayar kartı görmüyorsa CH340 USB sürücüsünü kurun ve doğru COM portunu seçin.
- Kütüphane Yöneticisi'nden "Adafruit SSD1306", "Adafruit GFX" ve "ArduinoJson" (7. sürüm) kütüphanelerini kurun.
- Koddaki
AG_ADIveSIFREalanlarına ağınızın bilgilerini yazın. Büyük-küçük harf farkı önemlidir.
ESP8266 yalnızca 2,4 GHz Wi-Fi ağlarına bağlanır. Okul ağları çoğunlukla tarayıcıdan giriş sayfası ister; kart bu sayfayı geçemez. Bu durumda telefonunuzun kişisel erişim noktasını 2,4 GHz'e ayarlayıp kullanın. Kartın genel tanıtımı ESP8266 ve NodeMCU ile Wi-Fi projeleri yazısında.
Open-Meteo'dan veri nasıl alınır?
Kart, enlem ve boylam bilgisi içeren bir internet adresine istek gönderir; Open-Meteo da anlık değerleri JSON biçiminde geri yollar. Örnek adres Ankara (39,93 K, 32,86 D) içindir:
https://api.open-meteo.com/v1/forecast?latitude=39.93&longitude=32.86
¤t=temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code
&timezone=auto
Adresi tek satır olarak tarayıcıya yapıştırırsanız yanıtı görürsünüz. Yanıtın current bölümünde saat, sıcaklık (°C), bağıl nem (%), rüzgâr hızı (km/sa) ve hava kodu bulunur. Kendi konumunuzun enlem ve boylamını bir harita uygulamasında konuma uzun basarak öğrenebilirsiniz. Open-Meteo ticari olmayan kullanım için günlük 10.000 isteğe kadar ücretsizdir; 15 dakikada bir istek günde yalnızca 96 eder.
Hava durumu kodu nasıl çalışır?
Kod Wi-Fi'ye bağlanır, 15 dakikada bir HTTPS isteği gönderir, gelen JSON'dan dört değeri ayıklar ve OLED'e yazar.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>
#include <Adafruit_SSD1306.h>
const char* AG_ADI = "WIFI_ADI";
const char* SIFRE = "WIFI_SIFRESI";
const char* URL = "https://api.open-meteo.com/v1/forecast?latitude=39.93&longitude=32.86"
"¤t=temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code&timezone=auto";
const unsigned long ARALIK = 15UL * 60 * 1000; // 15 dakika
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
unsigned long son = 0;
bool ilk = true;
const char* durum(int k) { // WMO hava kodu -> metin
if (k == 0) return "Acik";
if (k <= 2) return "Az bulutlu";
if (k == 3) return "Kapali";
if (k == 45 || k == 48) return "Sisli";
if (k <= 57) return "Ciseleme";
if (k <= 67) return "Yagmurlu";
if (k <= 77) return "Karli";
if (k <= 82) return "Saganak";
if (k <= 86) return "Kar saganagi";
return "Gok gurultulu";
}
void guncelle() {
BearSSL::WiFiClientSecure istemci;
istemci.setInsecure(); // sertifika denetimi yok
HTTPClient http;
http.begin(istemci, URL);
int kod = http.GET();
if (kod != 200) { Serial.printf("HTTP hatasi: %d\n", kod); http.end(); return; }
JsonDocument v;
DeserializationError hata = deserializeJson(v, http.getString());
http.end();
if (hata) { Serial.println(hata.c_str()); return; }
JsonObject c = v["current"];
String saat = c["time"].as<String>(); // 2026-11-11T14:15
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.print("Ankara " + saat.substring(11));
oled.setTextSize(3);
oled.setCursor(0, 14);
oled.print(c["temperature_2m"].as<float>(), 1);
oled.setTextSize(1);
oled.print(" C");
oled.setCursor(0, 44);
oled.print(durum(c["weather_code"]));
oled.setCursor(0, 56);
oled.print("Nem %" + String(c["relative_humidity_2m"].as<int>()));
oled.print(" " + String(c["wind_speed_10m"].as<float>(), 0) + " km/sa");
oled.display();
}
void setup() {
Serial.begin(115200);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Wire: SDA = D2, SCL = D1
oled.setTextColor(SSD1306_WHITE);
oled.clearDisplay();
oled.print("Wi-Fi baglaniyor...");
oled.display();
WiFi.mode(WIFI_STA);
WiFi.begin(AG_ADI, SIFRE);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void loop() {
if (WiFi.status() == WL_CONNECTED && (ilk || millis() - son >= ARALIK)) {
ilk = false;
son = millis();
guncelle();
}
}
setInsecure() bağlantıyı şifreler ama sunucunun sertifikasını doğrulamaz. Herkese açık hava verisi okuyan bir okul projesinde bu kabul edilebilir; şifre ya da kişisel bilgi gönderen projelerde sertifika doğrulaması yapılmalıdır.
Hava kodları ne anlama gelir?
Open-Meteo hava durumunu Dünya Meteoroloji Örgütü'nün (WMO) sayısal kodlarıyla bildirir; kod, ekrana yazılacak metne durum() işleviyle çevrilir.
| WMO kodu | Anlamı | Ekranda |
|---|---|---|
| 0 | Açık gökyüzü | Acik |
| 1, 2, 3 | Az bulutlu, parçalı bulutlu, kapalı | Az bulutlu / Kapali |
| 45, 48 | Sis | Sisli |
| 51-57 | Çiseleme (donan dahil) | Ciseleme |
| 61-67 | Yağmur (donan dahil) | Yagmurlu |
| 71-77 | Kar yağışı, kar taneleri | Karli |
| 80-82 | Sağanak yağmur | Saganak |
| 85, 86 | Kar sağanağı | Kar saganagi |
| 95-99 | Gök gürültülü fırtına | Gok gurultulu |
OLED kütüphanesinin yazı tipi Türkçe karakterleri göstermediği için metinler "Yagmurlu" gibi yazılır.
Hangi güvenlik kurallarına dikkat edilmeli?
- Kartı bilgisayarın USB'sinden ya da 5V USB adaptörden besleyin; 220V'a hiçbir kablo bağlamayın.
- NodeMCU pinleri 3,3V ile çalışır; OLED'i 3V3'e bağlayın, pinlere 5V sinyal vermeyin.
- Wi-Fi şifrenizi içeren kodu paylaşırken şifreyi silin.
- Projeyi öğretmen ya da yetişkin gözetiminde kurun.
Ödevinizi nasıl sunarsınız?
- Problem: "Bir cihaz internetten veriyi nasıl alır ve anlamlı bilgiye çevirir?"
- Gösteri: Ekrandaki değerleri telefonunuzdaki hava durumu uygulamasıyla karşılaştırın.
- Açıklama: İstek adresini ve JSON yanıtını tahtada gösterip değerlerin nasıl ayıklandığını anlatın.
- Rapor: Bağlantı şemasını, hava kodları tablosunu ve "Veri: Open-Meteo" kaynak notunu ekleyin.
- Geliştirme: Yarının en yüksek ve en düşük sıcaklığını ya da ikinci bir şehri ekleyin.
Sık sorulan sorular
Kart Wi-Fi'ye neden bağlanmıyor?
En sık neden ağın 5 GHz olmasıdır; ESP8266 yalnızca 2,4 GHz ağları görür. Ağ adı ve şifrede büyük-küçük harf hatası, tarayıcıdan giriş isteyen okul ağları ve zayıf sinyal de bağlantıyı engeller. Telefonun erişim noktasını 2,4 GHz'e alıp kartı yakına koyarak deneyin.
Seri monitörde "HTTP hatasi: -1" görürsem ne yapmalıyım?
Eksi değerli hatalar bağlantının sunucuya hiç ulaşmadığını gösterir. Önce kartın Wi-Fi'ye bağlı olduğundan, sonra ağınızın internete çıkabildiğinden emin olun. Adresi tarayıcıda deneyerek yazım hatası olup olmadığını kontrol edin; koddaki adreste boşluk bulunmamalıdır.
Başka bir şehrin hava durumunu nasıl gösteririm?
Adresteki latitude (enlem) ve longitude (boylam) değerlerini değiştirin; ondalık ayırıcı nokta olmalıdır. Örneğin İstanbul için yaklaşık 41.01 ve 28.98 kullanılır. Ekrandaki şehir adını da kodda değiştirmeyi unutmayın.
Yarının tahmini de gösterilebilir mi?
Gösterilebilir. Adrese &daily=temperature_2m_max,temperature_2m_min ekleyin; yanıtta daily bölümü gelir ve dizinin ikinci elemanı (indeks 1) yarına aittir. Ekran küçük olduğu için tahmini birkaç saniyede bir anlık değerlerle dönüşümlü göstermek okunabilirliği artırır.
NodeMCU yerine WeMos D1 Mini kullanılabilir mi?
Kullanılabilir; WeMos D1 Mini ESP8266 kartı da aynı çipi taşır ve D1, D2 pinleri aynı görevdedir. Arduino IDE'de kart olarak "LOLIN(WEMOS) D1 mini" seçmeniz yeterlidir; kod değişmez.
Özet
- NodeMCU, Wi-Fi üzerinden Open-Meteo'dan anlık hava verisini alır ve 0,96 inç OLED'de gösterir.
- Bağlantı: OLED VCC → 3V3, GND → GND, SCL → D1, SDA → D2.
- Open-Meteo API anahtarı istemez; konum, adresteki enlem ve boylamla seçilir.
- Veri 15 dakikada bir yenilenir; hava kodu WMO tablosuna göre metne çevrilir.
- ESP8266 yalnızca 2,4 GHz ağlara bağlanır; devre USB'den 5V ile beslenir.
