NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2
Bir önceki bölümümüzde NodeMCU ESP8266 kartımıza kod yüklemeyi, flash atmayı, Wi-Fi taraması yapmayı basit bir şekilde web server açmaya bakmıştık. Bu bölümümüzde ise, interaktif bir web sayfası oluşturup kartımızı uzaktan, röle açıp-kapatmaya uygun hale getireceğiz.

Bu Bölümün Amacı
Bir önceki bölümde;
(+) ESP8266 Kurulumu
(+) ESP8266 Çalışma Testi
(+) ESP8266 İşletim Sistemi Flashlama / Güncelleme
(+) ESP8266 Web Server ile Basit Hello Programı
Konuları işleyip bitirmiştik, şimdi ise;
(+) ESP8266 Ev/Oda Kullanımına Entegresi
(+) ESP8266 Performans Testleri
Konularını inceleyeceğiz.
İlk Hazırlık
Diğer geliştirme kartlarını Arduino IDEye tanımlarken kullandığımız yöntem ile kartımızı Arduino IDEye ekleyeceğiz. Önce Arduino IDE mizi açıyoruz ve Dosya—Tercihler bölümüne giriyoruz burada en altta Additional Board manager URLs in yanındaki kutucuğa http://arduino.esp8266.com/stable/package_esp8266com_index.json linkini yapıştırıyoruz.

ESP8266 kütüphanesini IDEye kurduktan sonra programımız, kartımızı kodlamaya uygun hale gelmiş oluyor

Devamında uygun kartı ve portu seçiyoruz;

Devre Şeması
Kartımızın GND ve VCC bağlatılarını röle kartımıza yapıyoruz, D1 ve D2 kodumuzda 5. ve 6. çıkışa denk geliyor.


Kod Bloğu
Kodun içerisindeki; “ssid”, “password” ve “output4”, “output5” gibi yerleri istediğiniz gibi değiştirebilirsiniz.
ssid kısmına WiFi ağınızın adını
password kısmına WiFi ağınızın şifresini
output kısımlarını istediğiniz çıkışları yazın.
#include <ESP8266WiFi.h> const char* ssid = "WiFi_Ag_Adiniz"; const char* password = "WiFi_Sifreniz"; WiFiServer server(80); String header; String output5State = "kapali"; String output4State = "kapali"; const int output5 = 5; const int output4 = 4; unsigned long currentTime = millis(); unsigned long previousTime = 0; const long timeoutTime = 2000; void setup() { Serial.begin(115200); pinMode(output5, OUTPUT); pinMode(output4, OUTPUT); digitalWrite(output5, LOW); digitalWrite(output4, LOW); Serial.print("Baglaniliyor "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi baglandi."); Serial.println("IP adresi: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ WiFiClient client = server.available(); if (client) { Serial.println("Yeni baglanti."); String currentLine = ""; currentTime = millis(); previousTime = currentTime; while (client.connected() && currentTime - previousTime <= timeoutTime) { currentTime = millis(); if (client.available()) { char c = client.read(); Serial.write(c); header += c; if (c == 'n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); if (header.indexOf("GET /5/acik") >= 0) { Serial.println("GPIO 5 aktif"); output5State = "acik"; digitalWrite(output5, HIGH); } else if (header.indexOf("GET /5/kapali") >= 0) { Serial.println("GPIO 5 pasif"); output5State = "kapali"; digitalWrite(output5, LOW); } else if (header.indexOf("GET /4/acik") >= 0) { Serial.println("GPIO 4 acik"); output4State = "acik"; digitalWrite(output4, HIGH); } else if (header.indexOf("GET /4/kapali") >= 0) { Serial.println("GPIO 4 kapali"); output4State = "kapali"; digitalWrite(output4, LOW); } client.println("<!DOCTYPE html><html>"); client.println("<head><meta name="viewport" content="width=device-width, initial-scale=1">"); client.println("<link rel="icon" href="data:,">"); client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #2de615; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #e00914;}</style></head>"); client.println("<body><h1>ESP8266 devreyakan IoT</h1>"); client.println("<p>GPIO 5 </p>"); if (output5State=="kapali") { client.println("<p><a href="/5/acik"><button class="button">ACIK</button></a></p>"); } else { client.println("<p><a href="/5/kapali"><button class="button button2">KAPALI</button></a></p>"); } client.println("<p>GPIO 4 </p>"); if (output4State=="kapali") { client.println("<p><a href="/4/acik"><button class="button">ACIK</button></a></p>"); } else { client.println("<p><a href="/4/kapali"><button class="button button2">KAPALI</button></a></p>"); } client.println("</body></html>"); client.println(); break; } else { currentLine = ""; } } else if (c != 'r') { currentLine += c; } } } header = ""; client.stop(); Serial.println("Sunucu kapandi."); Serial.println(""); } }
Seri Monitor Çıktısı

Kod Yükleme Aşamaları
Önceki yazımızda bahsettik fakat, tekrar olması açısından bir daha anlatıyoruz. Kodumuzu Arduino IDE‘ye yazdıktan sonra, doğru kart ve port seçeneği ile doğrudan yüklüyoruz, işlem bittikten sonra kartımızın RTS butonu ile tekrar başlatıyoruz.
Son Görüntüler
Performans Testleri
Sunucu Hız Testi
Öncelikle ESP8266 ‘nın ve testleri aldığım bilgisayarın modeme en fazla 1 metre uzaklıkta olduğunu belirteyim. Thread kavramlarını aynı anda toplam kaç indirme olduğunu belirtmek için kullandım, yani tek thread modunda sadece bir dosya indirirken, dört thread modunda toplamda dört adet dosya indirmeye çalıştım. Upload testi ise laptop üzerinden ESP8266’ya yüklemeye çalıştığım boş veri dosyasıydı, diğer indirilen verilerle benzer şekilde, boş veri dosyalarıydı. Ayrıca bu konu hakkında daha fazla bilgi edinmek için “single socket download” ve “multiple socket download” kavramlarını araştırabilir. Yani tek thread modundayken single socket download hızını, dört thread modundayken multiple socket download hızını ölçmüş olduk. Testi kendiniz yapmak isterseniz kodları ESP8266 ‘nın librarysinde örnek olarak bulabilirsiniz.

