Arduino ile İftar vakitlerinde yanan bir ışık yapmak istiyorum

Ben arduino ve rtc modül ile sadece iftar vakitlerinde yanan bir ışık yapmak istiyorum. chatgpt ye sorduğumda praytimes kütüphanesi indirmem gerektiğin söyledi ama tam bulamadım. Bunu nasıl yapacağımı ve bu kütüphaneyi nasıl indireceğimi söyleyebilir misiniz? ayrıca Sivas’da yaşıyorum, Sivas için praytimes kütüphanesi var mıdır?

NodeMCU V3 ESP8266 kartıyla odamdaki ledlerim için bu tarz bir proje yaptım. Bir sonraki vakte kalan süreyi gösteriyor. Anlatacağım şekilde IMSAK , GÜNEŞ , OGLE , IKINDI , AKSAM ve YATSI vakitlerini çekip dilediğin gibi kullanabilirsin.

Burada önemli olan iki durum var. Birincisi namaz vakitlerini çekeceğin kaynak. İkincisi ise saatin kaç olduğu bilgisini veren kaynak. İki durumda da aktif olarak internete bağlı olman gerekiyor.

Öncelikle ezanvakti herokuapp.com servisinden bulunduğun konumun takvimini veren bağlantıyı elde etmelisin. Bu adıma geçmeden önce verileri daha rahat okumanı kolaylaştırması için şu uzantıyı tarayıcına eklemeni tavsiye ediyorum.

Daha sonra http://ezanvakti.herokuapp.com bağlantısından vakitler bağlantısına tıklayın.
image

Buradaki linki kopyalayın. Ben istanbulda olduğum için benim linkim
http://ezanvakti.herokuapp.com/vakitler/9541 oluyor. Bulunduğunuz konuma göre linkin sonundaki ilçe kodu değişim gösterebilir. Elde ettiğiniz linki kod içerisinde islamiTakvimBaglantisi değişkeni olarak tanımlayacağız.

Bunun için kullanman geren kod bloğunu buraya bırakıyorum :
Burada değiştirmen gereken bazı yerler var.
1- SSID ve SSPASS kısımları. İnternete kablosuz bağlanmak için modem adı ve şifresi
2-GMT değişkeni. Saatin nereye göre hesap edileceği , Türkiye için +3
3- islamiTakvimBaglantisi değişkeni.

#define ARRAY_SIZE(array) ((sizeof(array))/(sizeof(array[0])))

// Wifi bağlantısı için tanımlamalar
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#define SSID "modem adı"
#define SSPASS "modem şifresi"
/***********************/

// Saat verisi için tanımlamalar
#include <NTPClient.h>
#include <WiFiUdp.h>
WiFiUDP ntpUDP;
const byte GMT = 3; // Buraya saatini çekmek istediğiniz bölgenin GMT değerini girin. Türkiye için GMT değeri +3 ' tür.
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600*GMT);
/***********************/


// Namaz vakti verisi için tanımlamalar
const String islamiTakvimBaglantisi = "http://ezanvakti.herokuapp.com/vakitler/9541"; // Buraya islami vakitleri çekmek istediğiniz bölgenin bağlantısını girin
#include <ESP8266HTTPClient.h>
#include <AsyncJson.h>
#define SAAT 0
#define DAKIKA 1
#define IMSAK 0
#define GUNES 1
#define OGLE 2
#define IKINDI 3
#define AKSAM 4
#define YATSI 5
int namazVakti[6][2];
/***********************/

void setup() {
  Serial.begin(9600);
  delay(1000);
  wifiBaglan();
  prayerTimesUpdate();



}

void loop() {
  timeClient.update();
  Serial.print("Tarih : ");
  Serial.print(timeClient.getHours());
  Serial.print(":");
  Serial.print(timeClient.getMinutes());
  Serial.print(":");
  Serial.print(timeClient.getSeconds());
  Serial.print("  |  Vaktin çıkmasına kalan süre : ");

  uint8_t onumuzdekiVakit = birSonrakiVakit();
  long kalanSaniye = vaktinCikmasinaKalanSure(onumuzdekiVakit);

  Serial.print(kalanSaniye);
  Serial.print(" saniye");
  delay(10000);
}

void wifiBaglan(){
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, SSPASS);
  Serial.println("");

  // Bağlantı bekleniyor.
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print(SSID);
  Serial.println(" ağına bağlanıldı.");
  Serial.print("IP adres : ");
  Serial.println(WiFi.localIP());
}

