nodemcu etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
nodemcu etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Nodemcu Namaz Vakitlerini Çekme | namaz vakitleri api

 Nodemcu (esp8266) ile İnternetten Namaz Vakitlerini Çekme

Nodemcu ile nesnelerin interneti projelerinde yeni bir yazıdan herkese merhaba, İnternetten namaz vakitlerini çekebileceğimiz bir api servisi mevcut, biraz uğraştırıcı oldu ama api'yi nodemcu 'ya da çalıştırabildim. Uğraştırıcı olmasının nedeni api 'yi kullanırken bir cookie set etmek gerekiyor olması, neyseki bu sayede nodemcu ile cookie kullanımına da bir örnek niteliğinde olacak bu yazı.

    Servisimiz https://www.namazvakitleri.site adresinde yer alıyor, web sitesine girdiğinizde footer (web sitenin en alt kısmında yer alan link barı) linklerinden web api sayfasına ulaşabilirsiniz. Kısa bir kayıt işleminden sonra api-key'imiz mail adresimize ulaşıyor ve hemen kullanmaya başlayabiliyoruz.


Namazvakitleri api de iki tane servis mevcut biri, Türkiye iller listesini veren api servisi, ihtiyacınız olursa onu da kullanabilirsiniz, diğeri de api parametreleriyle belirlenen ile ait sorgunun yapıldığı gün tarihli ezan vakitlerini döndüren api servisi. Sonuçlar json formatında dönüyor, yani yine projemizde Arduino_json kütüphanesini kullanıyor olacağız. Ayrıca websitesinde slowAES koruması olduğu için test cookie bypass için slowAES kütüphanesini Arduino library manager ile indirmeniz gerekiyor.

Eğer servise kayıt olup api-key 'inizi aldıysanız devam edelim, apiyi browserda test edip api-key 'imizin çalıştığından emin oluyoruz, sitede belirtildiğine göre izlenmesi gereken url şu şekilde olmalı :

http://www.namazvakitleri.site/api/api.php?api=vakitler&il=istanbul&api-key=apikeyiniz

apikeyiniz ifadesini epostayla size ulaşan api-key ile değiştirin, görmeniz gereken sonuç şu şekilde :

{"imsak":"06:50:00","gunes":"08:21:00","ogle":"13:17:00","ikindi":"15:41:00","aksam":"18:03:00","yatsi":"19:28:00","tarih":"2023-01-13","iladienqs":"istanbul","activeTimeIndex":6}
İl isimlerini girerken türkçe karakter kullanmadan küçük harflerle yazmak gerekiyor, mesela Ağrı için agri, Afyon, afyonkarahisar, kahramanmaras, balikesir gibi..ActiveTimeIndex değeri sunucu saatine göre -Türkiye saatine ayarlanmış- sorgunun yapıldığı anda hangi vakit içerisindeyiz onun sayısal değerini veriyor; imsak için 1, yatsi için 6 değeri geliyor.


Koda gelecek olursak şu şekilde olacak : 

/**
 * @file infinityFree.ino
 * @author Hakan ÖZMEN (hakkanr@gmail.com)
 * @brief
 * the website given this example is hosted on InfinityFree Servers
 * You can use this example any of website hosted on InfinityFree.
 * This example get praytimes for Turkey/Istanbul city,
 * 
 * You should get an apikey from web site by registering apikey form:
 * http://www.namazvakitleri.site/api/apireg.php
 * 
 * when you've got an e-mail which contains your api key, put your
 * apiKey below. For more details about using api please visit :
 * http://www.namazvakitleri.site/api/index.php
 * 
 * @version 1.0.0
 * @date 2023-02-05
 *
 * @section for more information please visit :
 * https://www.devrelerim.com/2023/01/nodemcu-namaz-vakitlerini-cekme.html
 * https://www.youtube.com/HakkanR
 * https://github.com/HakkanR/slowAES
 *
 * @copyright BDS License, all above text must be included any redistribution.
 *
 */
#include <Arduino.h>
#include <slowAES.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Arduino_JSON.h>
const char *ssid = "";		  // Wifi SSID
const char *pwd = ""; // Wifi password
String apiKey = ""; //apiKey
String web = "http://www.namazvakitleri.site/api/api.php?api=vakitler&api-key=" + apiKey + "&il=istanbul";
HTTPClient http;
WiFiClient wfc;

