Nesnelerin İnterneti etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Nesnelerin İnterneti etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

NodeMcu Internetten veri çekme | Hava Durumu openweather.org api

 Esp8266 Api ile Hava Durumunu Çekme

    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 :

http://api.openweathermap.org/data/2.5/weather?units=metric&q=istanbul&appid=apikeyiniz

apikeyiniz ifadesi yerine api-key'inizi yazmanız gerekiyor. Eğer key aktif olmuşsa görmeniz gereken sonuç şu şekilde olacaktır :

{"coord":{"lon":28.9833,"lat":41.0351},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"base":"stations","main":{"temp":8.73,"feels_like":5.25,"temp_min":7.81,"temp_max":9.09,"pressure":1018,"humidity":87},"visibility":10000,"wind":{"speed":7.2,"deg":350},"clouds":{"all":100},"dt":1673541249,"sys":{"type":1,"id":6970,"country":"TR","sunrise":1673501281,"sunset":1673535355},"timezone":10800,"id":745042,"name":"Istanbul","cod":200}

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.


Kod şu şekilde olacak :
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Arduino_JSON.h>

const char* ssid = ""; // Wifi kullanıcı adını yazın
const char* pwd = ""; //Wifi parolanızı yazın
String city = "istanbul"; // hava bilgisini almak istediğiniz şehri yazın

String Apikey = ""; //openweathermap.org apikeyinizi girin
String owmWeb = "http://api.openweathermap.org/data/2.5/weather?units=metric&q=" + city + "&appid=" + Apikey;
void setup() {
  Serial.begin(115200);
  Serial.print(ssid);
  Serial.println(" bağlanıyor.");
  WiFi.begin(ssid, pwd);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println(" bağlandı.");
}

void loop() {
 String owmJson = getWebPage(owmWeb.c_str());
 JSONVar jsonData = JSON.parse(owmJson);
 if (JSON.typeof(jsonData) == "undefined")
 {
  Serial.println("Json data ayıklanamadı.");
  return;
 }
 Serial.print ("Şehir : ");
 Serial.println(city);
 Serial.print("Sıcaklık : ");
 double temp = (jsonData["main"]["temp"]);
 Serial.println(temp);
 Serial.print("Hissedilen : ");
 double feels_like = (jsonData["main"]["feels_like"]);
 Serial.println(feels_like);
 Serial.print("Nem : ");
 double humidity = (jsonData["main"]["humidity"]);
 Serial.println(humidity);
 Serial.print ("Rüzgar Hızı : ");
 double windSpeed = (jsonData["wind"]["speed"]);
 Serial.println(windSpeed);
 Serial.print("Rüzgar Yönü : ");
 double windDeg = (jsonData["wind"]["deg"]);
 Serial.println(windDeg);
 //weather altında bir nesneye ulaşmak için
 JSONVar whDescJ = (jsonData["weather"][0]["description"]);
 Serial.print("description");
 Serial.println(whDescJ);
 delay(5000);
}

String getWebPage(const char* address)
{
  WiFiClient wfc;
  HTTPClient http;
  http.begin(wfc,address);
  int httpCode = http.GET();
  Serial.println(httpCode);
  String payload = http.getString();
  return payload;
}


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.

Herkese kolay gelsin!

Nesnelerin İnterneti IoT Esp8266 Webserver

NodeMCU kullanarak oluştuğumuz webserver ile, Esp8266 kart üzerindeki lede komutlar göndereceğiz.

Aşağıda yer alan kod üzerinde yer alan 

const char* ssid = ""; // Bağlanılacak Wifi Adı
const char* pwd = ""; // Bağlanılacak Wifi Şifresi

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 
  client.println("</h1><a href='/LED-ACIK'><button>Ledi YAK</button></a>");

burada buton tıklandığında, dikkat: mevcut host dizini içinde LED-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.
Konuyu Youtube Kanalımda detaylı anlattım dilerseniz bağlantıya tıklayarak izleyebilirsiniz:




Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...