NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek
Dünyayı ve ülkemizi esir altına alan yeni tip Koronavirüs, her gün verilerine yeni eklemeler yapmakta. Bu yazımızda, NodeMCU ile internet üzerinden veri çekip, OLED ekrana çektiğimiz verileri yansıtacağız. Fakat öncelikle NodeMCU hakkında bir kaç bilgiyle başlayalım.
NodeMCU ve ESP8266 Nedir?
Öncelikle NodeMCU ve ESP8266’nın ne olduğunu konuşalım, çünkü bir çok platformda ve makerlar arasında iki olgu karıştırılmakta. NodeMCU tıpkı bir Arduino gibi geliştirme kartıdır, ESP8266 mikroişlemcisi bu kartın üzerindedir. ESP8266 ise ATmega328P gibi bir mikroişlemcidir kısacası, biri sadece mikroişlemci biri bu mikroişlemciye sahip geliştirme kartıdır.

Önceki NodeMCU Yazıları
OLED Ekran Nedir?
OLED ekranlar tıpkı LED ekranlar gibi yarı katı iletkenlerdir. OLED ekranlar elektrik uygulandığında ışığı emen organik malzemelerden yapılmıştır. OLED’ler 2 ya da 3 ana organik katman sahip olabilir ve üçüncü katman bulunduğunda bu katman katottan ışık yayan tabakaya yani bir anot tabakaya elektron taşınmasına aracılık eder. Ayrıca bu teknolojinin gelişmesinde, Nanoteknolojinin payı oldukça büyüktür. Arzu ederseniz buradan OLED hakkındaki yazımıza erişebilirsiniz.

ThingSpeak Kurulumu
Site verilerini çekebilmek için, bu servisi kullanıyoruz. Kişisel kullanım için üyelik tamamen ücretsiz, ayrıca verdiğimiz koddaki API kodlarını doğrudan kullanabilirsiniz. Eğer bizim verdiğimiz API kodları çalışmıyorsa, bu yazıdan epey uzun bir zaman geçmiş olabilir.

Buradan ThingSpeak üyeliği oluşturduktan sonra, üst menü kısmındaki “Apps” bölümünden ThingHTTP kısmına giriyoruz ve New ThingHTTP butonuna basıyoruz. Gerekli formları veri çekeceğimiz siteye göre doldurcağız.

1. Name: İstediğiniz her hangi bir isim yazabilirsiniz.
2. URL: Veri çekeceğimiz web sitenin tam adresini yazıyoruz, biz worldometer kullandık o yüzden https://www.worldometers.info/coronavirus/country/turkey/ olarak girdik.
3. Parse String: Bir sonraki başlıkta, bu kısmı anlatacağız.

worldometer veya T.C Sağlık Bakanlığından Veri Almak
İstediğiniz web sayfasından veri çekebilirsiniz, tamamen aynı mantıkta, biz worldometer servisini kullandık. Parse String bölümüne, hedef sitedeki, istenilen verinin XPath yolunu yazıyoruz. XPath yolunu almak için “Inspect” yani inceleme desteği olan her hangi bir web tarayıcısı kullanabilirsiniz, biz Google Chrome kullanarak bu veriye ulaştık.

Veri çekeceğimiz adrese buradan ulaşabilirsiniz. Biz Türkiyenin koronavirüs verilerini çekeceğimiz için doğrudan bu adrese girebilirsiniz, farklı ülkeler için buradan ayrıca seçim yapabilirsiniz.

Türkiye verileri için verdiğimiz bağlantıya girdikten sonra sizi böyle bir ekran karşılayacaktır. Buradaki;
1. Coronavirus Cases
2. Deaths
3. Recovered
verilerinin tek tek XPath yoluna ihtiyacımız var. Bu verilerin XPath yollarını almak için;

Veriyi seçin -> Sağ tıklayın -> İncele butonuna basın

Sağ tarafta açılan pencerede, seçtiğiniz veriyi görmeniz gerekiyor, doğru bir şekilde gerekli elemente sağ tıklayıp “Copy XPath” butonuna tıklamanız gerekiyor. Bu yolu kopyaladıktan sonra ThingHTTP’de oluşturduğumuz uygulamalardan aldığımız veriye uygun uygulamadaki Parse String kısmına yapıştırıp, API kodunu kopyalayıp kaydedip çıkıyoruz. Bu işlemi 3 veri için de tekrarlayacağız. Eğer verileri doğrudan Sağlık Bakanlığından almak isterseniz, aynı işlemlerle XPath yollarını almanız gerekiyor fakat ThingHTTP uygulaması oluştururken URL kısmına https://covid19.saglik.gov.tr/ yazmalısınız.
Gerekli Sürücüler
API bilgileri oluşturduktan sonra ve genel olarak prensibi anladığımıza göre, devre şemalarına ve kod bölümüne geçebiliriz fakat bundan önce eğer NodeMCU kartınızı ilk defa kullanacaksınız, gerekli sürücüleri kurmanız gerekiyor. Büyük ihtimalle CH340G ya da CP210X entegreli bir karta sahipsiniz. Bu projeyi yapacağınız cihazda daha önce Arduino kullandıysanız bu sürücüler zaten yüklüdür, eğer yüklü değilse aşağıdaki bağlantılardan indirebilirsiniz.
Devre Şeması
OLED | NodeMCU |
---|---|
GND | GND |
VCC | VCC |
SCL | D1 |
SDA | D2 |