Derin Uyku ve Güç Tasarrufu
Normal şartlar altında ESP8266 nın boot süresi; V1.6 ve V1.7 sürümlerinde 155ms. Boot sectionunu tamamen kaldırdığımızda bu süre 130-140ms arasına düşmüş oluyor, ayrıca düşük enerji kullanımı gibi olumlu sebeplere yol açıyor. Bu sayede düşük kapasiteli pillerde veya projelerde sizleri bir seviye daha ileri götürmüş oluyor.
Boot Bölümlü

Boot Bölümsüz

Uzun Ömürlü Projeler İçin Batarya Seçimi
ESP8266ya batarya seçmeden önce, gerekli voltaj aralığı ve gereken akıma bakalım; ESP8266 operasyon voltajı en düşük 2.5V, en yüksek 3.6V olmalı, önerilen sabit voltaj ise 3.3V. Ayrıca kartımız anlık olarak en fazla 170mA akım çekebilmekte bu yüzden seçtiğimiz bataryanın deşarj oranı 170mA’den daha az olmamalı.
Şarj Edilemeyen Piller
Karbon-Çinko Piller
Hayatımızda en çok karşılaştığımız pillerdir, 1.5V volt değerindedirler. Boyutları AA, AAA ve 9V’tur. 9V’luk pil transistör olmadan kullanılmamalıdır.
Lityum Piller
Saat pili olarak bildiğimiz bu piller çinko-karbon piller gibi 1.5V voltaj değerine sahip. Boyutları AA, AAA’dır ayrıca buton şeklinde olan boyutlarında 3V gibi bir voltaj görülebilir.
Alkalin Piller
Bir çok boyutu 1.5V değerinde bazı modelleri 9V olarak görülebilir.
Şarj Edilebilen Piller
Lityum İyon Piller
En çok kullanılan şarjlı pillerden biri olan Li-Ion piller, 3.7V değerine sahiptir. Bir çok model ve boyutta örnekler vardır; AA, AAA, 18650.
Nikel-Metal Piller
Ni-MH piller AA ve AAA boyutundadır, voltaj çıkışları 1.2V değerindedir.
Nikel-Kadmiyum Piller
Ni-Cd piller AA ve AAA boyutundadır, voltaj çıkışları 1.2V değerindedir.
Şarjsız pillerden(Çinko ve Alkali) başlayalım, nerdeyse hepsi 1.5V çıkışa sahip, çalışma voltajı için iki pili seri bağlayarak 3V elde edebiliriz. Kartımız yaklaşık her iki pilde 1.25V değerine düşene kadar çalışacaktır. Tek pildeki 0.25V düşüş bizlere bataryanın kapasitesinin %25 gibi bir kısmının harcandığı anlamına gelecektir, fiyat olarak ucuz olsada, performans olarak isteğimizi pek karşılayamıyor. Kısacası kullanacağımız her hangi bir şarjlı Li-Ion/Ni-MH/Ni-Cd pil bizlere 70% verim sağlayacaktır. Pili seçerken düşük akım koruması gibi entegreleri devreye eklemeyi unutmayın.

Hızlı Bağlantılar İçin Statik IP
ESP8266 yı deep sleep modunda kullanırken bağlatılar geçici olarak kopar ve uyandığı zaman bağlanmak için DHCP ile yaklaşık 6 saniye harcar tabi ki bunun yanında çektiği akımda üst seviyelere çıkar. Statik Ip yöntemi ile bağlantılar kurduğumuzda ise bağlantı süresi yaklaşık 2 saniyeye düşmüş oluyor ayrıca yüksek miktarda enerji tasarrufu yapılmış olunuyor. Statik ip örneği için aşağıdaki kod bloğuna başvurabilirsiniz.
#include <ESP8266WiFi.h> const char* ssid = "********"; const char* password = "********"; IPAddress staticIP(192,168,1,22); IPAddress gateway(192,168,1,9); IPAddress subnet(255,255,255,0); void setup(void) { Serial.begin(115200); Serial.println(); Serial.printf("Bağlanılıyor.. %sn", ssid); WiFi.begin(ssid, password); WiFi.config(staticIP, gateway, subnet); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Baglanilan Adres: "); Serial.println(WiFi.localIP()); } void loop() {}
Over the Air Update (OTA) yani Havadan Programlama
Kartınıza fiziksel bir temasınız olmadığı durumlarda, OTA yani havadan programlama sizi büyük bir yükten kurtarabilir. OTA yazılımınızı karta serial port ile yükledikten sonra kullanıma hazır hale gelmiş oluyor. Fakat güvenilmeyen kaynak kodları kartınızda açıklar oluşturabilir. Kodu yükledikten sonra mutlaka güvenlik açıklarını test etmelisiniz, aksi halde sizin haricinizde kartınız kontrol edilebilir ve sisteminize, devrenize, projenize zarar verebilir.

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.