Alperen programından aldığımız ezan vakitlerini C için tabloya dönüştürmek benim baya zamanımı aldı notepad++ ile bunu kolaylaştırdım makro haline getirdim bulunduğunuz yerin yillik imsakiyesini oluşturduktan sonra .txt yi C ye uygun tabloya dönüştürmek için bir makro hazırladığım.
Tabloda vakitler 2 byte olarak saklanıyor saat 1 byte, dk 1byte, her vakit int olarak saklanıyor.
Bir yıllık tablo 3720 byte tutmakta.
Tüm dosyalar linkde mevcut nasıl oluşturulacağına dair bir açıklamada içerisinde.
Ezan vakitleri ile ilgili proje geliştirecek olanlara sunuyorum.
http://www.fileserve.com/file/KyWShyg
örnek kod:
const unsigned int tablo_2011[12][31][5] = {
/* ŞEHİR : İzmir / Türkiye
PARALEL : 38.40° KUZEY
MERİDYEN : 27.15° DOĞU
SAAT FARKI : +2.00
TARİH : Ocak 2011
YAZ SAATİ : Var
KIBLE AÇISI : 143.6°
PUSULA SAPMASI : 4.2°
İMSK ÖĞLE İKND AKŞM YATSI
--- ---- ---- ---- ---- */
{
652,1322,1548,1809,1933,
652,1322,1549,1810,1933,
652,1323,1550,1811,1934,
652,1323,1551,1812,1935,
652,1324,1552,1812,1936,
652,1324,1552,1813,1937,
653,1324,1553,1814,1937,
653,1325,1554,1815,1938,
653,1325,1555,1816,1939,
653,1326,1556,1817,1940,
.
.
.
Koordinat tespitine yarayan VB kodu vardı elilmde, adam güzel yapmış, tüm dünya ülkelerinin ilçe ilçe koordinatlarını alabiliyorsunuz, exe haline ben getirdim,
Exe kurulum dosyası http://hotfile.com/dl/114976010/106abae/GeoMaker.exe.html
VB source codes http://hotfile.com/dl/114950511/87a5d99/GeoMaker.rar.html
Türkiye datası http://hotfile.com/dl/114976107/6171d97/TU_yedek.rar.html
hocam kurduktan sonra "MSINET.OCX" ve"TABCTL32.OCX" dosyalarını istedi aşşağıdaki linklerden indirip program klasörüne yapıştırıp çalıştırdım.
http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/M/MSINET.OCX/6.01.9782/download.html
http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/T/TABCTL32.OCX/6.01.9782/download.html
Alperen programı içinde bir exel tablosu var türkiye için ben onu kullanıyordum buda iyiymiş teşekkürler.
X-Fi,
Başlangıçtan itibaren zaman farkları tutularak tablo çok daha küçük bir alana sığdırılabilir. Günlük maksimum zaman farkı ne kadardır bilmiyorum ama max 4 dakika ise 1KB ın altına bile inmek mümkün görünüyor.
Alıntı Yap"MSINET.OCX" ve"TABCTL32.OCX" dosyalarını istedi
OCX kullandığını farkedemedim, derleyip göndermiştim, düzelttim, linki de yeniledim.
Ayrıca TR datalarını da programa indirtip dosya olarak yükledim (yukarıda). Program kodları internetten çekerken biraz zaman alıyor. Hazır dosyayı indirmek daha kolay.
Alıntı yapılan: iyildirim - 19 Nisan 2011, 01:37:01
X-Fi,
Başlangıçtan itibaren zaman farkları tutularak tablo çok daha küçük bir alana sığdırılabilir. Günlük maksimum zaman farkı ne kadardır bilmiyorum ama max 4 dakika ise 1KB ın altına bile inmek mümkün görünüyor.
hocam hepsi değişiyor zaman aralıklarını kontrol ettim hiçbirisi kesin değil durum böyle olunca en uygun sıkıştırma bu oluyor.
En baştaki zamanları biliyorsak, her vakit için bir byte kullanarak bir gün önceye +-128 dakikaya kadar zaman eklenerek bugüne ulaşılabilir, bu durumda her vakit için 2 değil bir byte tutmuş oluruz. Hatta iki vakti bir byte da tutmak, bit işlemleri de yapmak mümkün.. Nasıl olsa hesap için yeterli süre var.
evet programda vakitleri günde 1 sefer hesaplıyorum hesap zamanı 1sn ye kadar uzayabilir ancak söylemek istediğiniz sadeleştirme yolunu çözemedim
dün bugün yarin izmir ödemiş için ezan vakitleri
GÜN İMSAK GÜNEŞ İŞRAK İSTİVA ÖĞLE İKİNDİ ASR-I İSFİRAR AKŞAM YATSI
18. 04:53 06:22 07:09 12:20 13:15 16:56 17:56 19:16 19:55 21:18
19. 04:51 06:21 07:08 12:20 13:14 16:56 17:57 19:17 19:55 21:19
20. 04:49 06:19 07:07 12:20 13:14 16:56 17:57 19:18 19:56 21:20
bana bunları sadeleştirebilirmisiniz?
Başlangıç verisi yani ilk gün zaman olarak tam tutulacak.. Devam eden günler de bir gün önceye göre zaman farkı olarak.. Bu durumda her vakit için bir byte da +- 128 dakika girilebilir.
GÜN İMSAK GÜNEŞ İŞRAK İSTİVA ÖĞLE İKİNDİ ASR-I İSFİRAR AKŞAM YATSI zaman farkları
18. 04:53 06:22 07:09 12:20 13:15 16:56 17:56 19:16 19:55 21:18 04:53 06:22 07:09 12:20 13:15 16:56 17:56 19:16 19:55 21:18
19. 04:51 06:21 07:08 12:20 13:14 16:56 17:57 19:17 19:55 21:19 -2 -2 -1 0 -1 0 +1 +1 0 +1
20. 04:49 06:19 07:07 12:20 13:14 16:56 17:57 19:18 19:56 21:20 -2 -2 -1 0 0 0 0 +1 +1 +1
gibi...
Sanırım günlük 5 vakit hesaplıyorsun. Yoksa her vakite 2 byte hesabından 3700 byte dan fazla tutardı. Bu şekilde her vakite bir byte harcayarak 1.8K civarında RAM yeterli olur.
Eğer her vakite 4 bit harcanırsa 1bit işarete 3 bit de sayıya kalır ve günlük zaman farkı limiti 8 dakika yapar. Bu da ancak vakitlerde max günlük 8dakika zaman farkı oluyorsa uygulanabilir..
şimdi anladım yılda 1 gün tam yazılsa gerisi + ve -
ama bunu txt den kullanıma hazır tablo haline nasıl hesaplatıp dönüştürebilirim onu düşüyorum.
bulursam yazarım.
Basit bir programla yapılabilir. Orijinal tablo okunup datediff gibi bir komut kullanılarak hesaplar yapılabilir. Tabii biraz da string işlemi olacak.
VB6 ile bir şeyler karaladım. Stop, debug vs kalmış olabilir. Br forma bir buton yerleştirip, formun koduna tüm kodun yapıştırılması yeterli. İslenecek dosyayı app.path ister.
Option Explicit
Dim sVakitler(366, 10) As String
Dim lVakitler(366, 10) As String
Private Function findCharBetween_X(Position As Long, sTmp As String, sChr1 As String, sChr2 As String, IncludePrefStr As Boolean, IncludePostStr As Boolean, Optional Count As Long) As String
Dim i As Long
Dim j As Long
Dim k As Long
Dim sTmp1 As String
Dim IncPref As Integer
Dim IncPost As Integer
If IncludePrefStr Then IncPref = 0 Else IncPref = Len(sChr1)
If IncludePostStr Then IncPost = Len(sChr2) Else IncPost = 0
findCharBetween_X = ""
If Position > 0 Then
i = Position + 1
Else
i = 1
End If
k = 0
If Count = 0 Then k = -1
Do
i = InStr(i, sTmp, sChr1, vbTextCompare)
If i Then
j = InStr(i + Len(sChr1), sTmp, sChr2, vbTextCompare)
If j Then
k = k + 1
If k = Count Then
Position = i
findCharBetween_X = Mid(sTmp, i + IncPref, j - i + IncPost - IncPref)
Exit Do
End If
i = i + 1
Else
Exit Do
End If
Else
Exit Do
End If
Loop
End Function
Private Sub Command1_Click()
Dim Max As Long
Dim Min As Long
Dim Pos As Long
Dim Gun As Long
Dim Vakit As Long
Dim FSize As Long
Dim sFile As String
Dim sTmp As String
Dim lTmp As String
Dim sLine As String
Dim sVakit As String
Open App.Path & "\ALP_TR.txt" For Binary As #1
FSize = LOF(1)
sFile = String(FSize, 0)
Get #1, 1, sFile
Close #1
sTmp = sFile
sVakit = ""
Do
sLine = findCharBetween_X(0, sTmp, "---", Chr(12), True, False)
If sLine = "" Then Exit Do
sTmp = Replace(sTmp, sLine, "")
sVakit = sVakit & sLine
Debug.Print sLine
Loop
sTmp = Replace(sVakit, "-", "")
sTmp = Replace(sTmp, vbCrLf, vbCr)
sTmp = Replace(sTmp, vbLf, vbCr)
sTmp = Replace(sTmp, vbCr & vbCr, vbCr)
sTmp = Replace(sTmp, " ", " ")
sTmp = Replace(sTmp, " ", " ")
sTmp = Replace(sTmp, " ", " ")
sTmp = Replace(sTmp, " ", " ")
Debug.Print sTmp
sTmp = sTmp & vbCr & " "
Min = 999999
Max = 0
Pos = 0
For Gun = 1 To 366
sLine = Trim(findCharBetween_X(Pos, sTmp, vbCr, vbCr, False, True)) & " "
If Trim(sLine) = "" Then Exit For
Debug.Print sLine
For Vakit = 1 To 10
sVakit = Replace(Trim(findCharBetween_X(0, sLine, " ", " ", False, True, Vakit)), vbCr, "")
sVakitler(Gun, Vakit) = Trim(sVakit)
If Len(sVakit) > 5 Then Stop
' Debug.Print Gun, Vakit, sVakit,
If Gun > 1 Then
lVakitler(Gun, Vakit) = DateDiff("n", sVakitler(Gun - 1, Vakit), sVakitler(Gun, Vakit))
If Max < lVakitler(Gun, Vakit) Then Max = lVakitler(Gun, Vakit)
If Min > lVakitler(Gun, Vakit) Then Min = lVakitler(Gun, Vakit)
' Debug.Print sVakitler(Gun - 1, Vakit), sVakitler(Gun, Vakit), lVakitler(Gun, Vakit), Min, Max,
End If
' Debug.Print
Next
Next
Open App.Path & "\_OUTPUT_40bit.TXT" For Output As #1
sTmp = sVakitler(1, 1) & " " & sVakitler(1, 5) & " " & sVakitler(1, 6) & " " & sVakitler(1, 9) & " " & sVakitler(1, 10)
Print #1, sTmp
Debug.Print sTmp
For Gun = 2 To 366
sTmp = lVakitler(Gun, 1) & " " & lVakitler(Gun, 5) & " " & lVakitler(Gun, 6) & " " & lVakitler(Gun, 9) & " " & lVakitler(Gun, 10)
Print #1, sTmp
Debug.Print sTmp
Next
Close #1
Open App.Path & "\_OUTPUT_16bit.TXT" For Output As #1
sTmp = sVakitler(1, 1) & " " & sVakitler(1, 5) & " " & sVakitler(1, 6) & " " & sVakitler(1, 9) & " " & sVakitler(1, 10)
Print #1, sTmp
Debug.Print sTmp
' Max zaman farkı +-2 dakika ---> 16 bit integerda üç bit bir zaman için -3 +4 değer aralığında
For Gun = 2 To 366
sTmp = lVakitler(Gun, 1) & " " & lVakitler(Gun, 5) & " " & lVakitler(Gun, 6) & " " & lVakitler(Gun, 9) & " " & lVakitler(Gun, 10)
If Trim(lVakitler(Gun, 1)) = "" Then Exit For
lTmp = (lVakitler(Gun, 1) + 3) * 2 ^ 0 + _
(lVakitler(Gun, 5) + 3) * 2 ^ 3 + _
(lVakitler(Gun, 6) + 3) * 2 ^ 6 + _
(lVakitler(Gun, 9) + 3) * 2 ^ 9 + _
(lVakitler(Gun, 10) + 3) * 2 ^ 12
Debug.Print lTmp, sTmp
Print #1, lTmp
Debug.Print sTmp
Next
Close #1
Stop
End Sub
hocam ezan vakitleri arası için 128dk yetmiyor sabah namazı haziranda 3:48 iken ocakta 6:52 arada 3 saat fark var 180dk eder ben orada takıldım umarım sizde öyle yapmamışsınızdır. böyle olunca 1 byte'a sığmıyor tek vakit.
X-Fi Hocam,
Zaman farkı olarak 21 aralık ile 21 haziran farkına bakmıyoruz.. Bir gün öncesinin farkına bakıyoruz. Bu farkta -2 ile +2 arasında.. 3 bite bile sığabiliyor. hesabı kolay olsun diye -3=0 , 0=3, +4=7 olacak şeklinde yapmaya çalıştım. Eşitlikteki ilk sayılar zaman farkı, ikinci sayılar buna karşılık üretilen değer..
Yani 31 aralık için 5*365 kere toplama yapılmalı..
vb6 kullanıyormusun bilmiyorum..
Eğer yüklü ise kodu bir dene.. her vakite göre 1 byte ve güne iki byte olacak şekilde iki tablo oluşturmaya çalıştım. giriş dosyası olarak , ilk mesajdaki alp-tr.txt' i kullanıyor.
06:52 13:22 15:48 18:09 19:33
0 0 1 1 0
0 1 1 1 1
0 0 1 1 1
0 1 1 0 1
0 0 0 1 1
1 0 1 1 0
0 1 1 1 1
0 0 1 1 1
0 1 1 1 1
0 0 1 1 1
0 1 1 1 1
-1 0 1 1 1
0 0 0 1 0
gibi yada
06:52 13:22 15:48 18:09 19:33
14619
18723
18715
18211
18651
gibi dosya oluşturuyor.
Hocam yeni makro geldi link aşağıda. Söylediğiniz gibi 3 bitlik şifreledim oldu yine notpad de makro ile tablo oluşturdum tabi notpad in işlem yapma kabiliyeti olmadığı için işlemi derleyiciye yaptırıyorum elde etmek istediğim sonucu satırlara formül olarak yazdım tablonun görüntüsü biraz karışık dursada hitech ve C derleyicileri formülü çözüp 2byte değeri rom a yerleştiriyor. VB bilmediğim için böyle yapıyorum. (inş. birgün öğreneceğim)
Ben ilk referans alınacak üst vakitleri her ayın 1. günü olarak kabul ettim. DS13xx serisi rtc lerde yıllık gün sayacı yok, onun için ay günü tabloları gerekecekti. Bide 29 şubat olayı var bu yüzden hesaplamayı aylık yaptım. 16F 18F kullanıcıları içinde sıkıntı olabilir diye düşündüm.
Günlük ezan vakitleri 2 byte da tutuluyor tabloda const unsigned int olarak tanıtıldı 12x35x2=840 Byte ile 1 yıllık vakitleri artık saklayabiliyorum.
const unsigned int tablo_2011[12][35] = {
/* ŞEHİR : Ödemiş / Türkiye
PARALEL : 38.22° KUZEY
MERİDYEN : 27.97° DOĞU
SAAT FARKI : +2.00
TARİH : Ocak 2011
YAZ SAATİ : Var
KIBLE AÇISI : 145.3°
PUSULA SAPMASI : 4.3°
İMSK ÖĞLE İKND AKŞM YATSI
--- ---- ---- ---- ---- */
{
648,1318,1546,1806,1930,
((648)-(648)&7)|(((1319)-(1318)&7)<<3)|(((1546)-(1546)&7)<<6)|(((1807)-(1806)&7)<<9)|(((1930)-(1930)&7)<<12),
((649)-(648)&7)|(((1319)-(1319)&7)<<3)|(((1547)-(1546)&7)<<6)|(((1808)-(1807)&7)<<9)|(((1931)-(1930)&7)<<12),
((649)-(649)&7)|(((1320)-(1319)&7)<<3)|(((1548)-(1547)&7)<<6)|(((1809)-(1808)&7)<<9)|(((1932)-(1931)&7)<<12),
((649)-(649)&7)|(((1320)-(1320)&7)<<3)|(((1549)-(1548)&7)<<6)|(((1810)-(1809)&7)<<9)|(((1933)-(1932)&7)<<12),
((649)-(649)&7)|(((1321)-(1320)&7)<<3)|(((1550)-(1549)&7)<<6)|(((1811)-(1810)&7)<<9)|(((1934)-(1933)&7)<<12),
.
.
.
}, // ay sonu
}; // tablo sonu
Tablonun Kullanımı:
/*******************************************************************************/
/********************************* Kullanımı *************************************/
/*******************************************************************************/
volatile unsigned int vakit_buffer[5];
void vakit_oku(unsigned int yil,unsigned char ay,unsigned char ay_gun)
{
unsigned int vakitler;
unsigned char v,i,kont;
vakit_buffer[0]=tablo_2011[ay-1][0];
vakit_buffer[1]=tablo_2011[ay-1][1];
vakit_buffer[2]=tablo_2011[ay-1][2];
vakit_buffer[3]=tablo_2011[ay-1][3];
vakit_buffer[4]=tablo_2011[ay-1][4];
for(i=1;i<ay_gun;i++){
switch (yil){
case 2011:vakitler=tablo_2011[ay-1][i+4];break;
case 2012:vakitler=tablo_2012[ay-1][i+4];break;
case 2013:vakitler=tablo_2013[ay-1][i+4];break;
case 2014:vakitler=tablo_2014[ay-1][i+4];break;
case 2015:vakitler=tablo_2015[ay-1][i+4];break;
case 2016:vakitler=tablo_2016[ay-1][i+4];break;
case 2017:vakitler=tablo_2017[ay-1][i+4];break;
case 2018:vakitler=tablo_2018[ay-1][i+4];break;
case 2019:vakitler=tablo_2019[ay-1][i+4];break;
case 2020:vakitler=tablo_2020[ay-1][i+4];break;
default:vakitler=0;break;
}
for(v=0;v<5;v++){
kont=(unsigned char)(vakitler>>(3*v))&0x0007;
if(kont){
if(kont==1)vakit_buffer[v]+=1;
if(kont==2)vakit_buffer[v]+=2;
if(kont==3)vakit_buffer[v]+=3;
if(kont==4)vakit_buffer[v]+=4;
if(kont==5)vakit_buffer[v]-=3;
if(kont==6)vakit_buffer[v]-=2;
if(kont==7)vakit_buffer[v]-=1;
if((vakit_buffer[v]%100)>=97)
vakit_buffer[v]-=40;
if((vakit_buffer[v]%100)>=60){
vakit_buffer[v]-=60;
vakit_buffer[v]+=100;
}
}
}
}
}
/*********************************************************************************/
// 20/nisan/2011 vakitlerini okur
vakit_oku(2011,4,20);
//sonuçlar vakit_buffer dizisinde decimal olarak saklanır:
vakit_buffer[0]; /* sabah */
vakit_buffer[1]; /* ogle */
vakit_buffer[2]; /* ikindi*/
vakit_buffer[3]; /* Aksam */
vakit_buffer[4]; /* Yatsı */
//örnek;
sprintf(ekran,"Sabah: %02d:%02d",vakit_buffer[0]/100,vakit_buffer[0]%100);
lcd_yaz(ekran);
//veya
ks0108_text(10,10,ekran,1,1);
/*********************************************************************************/
Makro_V2 link:
http://www.fileserve.com/file/m7YmZja
hayır değerler sabit ben C# bilmiyorum sorun orda ama makro ile halloldu 2sn de çeviriyor.
buradan imsak,öğle,ikindi,akşam,yatsı verilerini alıp benim yaptığım gibi formülden geçireceksin sadece.
GÜN İMSAK GÜNEŞ İŞRAK İSTİVA ÖĞLE İKİNDİ ASR-I İSFİRAR AKŞAM YATSI
SANİ
--- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
1. 06:48 08:18 09:10 12:24 13:18 15:46 16:24 17:23 18:06 19:30
2. 06:48 08:18 09:10 12:25 13:19 15:46 16:25 17:24 18:07 19:30
3. 06:49 08:18 09:10 12:26 13:19 15:47 16:26 17:25 18:08 19:31
güneş ışınları 21 mart ve 23 eylülde ekvatora dik gelir. bu hepinizin malumu. güneş ışınlarının dik geldiği yere bir dikme çekersek gündüz süresi uzunluğunu hesaplayabiliriz. birim çember hesaplamaları. biraz karışık bir hesaplama olur ama her noktaya ayrı ayrı ezan zamanı hesaplamak yerine koordinat düzlemine göre 0;0 olan yeri baz alarak ve biraz da geometri kullanarak ayrıca biraz da fizik ve coğrafya konularını araştırarak bunu formüle edebilirsiniz. o zaman sadece enlem boylam değerlerini ve yerel saati verdiğiniz zaman tüm noktaların ezan saatlerini direkt hesaplayabilir. :) :D ;) :( "karışık bir durum gibi gözüküyor ama o kadar da zor değil."
elinize sağlık arkadaşlar..
Alıntı yapılan: OG - 18 Nisan 2011, 23:40:56
Koordinat tespitine yarayan VB kodu vardı elilmde, adam güzel yapmış, tüm dünya ülkelerinin ilçe ilçe koordinatlarını alabiliyorsunuz, exe haline ben getirdim,
Exe kurulum dosyası http://hotfile.com/dl/114976010/106abae/GeoMaker.exe.html (http://hotfile.com/dl/114976010/106abae/GeoMaker.exe.html)
VB source codes http://hotfile.com/dl/114950511/87a5d99/GeoMaker.rar.html (http://hotfile.com/dl/114950511/87a5d99/GeoMaker.rar.html)
Türkiye datası http://hotfile.com/dl/114976107/6171d97/TU_yedek.rar.html (http://hotfile.com/dl/114976107/6171d97/TU_yedek.rar.html)
Hocam dosyalar duruyorsa tekrar upload yapabilirmisiniz?
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=67897&lngWId=1 (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=67897&lngWId=1)
çok teşekkürler OG hocam. Birşey daha sorayım. Mesela belirli bir güzergahın koordinatlarını nasıl alabiliriz. Yapmak istedigim şey alınan gps verisinin belirli bir güzergaha ait olup olmadığı. Bu iş için google earth kullanılabilirmi?
Google Earth kullanılırmı bilmiyorum, belkide harita satın almak gerekir.
Edit,
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64958&lngWId=1 (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64958&lngWId=1)
https://www.google.com.tr/search?q=vb+google+earth (https://www.google.com.tr/search?q=vb+google+earth)