void setup()
{
	Serial.begin(115200);
	Serial.print(ssid);
	Serial.println(" connecting.");
	WiFi.begin(ssid, pwd);
	while (WiFi.status() != WL_CONNECTED)
	{
		Serial.print(".");
		delay(500);
	}
	Serial.println(" connected.");
	http.begin(wfc, web);

	int httpCode = http.GET();
	Serial.println(httpCode);
	String payload = http.getString();

	/* getting abc vars */
	int loc = payload.indexOf("var a=toNumbers(");
	String temp = payload.substring(loc, temp.length());
	temp.replace("var a=toNumbers(\"", "");
	String a = temp.substring(0, 32);

	temp.replace(a + "\"),b=toNumbers(\"", "");
	String b = temp.substring(0, 32);

	temp.replace(b + "\"),c=toNumbers(\"", "");
	String c = temp.substring(0, 32);

	uint8_t aNums[16];
	uint8_t bNums[16];
	uint8_t cNums[16];

	toNumbers(a.c_str(), aNums);
	toNumbers(b.c_str(), bNums);
	toNumbers(c.c_str(), cNums);

	uint8_t finalCookie[33];
	slowAES _slowAES;
	uint8_t resNums[16];
	_slowAES.decrypt(cNums, aNums, bNums, resNums);
	toHex(resNums, finalCookie);
	String str = (char *)finalCookie;

	web = web + "&i=1";
	Serial.println(web);
	http.begin(wfc, web);
	String fullCookieStr = "__test=" + str;
	http.addHeader("Cookie", fullCookieStr, true);
	http.addHeader("Host", "www.namazvakitleri.site", true);
	http.addHeader("Connection", "Keep-Alive", true);

	httpCode = http.GET();
	Serial.println(httpCode);
	payload = http.getString();
	Serial.println(payload);
	// and parse the JSON
 JSONVar jsonData = JSON.parse(payload);
  if (JSON.typeof(jsonData) == "undefined")
  {
    Serial.println("Json data ayıklanamadı.");
    return;
  }
  String imsak = (const char*)(jsonData["imsak"]);
  String gunes = (const char*)(jsonData["gunes"]);
  String ogle = (const char*)(jsonData["ogle"]);
  String ikindi = (const char*)(jsonData["ikindi"]);
  String aksam = (const char*)(jsonData["aksam"]);
  String yatsi = (const char*)(jsonData["yatsi"]);
  Serial.print("imsak : "); Serial.println(imsak);
  Serial.print("gunes : "); Serial.println(gunes);
  Serial.print("ogle : "); Serial.println(ogle);
  Serial.print("ikindi : "); Serial.println(ikindi);
  Serial.print("aksam : "); Serial.println(aksam);
  Serial.print("yatsi : "); Serial.println(yatsi);
  delay(1000000);
}

void loop()
{
	// nothing goes here!
}


Kafanıza takılan herhangi bir şeyi yorumlarda sorabilirsiniz, herkese kolay gelsin.


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!

DIY Wifi Çekim Alanını Genişlet | wifi repeater

NodeMCU Wifi Repeater

NodeMCU IoT geliştirme kartını kullanarak bir wifi repeater uygulaması gerçekleştirebilirsiniz. Bu sayede evinizde ya da iş yerinizde wifi sinyalinin zayıfladığı yerlere geliştirme kartını mikro usb uçlu bir telefon şarjına takarak wifi çekim alanınızı sorunsuz bir şekilde genişletebilirsiniz. Pinlerin açıkta olması ve bir şekilde kısadevre olmaması için pinlerin olduğu bölüme pinleri kapatacak uzunluğa sahip sert bir sünger takabilirsiniz. Uğraşmayı seven biriyseniz pleksi glass ya da benzeri bir ürünle bir kutu da tasarlayıp içerisine yerleştirebilrsiniz, bu durumda geliştirme kartının anten kısmının dışarda kalmasına özen gösterin, ayrıca metal kutular kullanmanın da performansını olumsuz yönde etkileyeceğini unutmayın. Aşağıda videoda yapılışını izleyebileceğiniz proje ESP8266 ve ESP8285 ile uyumludur. Keyifli seyirler dilerim.


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