شرح الكود
من يشكل عليه شيء أرجو ان لايمتنع عن الاستفسار
على بركة الله نبدا :
تعريف المتغيرات التي نحتاجها خلال البرنامج وسترى استخدام كل متغير في مكانه المناسب
كود:
dim y ,L1 as longint
dim D,L,ty,Lambda,Obliquity ,Alpha,ST,Dec1,noon, utnoon,dhrtime,asrtime,asralt,durinalarc,marbtime,EshaArc,M,eshatime,fajrtime,shroq ,ard,tol as float
i ,farq as byte
day,month_,dhr,dhr1,asr,asr1,fjr,fjr1,marb,marb1,esha,esha1 as byte
dim x,x1 as byte[48]
تعريف دالة حساب اوقات الصلاة والتي تعتبر العمود الفقري للمشروع علما ان المعادلات الفلكية كتبها الاستاذ محمد مجدي جزاه الله خيرا
كود:
sub procedure awqat()
كود:
ard=36.334
tol=43.2
farq=3
المتغير ard يمثل خط العرض للمدينة التي تريد حساب أوقات الصلاة لها
المتغير tol يمثل خط الطول
المتغير farq يمثل فرق التوقيت العالمي لبلدك يعني فرقه عن توقيت غيرنتش
مع العم أن البيانات المدخلة أعلاه هي لمدينة الموصل الحدباء
****************************8
العناصر المطلوبة لحساب أوقات الصلاة
نحسب اليوم الجوليانى ورمزه D من المعادلة :
D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)
مع ملاحظة أن Y = Year = العام
و M = Month = الشهر
و d= Day = اليوم
مع العلم أن اليوم والشهر والسنة يتم قراءتها من ds1307
الدالة INT تعني تقريب الرقم إلى أقرب عدد صحيح وهذه الدالة تقابلها في المايكرو بيسك (Floor) لذا سيكون كود حساب اليوم الجولياني كالتالي:
كود:
D=((367*y)-(floor((1.75)*(y+floor((month_+9)/12))))+floor(275*(month_/9))+day-730531.5)
نحسب طول الشمس الوسطى ورمزه L من المعادلة
L = 280.461+0.9856474*D
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360°
ملاحظة مهمة جدا : لكي نجعل L لا يقل أو يزيد عن 360° نقوم بالخطوات التالية:
1- بما ان L عدد عشري لذلك نفصل الجزء الصحيح عن الجزء العشري
أفرض أن 389.123456L=
نعرف متغيرا وسطيا لنخن فيه الجزء الصحيح
L1=L
إذن L1 أصبحث تساوي 389
نخزن الجزء العشري في المتغير L
L=L-L1
L=389.123456-389
L=0.123456
ألآن فصلنا الجزء العشري عن الجزء الصحيح ننتقل للخطوة الثانية
2- نقسم الجزء الصحيح على 360 ونأخذ باقي القسمة
مع العلم أن الدالة التي تقوم بإرجاع باقي القسمة هي MOD
لذلك نكتب
L1=L1 mod 360
الناتج L1=29
3- نجمع ناتج باقي القسمة (L1) مع الجزء العشري (L) لكي نحصل على الناتج المطلوب
كما في الكود أدناه
كود:
L=280.461+0.9856474*D
L1=L
L=L-L1
L1=L1 mod 360
L=L1+L
لو عدنا الى بداية البرنامج (أسطر التعربفات ) نجد أن المتغير L1 من النوع longint وهذا يعني أنه لا يقبل الفارزة العائمة وعليه لو اسندنا اليه رقم به فارزة عائمة فإنه سياخذ الجزء الصحيح ويهمل الجزء العشري
وقد ستفدت من هذه الخاصية في الفصل بين الجزء الصحيح والعشري ... أرجو الانتباه
***********
ثم نحسب حصة الشمس الوسطى ورمزه M من المعادلة
M = 357.528+0.9856003*D
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° كما وضحت سابقا
وعليه يكون الكود :
كود:
M = 357.528+0.9856003*D
L1=M
M=M-L1
L1=L1 mod 360
M=L1+M
****************8
ثم نحسب طول الشمس البروجى ورمزه Lambda من المعادلة
(Lambda = L +1.915*SIN(M)+0.02*SIN(2*M
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° كما وضحت سابقا
كود:
Lambda = L+1.915*sin(M*PI/180)+0.02*sin(2*M*PI/180) L1=Lambda
Lambda =Lambda-L1
L1=L1 mod 360
Lambda =L1+Lambda
ملاحظة مهمة :جميع الدوال الدائرية مثل دالة جيب تمام الزاوية (cos)وظل الزاوية (tan)في لغة المايكروبيسك تحسب بنظام ريدين أما الميل فإنه بنظام الدرجات لذلك يجب أن نحوله من نظام الدرجات الى ريدين وذلك بأن نضربه في PI /180
أما دالة معكوس ظل الزاوية (Atan) فإنها تعطي النتائج بنظام ريدين لذلك يجب تحويلها الى درجات وذلك بظربها في 180/PI
***************************
ثم نحسب ميل دائرة البروج ورمزها Obliquity من المعادلة
Obliquity = 23.439-0.0000004*D
كالتالي
كود:
Obliquity = 23.439-0.0000004*D
********************
ثم نحسب المطلع المستقيم ورمزه Alpha من المعادلة
((Alpha =ATAN (COS(Obliquity)*TAN(Lambda
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° بالمعادلة
(Alpha = Alpha - (360*INT(Alpha /360
أكرر الملاحظة:جميع الدوال الدائرية مثل دالة جيب تمام الزاوية (cos)وظل الزاوية (tan)في لغة المايكروبيسك تحسب بنظام ريدين أما الميل فإنه بنظام الدرجات لذلك يجب أن نحوله من نظام الدرجات الى ريدين وذلك بأن نضربه في PI /180
أما معكوس الدوال الدائرية مثل دالة معكوس ظل الزاوية (Atan) أو معكوس جيب الزاوية (asin)فإنها تعطي النتائج بنظام ريدين لذلك يجب تحويلها الى درجات وذلك بظربها في 180/PI
ا
كود:
Alpha=atan(cos(Obliquity *PI/180)*tan(Lambda*PI/180))*180/PI
Alpha=Alpha-(360*floor(Alpha/360))
ثم نعدل المطلع المستقيم بامعادلة التالية :
Alpha = Alpha + 90 * ( TRUNC ( Alpha / 90
- (
TRUNC(Alpha / 90))
كالتالي
كود:
Alpha=Alpha+90*(floor(Lambda/90)-floor(Alpha/90))
***************
نحسب الزمن النجمى ورمزه ST بالدرجات الزاوية من المعادلة
ST =100.46 + 0.985647352 *D
كود:
ST=100.46 + 0.985647352 *D
L1=ST
ST=ST-L1
L1=L1 mod 360
ST=L1+ST
******************
ثم نحسب ميل الشمس الزاوى ورمزه Decمن المعادلة
((Dec =ASIN(SIN (Obliquity )*SIN(Lambda
كود:
Dec1=asin(sin(Obliquity*PI/180)*sin(Lambda*PI/180))*180/PI
****************
نحسب زوال الشمس الوسطى noon من المعادلة
Noon = Alpha - ST
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360°
مع الأخذ بنظر الاعتبار أنه في بعض الحالات تكون نتيجة noon بإشارة سالبة لذلك يجب أن نلغي هذه الإشارة باستخدام دالة القيمة المطلقة fabs
كود:
noon=Alpha-ST
if noon>=0 then
noon=fabs(noon)
L1=fabs(noon)
noon=noon-L1
L1=L1 mod 360
noon=noon+L1
else
noon=fabs(noon)
L1=fabs(noon)
noon=noon-L1
L1=L1 mod 360
noon=noon+L1
noon=360-noon
end if
*********************
ثم الزوالى العالمى UT Noonمن المعادلة
UT Noon = Noon - tol
حيث أن tolهو خط الطول الجغرافى للمكان كما ذكرنا سابقا
*********************
ثم الزوال المحلى Local Noonبالمعادلة وهو وقت صلاة الظهر
dhrtime = UT Noon /15 + farq
حيث أن farqهو فرق التوقيت العالمى كما تمت الاشارة اليه من قبل
الى هنا توصلنا الى حساب وقت صلاة الظهر الذي يعتبر أهم الأوقات حيث أن بقية الأوقات يتم حسابها بالإعتماد عليه كما سترى قريبا
لو اطلعنا على وقت صلاة الظهر المحسوب بالمعادلة أعلاه نجده عبارة عن رقم عشري لذلك يجب أن نحولها الى ساعات ودقائق وثواني
طريقة التحويل كالتالي
1- أفرض أن dhrtime=12.14364
الجزء الصحيح الذي هو (12) يمثل الساعات
وللحصول على الدقائق نضرب الجزء العشري في 60
0.14364*60 =8.6184
نأخذ الجزء الصحيح الذي هو (8) ونهمل الكسر وبذلك نكون قد حصلنا على الدقائق
أي ان وقت الظهر
12:08
أرجو الانتباه الى هذه الملاحظة لأننا سنحتاجها خمس مرات لماذ ؟؟
كود:
dhrtime=(utnoon/15)+farq
dhr1=dhrtime
dhrtime=dhrtime-dhr1
dhr=floor(dhrtime*60)
حيث dhr1 تمثل الساعات
و dhr تمثل الدقائق
فيكون الوقت dhr1:dhr
******************
نحسب وقت صلاة العصر الأول وهو المذهب الشافعى " وهو معمول به فى كثير من الأقطار "
نحسب إرتفاع الشمس لوقت صلاة العصر Asr Altمن المعادلة
((Asr Alt = ATAN (1+ TAN( ard- Dec
حيث أن ardهو خط العرض الجغرافى
و Dec هو ميل الشمس الزاوي
كود:
asralt=atan(1+tan((ard-Dec1)*PI/180))*180/PI
*************************
ثم نحسب قوس الدائر أى الوقت المتبقى من وقت الظهر حتى صلاة العصر قوس العصر Asr Arc من المعادلة :
Asr Arc =ACOS ((SIN(90- Asr Alt )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))
الناتج هنا بالدرجات الزاوية يحول لزمن بالقسمة على 15
Asr Arc = Asr / 15
فيكون وقت صلاة العصر Asr Time من المعادلة
Asr Time = Local Noon + Asr Arc
ولا تنسى أننا سنقوم بتحويل الرقم الى صيغة الوقت ساعات ودقائق كما اشرت عليه عند حساب وقت صلاة الظهر
كود:
asrtime=acos((sin((90-asralt)*PI/180)-sin(Dec1*PI/180)*sin(ard*PI/180))/(COS(Dec1*PI/180)*COS(ard*PI/180)))*180/PI
asrtime=(asrtime/15)+dhrtime
asr1=asrtime
asrtime=asrtime-asr1
asr=floor(asrtime*60)
حيث asr1 تمثل الساعات
و asr تمثل الدقائق فيكون الوقت asr1:asr
******************************
نحسب نصف قوس النهار Durinal Arcمن المعادلة
Durinal Arc=ACOS ((SIN(-0.8333 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))
كود:
durinalarc=acos((SIN(-0.8333*PI/180)-SIN(Dec1*PI/180)*SIN(ard*PI/180))/(COS(Dec1*PI/180)*COS(ard*PI/180)))*180/PI
****************************
وقت الشروق Sun Rise
(Sun Rise = Local Noon - (Durinal Arc / 15
كود:
shroq=dhrtime-durinalarc/15
*****************************
وقت الغروب Sun Set
(Sun Set = Local Noon + (Durinal Arc /15
كود:
marbtime=dhrtime+durinalarc/15
marb1=marbtime
marbtime=marbtime-marb1
marb=floor(marbtime*60
********************************
نحسب وقت صلاة العشاء من المعادلة
اولا نحسب فضل الدائرة وهو الوقت المتبقى من وقت صلاة الظهر إلى وقت العشاء Esha Arc
Esha Arc = ACOS ((SIN(-18 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))
فيكون وقت صلاة العشاء Esha Time
(Esha Time = Local Noon +( Esha Arc /15
كود:
EshaArc= acos((SIN(-18*PI/180)-SIN(Dec1*PI/180)*SIN(ard*PI/180))/(COS(Dec1*PI/180)*COS(ard*PI/180)))*180/PI
eshatime=dhrtime+EshaArc/15
esha1=eshatime
eshatime=eshatime-esha1
esha=floor(eshatime*60)
*******************************
نحسب وقت صلاة الفجر من المعادلة
أولا نحسب فضل دائر الفجر وهو الوقت المتبقى من وقت صلاة الفجر حتى وقت صلاة الظهر Fajr Arc
Fajr Arc = ACOS ((SIN(-18 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))
فيكون وقت صلاة الفجر Fajr Time
(Fajr Time = Local Noon – (Fajr Arc /15
كود:
fajrtime=dhrtime-EshaArc/15
fjr1=fajrtime
fajrtime=fajrtime-fjr1
fjr=floor(fajrtime*60
وبذلك نكون قد تمكنا من حساب اوقات الصلوات الخمس
وصار عندنا لكل صلاة متغيرين أحدهما للساعات والآخر للدقائق
مع العلم أن الساعات هي بنمط 24 ساعة لذلك يجب تحويلها الى نظام 12 ساعة
بالكود التالي
كود:
if asr1>12 then asr1=asr1-12 end if if marb1>12 then marb1=marb1-12 end if if esha1>12 then esha1=esha1-12 end if
لاحظ اننا استخدمنا صلاة العصر والمغرب والعشاء فقط .... اكيد الأمر واضح لأنها أوقاتها بعد الظهر وسيظهر أثر نظام 24 ساعة عليها فقط
*****
الآن يجب علينا أن نحول كل متغير من هذه المتغيرات الى نظام Bcd
لماذ؟
لاننا استخدمنا الآي سي 7447 والذي يحول الرقم من نظام Bcd ليصبح جاهزا للعرض على السفن سكمنت
لذلك كتبت الكود التالي
كود:
dhr=dec2bcd(dhr)
dhr1=dec2bcd(dhr1)
fjr=dec2bcd(fjr)
fjr1=dec2bcd(fjr1
asr=dec2bcd(asr)
asr1=dec2bcd(asr1)
marb=dec2bcd(marb)
marb1=dec2bcd(marb1)
esha=dec2bcd(esha)
esha1=dec2bcd(esha1)
أخيرا نهاية الدالة
سأكمل توضيح البرنامج قريبا إن شاء الله
ارجو ان يكون الشرح واضحا
من لديه اي استفسار فليتفضل به ....
جزاكم الله خيرا