Vakitmatik projesi hakkında

Başlatan ronin_2000, 11 Nisan 2011, 22:04:08

ronin_2000

Arkadaşlar merhaba,
Uzun zamandır namaz vakitlerini otomatik hesaplatarak GLCD ekranda görüntüleme üzerine araştırmalar yaptım. Fakat işin içinde astronomik hesaplamalar olduğundan ve proton ile float sayı hesaplamalarının kısmen yanlış çıkmasından dolayı projeden vazgeçtim. ( İlgilenen varsa elimdeki tüm dökümanları yollayabilirim) Şimdi soruma gelecek olursak namazvakti adlı siteden bir yıllık namaz vakitlerini çektim. Format şu şekilde :
1 Cuma 05:04 06:42 13:18 16:52 19:34 21:01 sırasıyla İmsak    Güneş    Öğle    İkindi    Akşam    Yatsı vakitleri gösteriliyor. Bu şekildeki verileri kodun içine gömerek günün tarihine göre GLCD den nasıl çıktı alabilirim? 18f452 kullanmayı düşünüyorum. Hali hazırda çalışan saat var. Yardımcı olabilecek yol gösterebilecek arkadaşlara şimdiden teşekkür ederim.

Klein

Eğer dosyadaki formatla hiç oynamadan , doğrudan koda gömmek istersen işin zor. Ama oradaki bilgilere göre kendi formatını oluşturursan olay. Proton bilmediğim için C örneği vereceğim. Protona çevirirsiniz.

