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.

NodeMCU ESP8266 Kullanımı ve Fonksiyonları
NodeMCU ESP8266 Kullanımı ve Fonksiyonları

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.

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 1

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

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 1

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

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 1

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.

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2 nodemcu esp8266,nodemcu esp866 kullanımı,nodemcu esp8266 fonksiyonları
NodeMCU ESP8266 Relay Kartı Şeması
NodeMCU ESP8266 Kullanımı ve Fonksiyonları

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ı

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2 nodemcu esp8266,nodemcu esp866 kullanımı,nodemcu esp8266 fonksiyonları

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.

ESP8266 WiFi Test

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ü

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2 nodemcu esp8266,nodemcu esp866 kullanımı,nodemcu esp8266 fonksiyonları

Boot Bölümsüz

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2 nodemcu esp8266,nodemcu esp866 kullanımı,nodemcu esp8266 fonksiyonları

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.

Batarya Kıyaslaması

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.

NodeMCU ESP8266 Kullanımı ve Fonksiyonları : Bölüm 2 nodemcu esp8266,nodemcu esp866 kullanımı,nodemcu esp8266 fonksiyonları

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.