void prayerTimesUpdate() {

  if ((WiFi.status() == WL_CONNECTED)) {
    WiFiClient client;
    HTTPClient http;

    http.begin(client, islamiTakvimBaglantisi);
    int httpCode = http.GET();

    if (httpCode > 0) {
      gununNamazVakitleriniCek(http.getString());
      Serial.println("Namaz vakitleri çekildi");
    }
    else
    {
      Serial.println("Namaz vakiti sunucusuna gönderilen istekte hata oluştu.");
    }

    http.end();
  }
}
void gununNamazVakitleriniCek(String data) {
  koseliParantezKaldir(data);
  ilkJsonTaniminiBul(data);

  DynamicJsonDocument doc(2048);
  deserializeJson(doc, data);
  JsonObject JSONnamazVakti = doc.as<JsonObject>();
  String vakitler[6] = {"Imsak","Gunes","Ogle","Ikindi","Aksam","Yatsi"};
  for ( byte i = 0 ; i < 6 ; i ++ ) {
    
    String stringVakit = JSONnamazVakti[vakitler[i]].as<String>();
    byte ayrac = stringVakit.indexOf(":");
    namazVakti[i][0] = stringVakit.substring(0, ayrac).toInt();
    namazVakti[i][1] = stringVakit.substring(ayrac + 1, stringVakit.length()).toInt();
    Serial.print(namazVakti[i][0]);
    Serial.print(":");
    Serial.println(namazVakti[i][1]);
  }
}
void ilkJsonTaniminiBul(String & data) {

  int baslangic = data.indexOf("{");
  int bitis = data.indexOf("},{");
  if ( bitis == -1 )
    bitis = data.indexOf("}");

  bitis++;
  data = data.substring(baslangic, bitis);
}
String koseliParantezKaldir(String data) {
  int baslangic = data.indexOf("[");
  int bitis = data.lastIndexOf("]");

  if ( baslangic != -1 && bitis != -1 )
    return data.substring(baslangic + 1, bitis);

  return data;
}


long zamaniSaniyeyeCevir(int saat , int dakika = 0 , int saniye = 0){
  return saat * 3600 + dakika * 60 + saniye;
}

long vaktinCikmasinaKalanSure(byte Vakit){
  long vakitZamani_sn = zamaniSaniyeyeCevir(namazVakti[Vakit][SAAT] , namazVakti[Vakit][DAKIKA]);
  long simdikiZaman_sn =  zamaniSaniyeyeCevir(timeClient.getHours(),timeClient.getMinutes(),timeClient.getSeconds());
  long kalanSure = vakitZamani_sn - simdikiZaman_sn;
  if ( kalanSure < 0 ){
    kalanSure += zamaniSaniyeyeCevir(24);
  }
  return kalanSure;
}
uint8_t birSonrakiVakit(){
  timeClient.update();
  long simdikiZaman_sn =  zamaniSaniyeyeCevir(timeClient.getHours(),timeClient.getMinutes(),timeClient.getSeconds());
  uint8_t birSonrakiVakit = 0; 
  for(byte i = 0 ; i < ARRAY_SIZE(namazVakti) ; i++){
    if ( zamaniSaniyeyeCevir(namazVakti[i][SAAT] , namazVakti[i][DAKIKA]) < simdikiZaman_sn ){
      birSonrakiVakit = i+1;
    }
  }
    
  if ( birSonrakiVakit == ARRAY_SIZE(namazVakti) ){
    birSonrakiVakit = 0;
  }
  return birSonrakiVakit;
}

Vakitlere teker teker erişmek istersen şu şekilde erişebilirsin;

namazVakti[IMSAK][SAAT]
namazVakti[IMSAK][DAKIKA]

namazVakti[GUNES][SAAT]
namazVakti[GUNES][DAKIKA]

namazVakti[OGLE][SAAT]
namazVakti[OGLE][DAKIKA]

namazVakti[IKINDI][SAAT]
namazVakti[IKINDI][DAKIKA]

namazVakti[AKSAM][SAAT]
namazVakti[AKSAM][DAKIKA]

namazVakti[YATSI][SAAT]
namazVakti[YATSI][DAKIKA]

Gerçekten çok güzel bir proje, hem faydalı hem mantıklı, elinize sağlık.
Bu NodeMCU V3 ESP8266 kart bilgisayara bağlı değilkende internet üzerinden veri almayı mı sağlıyor? Bu kart olmadan kodda saatleri ayarlayasam.

Bahsettiğim kartın üzerinde Wifi modülü var. Onu kullanarak internete bağlanıyor. Oradan da hem anlık saati hemde namaz vakti verisini çekebilme imkanı doğuyor.

Kodla saatleri ayarlasan bile anlık saati çekemezsin. Karta çalışmaya başladığı saati girip ne kadar süre geçtiyse üstüne ekleyerekte anlık saate ulaşabilirsin ama sanırsam bu ufakta olsa hatalara yol açabilir. Bu konuda ayrıntılı bir fikrim yok ama bildiğim kadarıyla cihaz ne kadar süredir çalıştığını uzun vade de hatalı gösterecektir. [ millis() komutundan bahsediyorum]

NodeMCU V3 ESP8266 yerine NodeMCU V3 ESP8266 ESP-12E Geliştirme Kartı - CH340 kullanabilir miyim?
Ayrıca bir sorum olacak; anlık saati rtc modülden alsam (zaten o saati sayıyor her zaman doğru bilgi verecektir), sadece iftar vakti verisini bu modülden alsam olmaz mı?

Evet kullanabilirsin. Burada önemli olan internete bağlanabilmen. Cihazı kullanacağın yerde internet ağı , modem falan var değil mi ?