Nodemcu (esp8266) ile openweathermap.org 'un sağlamış olduğu api hizmeti ile illerin hava durumlarını nasıl çekebiliriz ona bakıyor olacağız. Daha önce youtube kanalımda bu konuyla alakalı bir video çekmiştim yazının sonuna video eklerim dileyenler videolu anlatımı da takip edebilirler.
openweather.org sitesine api-key için kaydolmanız gerekiyor. Kayıt işleminden sonra sisteme giriş yapıp Api-Keys menusunden yeni api-key'inizi oluşturabilirsiniz. Api-key 'iniz oluştuktan sonra bir web browser ile api-key'inizi test etmenizi öneririm çünkü aktif olması bazen 24 saati bulabiliyor. Web browser ile api-key'iniz ile veri çekebiliyorsanız keyiniz aktif olmuş ve kullanıma hazır demektir. Test etmek için aşağıda verdiğim url 'yi kullanabilirsiniz :
Api 'nin veri dönüş tipi json 'dur. Bilmeyenler için kısaca yazmış olalım;
Json Nedir?
JSON, JavaScript Object Notation 'ın kısaltılmış hali olup, basit veri yapılarını temsil etmek için tasarlanmış bağımsız bir veri değişim formatıdır. Apilerden elde edilen veriler genellikle json, xml gibi standartlaştırılmış veri tipleri olarak döner, Bir gömülü sistem mühendisi olarak bu tipe asla ihtiyaç duymayız ancak iş gömülü sistem ile dış dünyadan, internetten veya başka bir uygulamadan veri-alıp vermeye döndüğünde bu yapıları da bilmek gerekiyor.
Arduino ile json datayı ayıklamak için de bir kütüphanemiz mevcut, kod üzerinde projeye dahil ettiğim kütüphaneyi library manager ile yüklemeniz gerekiyor.
Nodemcu ile api kullanımında farklı ihtiyaçlarınız ya da çözemediğiniz apiler olursa yorumlarda yazabilirsiniz, vakit bulduğumda inceleyip yardımcı olmaya çalışırım.
Eğer videodaki kodu yazıp;
call to 'HTTPClient::begin' declared with attribute error: obsolete API, use ::begin(WiFiClient, url)
gibi bir hata alıyorsanız, getWebPage fonksiyonunu yukarıda yazıldığı gibi güncelleyin.
satırlarında bulunan bilgileri girmeniz gerekiyor, kartımızın bağlanacağı kablosuz ağa ait olan bilgiler kullandığınız wifi bağlantı noktasının ismi ve parolasıdır. Lütfen bu bilgileri çift tırnak içerisine yazdığınızdan emin olun.
Bu bilgileri girdikten sonra kodu kartımıza yükleyebiliriz. Yine Tools -> Board-> ESP8266 Boards menüsünden Generic ESP 8266 module seçili olduğundan ve Port kısmından karta ait doğru portu seçtiğinizden emin olun. Yüklemeyi gerçekleştirdikten sonra Arduino IDE üzerinden Tools -> Serial Monitor (Araçlar -> Seri Ekran) 'ü açarak, wifi modeminizin kartımıza tanımladığı ip adresine ulaşabiliriz.
NodeMCU erişim IP adresi
http://192.168.1.39/
benzeri bi metinle karşılaşacaksınız. adres kısmını kopyalayıp, internet tarayıcınızın adres kızmına yapıştırıp adrese erişim sağlıyoruz, şöyle bir görüntüyle karşılaşıyoruz:
Gördüğünüz sayfanın gelmesini sağlayan kodlar aşağıdaki kod içerisinde 72 ~ 84. ü satırlar arasında bulunmakta. Arduino IDE Kod Satır Numaraları Nasıl Açılır, bilmiyorsan buraya tıklayıp öğrenebilirsin. Aynı metodla HTML bilginize bağlı olarak daha etkili bir sayfa tasarlayabilirsiniz. Tek yapmanız gereken HTML kodlarınızı
client.println("");
fonksiyonula client nesnesine yazırmaktır. Basitçe yazdığımız bu HTML koduna bakacak olursak 3 tane buton eklemişiz ve butonlarımı da belirli adreslere a href ile yönlendirmişiz. Örnek olsun diye ilk satıra bakalım
burada buton tıklandığında, dikkat: mevcut host dizini içindeLED-ACIK içeriğini talep ediliyor, bu aslında tam olarak şu adrestir: http://192.168.1.39/LED_ACIK ,bunun tamamını bu şekilde yazmak daha garanti bir yazım olacaktır, bu durumda o anda hangi web dizininde olursa olsun, net olarak gitmesini istediğimiz adresi yazmış oluruz.
Peki bunu web serverimiz nasıl karşılar, yani webserverdan bu içerik talep edildiğinde ne yapacağını nasıl kodluyoruz. Bunun için bir request nesnemiz var. Bu nesne o anda web sitemizde dolaşanan kişinin "request" lerini tutuyor, ne demek bu; talep, yani kullanıcı bizden ne talep etmiş, LED-ACIK diye bir talebi var. Peki, bunu kontrol etmek için request nesnemizi kontrol etmemiz gerekiyor.
if (request.indexOf("/LED-KAPALI") != -1) {
digitalWrite(ledPin, LOW);
led = 0;
}
bu kodla kontrol ettiğimiz şey indexOf methodu gelen talebin içinde tırnak içine yazdığımız ifadenin olup olmadığıdır. -1 döndürmüşse bunun anlamı sorgumuz talepte yok demektir. -1 dışında gelen değer ise, talebin hangi karakterinde başladığı bilgisidir. Bu koşul için 0 dönecektir. Talebi karşıladığımıza göre süslü parantez içine bu talep geldiğinde nodeMcu 'ya ne yapması gerektiğini kodlayabiliriz. Ledi kapatacağız ledPin 'i low yapıyoruz. Bu kadar basit. Bir de ledin durumunu sayfada göstermek için led diye bir değişken tanımlamışız, sayfayı yazdığımız kod içerisinde de bunu 0 ya sönük 1 se yanıyor olarak bastırmışız. Kodun tamamı aşağıda yer alıyor :
/*
* ServerLEDControl.ino
*
* Led control over NodeMcu webserver
*
* Author Hakan ÖZMEN
* 21.03.2021
*
* www.devrelerim.com
* www.youtube.com/HakkanR
* video of code : https://youtu.be/U-U49xkXW6o
*/
#include <ESP8266WiFi.h>
const char* ssid = ""; // Bağlanılacak Wifi Adı
const char* pwd = ""; // Bağlanılacak Wifi Şifresi
uint8_t ledPin = 4;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
//Wifi bağlantısı
Serial.println();
Serial.print(ssid);
Serial.println(" erişim noktasına bağlanılıyor.");
WiFi.begin(ssid, pwd);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
server.begin();
Serial.println("Sunucu başlatıldı.");
Serial.println("NodeMCU erişim IP adresi");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
WiFiClient client = server.available();
if (!client) return;
Serial.println("Bir kullanıcı sunucuya bağlandı.");
while (!client.available()) delay(1);
boolean led = 0;
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
if (request.indexOf("/LED-KAPALI") != -1) {
digitalWrite(ledPin, LOW);
led = 0;
}
if (request.indexOf("/LED-ACIK") != -1) {
digitalWrite(ledPin, HIGH);
led = 1;
}
if (request.indexOf("/LED-BLINK") != -1) {
for (uint8_t a = 0; a<3; a++)
{
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
led = 0;
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html;charset=utf-8");
client.println("<!DOCTYPE HTML>");
client.println("");
client.println("<html>");
client.print("<h1>Led Şuanda ");
if (led) client.println("YANIYOR");
else client.println("YANMIYOR-SÖNÜK");
client.println("</h1><a href='/LED-ACIK'><button>Ledi YAK</button></a>");
client.println("<a href='/LED-KAPALI'><button>Ledi KAPAT</button></a>");
client.println("<a href='/LED-BLINK'><button>Led BLINK</button></a>");
client.println("</html>");
delay(1);
Serial.println("Kullanıcı bağlantısı kesildi.");
}
Merak ettiğiniz herhangi bir şeyi yorumlarda sormaktan lütfen çekinmeyin.