NodeMCU Program Yüklemek
Bir çok geliştirmek kartında alışkın olduğumuz, Arduino IDE’yi NodeMCU kartını programlarken de kullanabilirsiniz. Bu yönteme ek olarak, NodeMCU için hazırlanmış flashlama programlarını kullanabilirsiniz. Bir önce ki NodeMCU yazılarımızda farklı bir flashlama programını tanıtıp, kullanmıştık fakat bu yazıda MacOS işletim sistemi için geliştirilmiş olan NodeMCU Py-Flasher-4.0 programını kullanacağız. Fakat bundan önce Arduino IDE ile kod yükleme işlemi yapıyoruz.

İki yöntemi de gerçekleştirebilmek için, kartınızın kullandığı USB iletişim entegresinin sürücüsünü kurmanız gerekiyor. Bizim kullandığımız NodeMCU kartının iletişim entegresi CH340G, fakat bazı kartlarda CP210X gibi entegrelerin kullanıldığını gördük. İşlemlere başlamadan önce, mutlaka gerekli sürücüleri kurmalısınız, kartınızın hangi entegreye sahip olduğunu anlamak için aşağıdaki görselden referans alabilirsiniz. Bir üst başlıktan gerekli sürücüleri indirebilirsiniz.
Arduino IDE ile Programlamak
Programlamaya başlamak için öncelikle NodeMCU kart dosyalarını ve kullanılan kütüphaneleri kurmak gerekiyor. OLED kütüphanesi için alternatif kütüphaneler kullanabilirsiniz, fakat biz programı buraya eklediğimiz kütüphane doğrultusunda oluşturduk.
Arduino IDE’ye NodeMCU Desteği Eklemek
• Arduino IDE‘yi çalıştırın. Türkçe arabirim ille kullandığınızı varsayarak devam ediyorum;
• Ana menüde sırasıyla tıklayın; Dosya > Tercihler
• Gelen pencerenin Ayarlar isimli sekmesinde Ek Devre Kartları Yöneticisi URL’leri, ayrıca kutucuğu ve en sağında simgesi var. Simgeye tıklayın

• Bir pencere daha açılacak. Bu penceredeki yazı alanında bir metin yoksa şu URL’yi http://arduino.esp8266.com/stable/package_esp8266com_index.json bağlantısını yapıştırın eğer başka URLler varsa yeni satırla ya da virgül koyarak yapıştırın.
• Tüm pencerelerde Tamam düğmelerine tıklayıp Arduino IDE’nin ana penceresine ulaşın

• Ana menüde sırasıyla tıklayın; Araçlar > Kart:… > Kart Yöneticisi
• Açılan pencerede esp8266 ile arama yapın ve sonuçlar arasında esp8266 by ESP8266 Community olanı kurun ve inme işlemleri için bekleyin.
• İşlem tamamlandığında Kart Yöneticisi penceresini kapatın
• Arduino IDE artık NodeMCU için hazır

Doğru kartı ve portu seçtikten sonra, aşağıdaki program kodu ile Arduino ile doğrudan yükleyebilirsiniz, fakat kodun başlangıç kısmındaki WiFi ayarlarını kendi ağınıza göre ayarlamanız gerekiyor.
.BIN Dosyasını Flashlamak
NodeMCU’ya programlarınızı flashlayarak yüklüyorsanız, doğrudan paylaştığımız .BIN dosyasını yükleyebilirsiniz, fakat WiFi ayarları farklı olduğu için tam olarak çalışmayabilir bu yüzden bu yazı için bu kısım sadece rehber olması amacıyla anlatıldı. PyFlasher uygulamasını buradan indirebilirsiniz.

Proje Görüntüleri




