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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek
Solda NodeMCU ESP8266 ve Sağda ESP8266 Kullanılmış Farklı Bir Kart

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

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek
Tüm ülkelerin koronavirüs tablosu

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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;

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

CH340G Windows Linux, MacOS

CP210X Windows, Linux, MacOS

Devre Şeması

OLEDNodeMCU
GNDGND
VCCVCC
SCLD1
SDAD2
nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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

OLED Kütüphanesi

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

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

• 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

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

• 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

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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.

nodemcu esp8266 koronavirüs takip, NodeMCU ESP8266 ve OLED ile Koronavirüs Tablosunu Takip Etmek

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ı: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } else { Serial.printf("[HTTP} Baglanti kurulamadi\n"); } 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); } }