Önce matris tablo hazırlamak gerek. Tabloya saatleri dakika olarak gireceğiz. Örn: 05:36 için  (5*60)+36 = 336;
//                                                                güneş , öğle , ikindi , akşam , yatsı
const unsigned int  time_teble[365][5]={ 
                                   // YILIN İLK GNÜ      340, 550, 680, 1100, 1350,
                                                                   342,552, 680, 1102, 1352,
                                                                   .........................................,
                                   //YILIN SON GÜNÜ   ..........................................}

unsigned int manaz_vakti;
unsigned int gün;
unsigned char vakit

gün=268; // yılın 267. günü 
vakit=2 ; // ikindi vakti 
namaz_vakti = time_table[gün][vakit];
                                                                 

ronin_2000

@ Klein ilginize teşekkürler. http://www.elektrobilim.org/forum/showthread.php?t=1634&page=1 adresinde 7 segment ile yapılmış versiyonu mevcut kodları IF AY=06 THEN  IF GUN=01 THEN IMSAK=0502:GUNES=0636:OGLE=1131:IKINDI=1352:AKSAM=1615:YATSI=1741 şeklinde yazılmış. Amacım bu şekilde verileri GLCD ye aktarmak.

smyomekatronik

Esselamu Aleyküm

Uzun zaman vakitmatik projesi ile uğraştım fakat bir sonuca varamadım. Bende ikinci el java destekli bir cep telefonu aldım http://www.cepvakit.com/index.php?option=com_content&view=article&id=5&Itemid=2 linkteki programı yükleyerek 20 TL masrafla vakitmatik sahibi oldum.

ronin_2000

@ smyomekatronik
Aleyküm selam kardeşim. Amacım proton üzerinde bu tür uygulamalarla kendimi geliştirmek. Ayrıca kendi yapmış olduğun bir cihazın değeri paha biçilemez! java,js, C, C++, C#,PHP,Pyton ile yapılmış örnekler var hepsini inceledim ama bu dillerden en az birini bilmek gerektiği için yine sonuca varamadım

X-Fi

#5
klein vakitleri dakika olarak yazmanız bir avantaj sağlamıyor 336 da int bi sayı 2x8 byte dan oluşuyor aradaki ':' işaretini kaldırın 536 olarak desimal yazın 17:36 => 1736 gibi
bende böyle bir iş yapmayı düşünüyorum öncelikle tablo hazırlamayı kolaylaştırmak lazım

günde 5 vakitden her vakit 2 byte yer tutar 10 byte,  365 *10=3650 byte 1 yıllık namaz saatlerin tablo boyutudur. 18F452 de 32K flash var 5 senelik vakitleri rom da rahatlıkla tutabilir ben 18F4585 kullanacağım 48K flashı var 10 seneyi yazabilmeyi düşünüyorum.

Tablo hazırlamada işin incelikleri hakkındada biraz bilgi verebilirim. Notepad++ buldum kurdum kesinlikle her derde deva bir program

Alperen ile yıllık takvimi hesaplattım .txt olarak çıktı alıyorsunuz değiştirme özelliğini kullanarak önce ':' işaretini ve başında 0 olan (sabah namaz vakitlerinde var) vakitleri ilk karakter boşluk sonrası 0 ise değiştir mantığıyla onlarıda sildim. en çok işime yarayan özelliği ise klavyeden yaptığınız hareketleri kaydedip bunu hızlıca istediğiniz kadar yaptırabilmeniz tek satır için yaptığım değişikliği 365 satırada tek tuşla uyguladım yıllık tablom hazır C için hazırladığım örneğini aşşağıda ekliyorum proton içinde aynı yöntemle kolayca hazırlanabilir.

const unsigned int tablo_2011[365][5]={

           553,1210,1534,1815,1920,
           553,1211,1535,1815,1920,
           554,1211,1535,1816,1920,
           554,1212,1535,1816,1921,
           555,1212,1536,1817,1921,
           555,1213,1536,1817,1922,
           555,1213,1537,1818,1922,
           556,1214,1537,1818,1922,
           556,1214,1537,1818,1923,
           557,1214,1538,1819,1923,
           557,1215,1538,1819,1923,
           558,1215,1538,1820,1924,
           558,1216,1539,1820,1924,
           558,1216,1539,1820,1924,
           559,1216,1539,1821,1924,
           559,1217,1539,1821,1925,
           559,1217,1540,1821,1925,
           600,1217,1540,1822,1925,
           600,1218,1540,1822,1925,
           600,1218,1540,1822,1926,
		   .
		   .
		   . 
		   };
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

ronin_2000

@ X-Fi, yönteminiz gayet mantıklı görünüyor.
Keşke bir arkadaşta bu kodları protona nasıl uyarlayabilirim bir yol gösterse  :( Tablo hazırlamasına hazırlarım ama günün tarihine göre lcd ye nasıl aktarırım?

sezgin05

Bu konuyla ticari anlamda uğraşmak isteyenler benimle irtibata geçebilirler.

Maxim

@ronin_2000
proje ile ilgili değil ama ben başka birşey merak ettim

" proton ile float sayı hesaplamalarının kısmen yanlış çıkmasından dolayı "
demişsin,

bana bir örnek verirmisin hatalı float sonucu ile ilgili,
gerçekten merak ediyorum, birkaç kişi daha söyledi bunu
ama ben bugüne kadar hiç hataya rastlamadım, varsa öğrenmek istiyorum .

ronin_2000

@ Maxim
Eve gittiğim zaman kodları verebilirim.  Matlab ile hesapladığım doğru sonuçlar da mevcut. Çok büyük fark yok ama yine bir sonuç diğerlerini etkiliyor. Large format kullandığım halde işin içinden çıkmamadım. 18 gibi kodları eklerim.

ronin_2000

#10
@ maxim

Include "PROTON18_G4.INT" 
Declare Float_Display_Type = Large  ' Define LARGE floating point Math Operations for more Accuracy
Cls
DelayMS 300
'---------------Variables--------------------------------------------------------- 

Dim TimeZone    As Byte
Dim Dhuhr       As Word


Dim jd       As Float    'Julian date 
Dim D        As Float    'declination of the Sun
Dim D1       As Float
Dim g        As Float
Dim g1       As Float
Dim q        As Float
Dim L        As Float
Dim L1       As Float
Dim L2       As Float
Dim L3       As Float
Dim L4       As Float
Dim R         As Float
Dim R1        As Float
Dim R2        As Float
Dim R3        As Float
Dim R4        As Float
Dim E         As Float
Dim ra        As Float
Dim ra1       As Float
Dim ra2       As Float
Dim ra3       As Float

Dim EqT         As Float   'equation of time
Dim Lng         As Float

'-------------------------------------------------------------------------------
'   d = jd - 2451545.0;  // jd is the given Julian date 

'   g = 357.529 + 0.98560028* d;

'   q = 280.459 + 0.98564736* d;

'   L = q + 1.915* sin(g) + 0.020* sin(2*g);

'   R = 1.00014 - 0.01671* cos(g) - 0.00014* cos(2*g);

'   e = 23.439 - 0.00000036* d;

'   RA = arctan2(cos(e)* sin(L), cos(L))/ 15;

'   D = arcsin(sin(e)* sin(L));  // declination of the Sun

'   EqT = q/15 - RA;  // equation of time
'-------------------------------------------------------------------------------

   jd = 2455660.16463

   D = jd - 2451545  ' jd is the given Julian date  4115,16463
   
   D = 4115.16463
    
'-------------------------------------------------------------------------------      
   g = 0.98560028 * D
 
   g = 357.529 + g 
 
   g1 = 2 * g

   q = 280459 + ( 985.64736 * D )
   
'-------------------------------------------------------------------------------  
   'L = q + ( 1.915* Sin g ) + ( 0.020* Sin g1 )
   
   L1 =  Sin g 
   
   L2 = L1 * 1915
   
   L3 = L2 + q 
   
   L4 = 20 * Sin g1 
   
   L = L3 + L4
   
   L = L / 1000
   
'-------------------------------------------------------------------------------   
'   R = 1.00014 - 0.01671* cos(g) - 0.00014* cos(2*g);
   
   R1 = 1671 * Cos g 

   R2 = 100014 - R1
   
   R3 = 14 * Cos g1   
   
   R =  R2 - R3
   
'-------------------------------------------------------------------------------     
   'E = 23.439 - 0.00000036* D;
   
   E = 0.00000036 * D
   
   E = 23.439 - E
'-------------------------------------------------------------------------------     
 ' ra = arctan2 [Cos E * Sin L] / Cos L )/ 15
 
   ra1 = Cos E * Sin L
   
   ra2 = ra1 / Cos L
   
   ra3 = ATan ra2
   
   ra = ra3 * 1 / 15
'-------------------------------------------------------------------------------  
 '   D = arcsin(sin(e)* sin(L));  // declination of the Sun
 
   D1 = ASIn E * Sin L
   
   D = ASIn D1 ' Load the variable
  
   q = q / 1000 
   
   EqT = ( q / 15 ) - ra
   
   TimeZone = 3
   
   R = R / 100000
   
   Lng      =  37.4645

   Dhuhr = 12 + TimeZone
   
   Dhuhr = Dhuhr - Lng
   
   Dhuhr = Dhuhr / 15  
   
   Dhuhr = Dhuhr - EqT
'-------------------------------------------------------------------------------  
 
Print At 0,0, "D     = ", Dec6 D
Print At 1,0, "g     = ", Dec6 g   
Print At 2,0, "q     = ", Dec6 q  
Print At 3,0, "L     = ", Dec6 L
Print At 4,0, "R     = ", Dec6 R  
Print At 5,0, "E     = ", Dec6 E
Print At 6,0, "ra    = ", Dec6 ra
Print At 7,0, "EqT   = ", Dec6 EqT


'---------------Include---------------------------------------------------------
Include "font.inc"


Proton sonuçlar :
D = -0.048554
g = 4413.436859
q = 4336.560428
L = 4337.462723
R = 1.014721
E = 23.437518
ra = 0.028249
EqT = 289.075769
Dhuhr =04078

Matlab sonuçlar :
D = -1.061
g = 4413.436411
q = 4336.560153
L = 4337.463525
R = 1.014719
E = 23.437518
ra = -0.1943700
EqT = 289.020

Dhuhr =276.517 <- öğle vakti bunun yaklaşık 13:10 gibi bir değer çıkması lazım sanırım. Çevirmemi yapmamız gerekebilir, bilemiyorum.
Öğle vaktini doğru olarak bulduktan sonra diğerlerini bulmak çok kolay.

Not : declination of the Sun hesabında yanlışlık olabilir arcsin fonksiyonu ASIn olarak çıkıyor??

Hesaplamalarla ilgili geniş kaynak http://praytimes.org/calculation

Maxim

hocam kodlar ağırmış baya  :)

şimdi şöyle birşey fark ettim .
2 matematik fonksiyonu aynı satırda kullanırsak farklı sonuç çıkıyor
inceleyiniz .

'ra1 = Cos E * Sin L
Temp = Cos E
Temp1 = Sin L
ra1 = Temp * Temp1

ve

'D1 = ASIn E * Sin L
Temp = ASIn E
Temp1 = Sin L
D1 = Temp * Temp1


birde ağır float fonksiyonları için şöyle bir açıklama buldum
bu yazıyı iyi ingilizcesi olan bir arkadaş okuyabilirmi ?
açıklanan şey tüm işlemcilere ait bir kusurmu? yoksa diğer derleyicilerde de aynı float işlemlerinde sıkıntı varmı ?
sonucu merak ediyorum .
http://wiki.picbasic.org/index.php?n=FloatingPoint.Other


ronin_2000

Verdiğiniz sayfayı daha önce gördüm ve okudum özet geçecek olursak virgüllerden kurtulmamız gerektiğini söylüyor.  ;D Kodlara bakarsanız bende biraz da olsa virgüllerden kurtulmaya çalıştım ama nafile? yönteminizi deneyeceğim sonucu yazarım.  Bu arada şu tablodan verileri alma olayına gelsek Lookup mı kullanacağız? Nasıl olacak? İyi bilen bir arkadaş anlatabilir mi?

Maxim

yani kıvırıyorlarmı? yoksa diğer derleyicilerde aynı sıkıntı varmı ?
hi-tech çi bir arkadaş denese şu kodları

ronin_2000

' ra = arctan2 [Cos E * Sin L] / Cos L )/ 15
 
Temp  = Cos E
Temp1 = Sin L
Temp2 = Cos L

ra1 = Temp * Temp1

ra2 = ra1 / Temp2
   
ra3 = ATan ra2
   
ra = ra3 * 1 / 15


Bu şekilde denedim sonuç : 0.015101
Çıkması gereken sonuç : -0.1943700

Ayrıca float fazla büyük gelmişki banka sığmamış  :o FLOAT Variable 'RA' Crossing ACCESS Bank boundary uyarısı alıyorum.  ::)