Program Kodu
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <Wire.h> // Arduino IDE 1.6.5 verisyonu ve yenileri için #include "SSD1306Wire.h" #include "OLEDDisplayUi.h" // UI menü kütüphanesi #include "images.h" // Koronavirüs bitmap resmi SSD1306Wire display(0x3c, D2, D1); // D2 -> SDA and D1 -> SCL OLEDDisplayUi ui ( &display ); const char* ssid = "Wifi Ağınızın İsmi"; //WiFi ağ ismi const char* password = "Wifi Ağınızın Şifresi"; //WiFi şifresi const char* host = "api.thingspeak.com"; //API bağlantısı const int httpPortRead = 80; const char* url1 = "/apps/thinghttp/send_request?api_key=GGU8ZUWV6XYG94FJ"; //Aldiginiz keylerin girileceği yer const char* url2 = "/apps/thinghttp/send_request?api_key=GGU8ZUWV6XYG94FJ"; const char* url3 = "/apps/thinghttp/send_request?api_key=GGU8ZUWV6XYG94FJ"; int To_remove; //gereksiz verileri filtreleme String Vakalar, Vefatlar, iyilesen, Data_Raw, Data_Raw_1, Data_Raw_2, Data_Raw_3; WiFiClient client; // HTTPClient http; void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->drawXbm(x + 34, y + 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits); display->clear(); display->drawXbm(0 , 0 , covid19_width, covid19_height, covid19_bits); } void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->clear(); display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(ArialMT_Plain_16); display->drawString(35, 0, "Türkiye"); display->drawString(25, 15, "Koronavirüs"); display->drawString(33, 30, "Tablosu"); } void drawFrame3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->clear(); display->setFont(ArialMT_Plain_16) ; display->drawString(15, 15, "Toplam Vaka:"); display->drawString(37, 30, String(Vakalar)); } void drawFrame4(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->clear(); display->setFont(ArialMT_Plain_16) ; display->drawString(15, 15, "Toplam Vefat:"); display->drawString(48, 30, String(Vefatlar)); } void drawFrame5(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->clear(); display->setFont(ArialMT_Plain_16) ; display->drawString(5, 15, "Toplam iyilesen:"); display->drawString(35, 30, String(iyilesen)); } FrameCallback frames[] = { drawFrame1, drawFrame2, drawFrame3, drawFrame4, drawFrame5 }; int frameCount = 5; int overlaysCount = 1; void setup() { Serial.begin(115200); WiFi.disconnect(); delay(1000); WiFi.begin(ssid, password); Serial.println("WiFi agina baglanin"); Serial.println(WiFi.localIP()); ui.setTargetFPS(60); ui.setActiveSymbol(activeSymbol); ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition(BOTTOM); ui.setIndicatorDirection(LEFT_RIGHT); ui.setFrameAnimation(SLIDE_LEFT); ui.setFrames(frames, frameCount); ui.init(); display.flipScreenVertically(); } void loop() { int remainingTimeBudget = ui.update(); if (remainingTimeBudget > 0) { delay(remainingTimeBudget); } if ( http.begin(host, httpPortRead, url1)) { int httpCode = http.GET(); if (httpCode > 0) { if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { Data_Raw = http.getString(); Data_Raw_1 = Data_Raw; To_remove = Data_Raw_1.indexOf(">"); //veriden bu sembolü çıkarmak ">" Data_Raw_1.remove(0, To_remove + 1); To_remove = Data_Raw_1.indexOf("<"); //veriden bu sembolü çıkarmak ">" Data_Raw_1.remove(To_remove, Data_Raw_1.length()); Vakalar = Data_Raw_1; Serial.print("Vaka: "); Serial.println(Vakalar); Data_Raw_2 = Data_Raw; To_remove = Data_Raw_2.indexOf("<span>"); Data_Raw_2.remove(0, To_remove + 6); Data_Raw_3 = Data_Raw_2; To_remove = Data_Raw_2.indexOf("</span>"); Data_Raw_2.remove(To_remove, Data_Raw_2.length()); Vefatlar = Data_Raw_2; Serial.print("Vefat: "); Serial.println(Vefatlar); To_remove = Data_Raw_3.indexOf("<span>"); Data_Raw_3.remove(0, To_remove + 6); To_remove = Data_Raw_3.indexOf("<"); Data_Raw_3.remove(To_remove, Data_Raw_3.length()); iyilesen = Data_Raw_3; Serial.print("Iyılesen: "); Serial.println(iyilesen); } } else { Serial.printf("[HTTP] GET parametresi çalışmadı: %sn", http.errorToString(httpCode).c_str()); } http.end(); } else { Serial.printf("[HTTP} Baglanti kurulamadin"); } delay(5000); while (WiFi.status() != WL_CONNECTED) //WiFi ağına tekrar bağlanmak için { WiFi.disconnect(); delay(1000); WiFi.begin(ssid, password); Serial.println("WiFi agina tekrar baglaniliyor..."); delay(10000); } }
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.